2014-10-07 4 views
1

커밋 A, B, C 및 D가 있고 가장 최근의 것을 D로 유지해야합니다. 그 한 가지 방법은 git rebase -i --root을 선택하여 스쿼시 할 수 있음을 확인했습니다. 커밋.가장 최근의 커밋을 유지하기위한 git 리베이스

나는 픽과 스쿼시의 차이점을 많이 이해하지 못했지만, 커밋은 증분이므로 커밋 D는 모든 변경 사항을 포함하므로 궁금한 점이 있습니까? 왜 가장 많이 유지하려면 git rebase을 통과해야합니까? 최근 커밋을하고 커밋의 나머지 부분 만 삭제하지 않으시겠습니까?

또는 git에 대한 근본적인 것이 누락 되었습니까? 서로 관련이없는 커밋을 가질 수 있습니까? 즉 언젠가는 커밋 B를 사용하고 또 다른 상황에서는 가장 최근의 커밋 D를 사용합니까?

답변

6

git 커밋은 실제로 증분이 아니며, 각 커밋에는 전체 트리가 포함됩니다. 상위와의 차이점에서 커밋을 표시하는 것은 사용자 인터페이스입니다. 이러한 의미에서 이 없으면 가장 최근의 커밋을 유지하고 나머지는 무시하기 위해 git commit-tree 배관 명령을 사용하여 커밋을 생성 할 수 있습니다. 조밀 한 라인은 다음을 수행

git reset --hard $(git commit-tree HEAD: -m message) 

그건 :

  • HEAD: 현재 머리 커밋에게에 포함 된 트리 객체를 참조하는 REBASE의 전체 해당하는이 같은 줄 것이다.

  • git commit-tree TREE -m MESSAGE은 지정한 트리 (여기서는 HEAD 트리)를 포함하는 새로운 부모없는 커밋을 만듭니다. 그 출력은 새로 생성 된 커밋의 SHA1입니다.

  • git reset --hard COMMIT은 현재 분기와 작업 트리를 지정된 커밋 (이 경우 새로 작성된 루트 커밋)으로 재설정합니다.

히스토리가없는 커밋은 git에서 사용하지 않는 것이 좋습니다. 왜냐하면 그러한 커밋으로 인해 git이 데이터에서 작동하기 어렵 기 때문입니다. git annotategit merge과 같은 명령은 사용 가능한 히스토리에 크게 의존하며 이러한 명령을 사용하지 않으면 유용한 도구가 아닙니다.

관련 문제