개발관련/Git

Git에서 처음 두 커밋을 Squash 하는 방법

Rateye 2021. 9. 7. 10:39
728x90
반응형
질문 : Git에서 처음 두 커밋을 스쿼시 하시겠습니까?

git rebase --interactive <commit> 하면 원하는 수의 커밋을 하나의 커밋으로 통합 할 수 있습니다.

초기 커밋에 커밋을 스쿼시하지 않는 한 모든 것이 좋습니다. 불가능 해 보입니다.

그것을 달성하는 방법이 있습니까?

관련 질문에서, 나는 첫 번째 커밋에 대해 스 쿼싱의 필요성에 대한 다른 접근 방식을 생각해 냈습니다. 즉, 두 번째 커밋으로 만들었습니다.

관심이 있다면 : git : 커밋을 첫 번째로 삽입하고 나머지는 모두 이동하는 방법?

답변

2012 년 7 월 업데이트 ( git 1.7.12+ )

이제 모든 커밋을 루트까지 리베이스하고 두 번째 커밋 Y 를 첫 번째 X 로 스쿼시하도록 선택할 수 있습니다.

git rebase -i --root master

pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip

$tip "에서 루트 커밋까지 모든 기록을 다시 작성할 수 있습니다.

Chris Webb ( arachsys )의 GitHub에서 commit df5df20c1308f936ea542c86df1e9c6974168472를 참조하십시오.

원문 답변 (2009 년 2 월)

"git 저장소의 처음 두 커밋을 어떻게 결합합니까? "라는 질문에서 다른 레시피를 찾을 수 있다고 생각합니다.

Charles Bailey 는 가장 자세한 답변을 제공하여 커밋이 전체 트리 (이전 상태와의 차이점이 아님)임을 상기 시켰습니다.
그리고 여기서 이전 커밋 ( "초기 커밋")과 새 커밋 (스 쿼싱의 결과)에는 공통 조상이 없습니다.
commit --amend "한 다음 이전 초기 커밋의 기록을 새 초기 커밋으로 리베이스 할 수 없습니다 (많은 충돌).

(그 마지막 문장은 더 이상 git rebase -i --root <aBranch> 사실이 아닙니다)

오히려 ( A 는 원래 "초기 커밋"이고 B 는 후속 커밋을 초기 커밋으로 스쿼시해야 함) :

  1. 초기 커밋 (HEAD 분리)을 구성하려는 마지막 커밋으로 돌아갑니다.
    git checkout <sha1_for_B>
  2. 분기 포인터를 초기 커밋으로 재설정하지만 인덱스와 작업 트리는 그대로 둡니다.
    git reset --soft <sha1_for_A>
  3. 'B'의 트리를 사용하여 초기 트리를 수정합니다.
    git commit --amend
  4. 이 새로운 초기 커밋에 일시적으로 태그를 지정하거나 새 커밋 sha1을 수동으로 기억할 수 있습니다.
    git tag tmp
  5. 원래 브랜치로 돌아가십시오 (이 예에서는 마스터로 가정).
    git checkout master
  6. B 이후의 모든 커밋을 새 초기 커밋으로 재생합니다.
    git rebase --onto tmp <sha1_for_B>
  7. 임시 태그를 제거하십시오.
    git tag -d tmp

 

그 방법은 " rebase --onto 그것이 마지막 커밋 (이후 역사 rebases 때문에"병합하는 동안 충돌을 도입하지 않는 B ) (이었다 초기 하나에 숙청 할 )하는 A tmp 합니다 (찌그러 새로운 초기 대표를 commit) : 사소한 빨리 감기 만 병합합니다.

그것은 " AB "뿐만 아니라 " A-...-...-...-B "에서도 작동합니다. (이 방법으로 어떤 수의 커밋을 초기 커밋에 스쿼시 할 수 있습니다)

출처 : https://stackoverflow.com/questions/598672/squash-the-first-two-commits-in-git
728x90
반응형