2010-04-28 4 views

답변

4

git에서 커밋은 단지 객체입니다. git commit --amend 때, 당신은 단지 같은 부모와 새로운 커밋을 만들고있어. 처음에 그것은 다음과 같습니다

    {HEAD} 
        {master} 
---[A]---[B]---[C] 

지금 새가 D 커밋 만들어 C를 수정 :

    {HEAD} 
        {master} 
---[A]---[B]---[D] 
      \ 
      \ 
       [C] 

이전 C이 순간이 아직도있다. 그러나 더 이상 분기에 의해 참조되지 않으므로 다음에 가비지 콜렉션이 발생하면 제거됩니다.

+2

가비지 컬렉션은'git gc'에 의해 수행됩니다. git gc는 주기적으로 실행되어 정리 작업이 필요하다고 결정할 때 수동으로 실행할 수 있습니다. 일반적으로 느슨한 객체는 최소 2 주 이상 지난 경우에만 정리됩니다. 결론은 당신이 그것을 깨닫기 위해 한 달이 걸리지 않는 한'D'가 당신이 원하는 것이 아니라고 결정하면 오래된'C'를 되 찾을 수 있다는 것입니다. – Cascabel

+1

@ Jefromi : +1, 도움이되는 추가에 감사드립니다. "가비지 콜렉션"은 일반적으로 대부분의 사람들에게 매우 짧은 시간 틀을 의미하므로, 힘내에서 거의 항상 "할 수 없다"라고 말할 수 있습니다. –

+0

아, 알겠습니다. 실제로 git은 'detached commit ...'메시지를 표시했는데, 이는 다음 가비지 콜렉션에서 내 변경 사항이 사라질 것임을 의미합니다. 그건 정말 위험합니다 ... –

1

새로운 커밋은 이전 커밋과 동일한 상위 항목으로 만들어지며 현재 분기는 이제 새 커밋을 참조합니다. 이전 커밋은 여전히 ​​객체 데이터베이스에 있으며 git reflog으로 찾을 수 있습니다.

2

존의 대답을 보완하기 위해 오래된 커밋을 받아 들인다면 아무런 변화가 없습니다.

 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으로 해결할 수 있습니다.