이전 커밋을 체크 아웃하고 수정을 한 다음 git commit --amend
을 사용하여 커밋하면 어떻게 될지 이해할 수 없습니다.git으로 오래된 커밋을 수정하면 어떻게됩니까?
변경 사항이 자동으로 향후 커밋에 적용됩니까? 어떻게 작동합니까?
이전 커밋을 체크 아웃하고 수정을 한 다음 git commit --amend
을 사용하여 커밋하면 어떻게 될지 이해할 수 없습니다.git으로 오래된 커밋을 수정하면 어떻게됩니까?
변경 사항이 자동으로 향후 커밋에 적용됩니까? 어떻게 작동합니까?
git에서 커밋은 단지 객체입니다. git commit --amend
때, 당신은 단지 같은 부모와 새로운 커밋을 만들고있어. 처음에 그것은 다음과 같습니다
{HEAD}
{master}
---[A]---[B]---[C]
지금 새가
D
커밋 만들어
C
를 수정 :
{HEAD}
{master}
---[A]---[B]---[D]
\
\
[C]
이전 C
이 순간이 아직도있다. 그러나 더 이상 분기에 의해 참조되지 않으므로 다음에 가비지 콜렉션이 발생하면 제거됩니다.
새로운 커밋은 이전 커밋과 동일한 상위 항목으로 만들어지며 현재 분기는 이제 새 커밋을 참조합니다. 이전 커밋은 여전히 객체 데이터베이스에 있으며 git reflog
으로 찾을 수 있습니다.
존의 대답을 보완하기 위해 오래된 커밋을 받아 들인다면 아무런 변화가 없습니다.
old commit
v
o--o--o--o--o--o--o--o--o < original branch tip
\
o < ammended old commit & new branch tip
어쩌면 무엇을하고 싶은지는 interactive rebase that squashes commits으로 해결할 수 있습니다.
가비지 컬렉션은'git gc'에 의해 수행됩니다. git gc는 주기적으로 실행되어 정리 작업이 필요하다고 결정할 때 수동으로 실행할 수 있습니다. 일반적으로 느슨한 객체는 최소 2 주 이상 지난 경우에만 정리됩니다. 결론은 당신이 그것을 깨닫기 위해 한 달이 걸리지 않는 한'D'가 당신이 원하는 것이 아니라고 결정하면 오래된'C'를 되 찾을 수 있다는 것입니다. – Cascabel
@ Jefromi : +1, 도움이되는 추가에 감사드립니다. "가비지 콜렉션"은 일반적으로 대부분의 사람들에게 매우 짧은 시간 틀을 의미하므로, 힘내에서 거의 항상 "할 수 없다"라고 말할 수 있습니다. –
아, 알겠습니다. 실제로 git은 'detached commit ...'메시지를 표시했는데, 이는 다음 가비지 콜렉션에서 내 변경 사항이 사라질 것임을 의미합니다. 그건 정말 위험합니다 ... –