문제

세 커밋이 포함 된 역사가 있다고 가정 해 봅시다 a, b 그리고 :

A-B-C

두 커밋을 결합하고 싶습니다 그리고 한 커밋에 AB:

AB-C

나는 시도했다

git rebase -i A

다음 내용으로 편집자가 열립니다.

pick e97a17b B
pick asd314f C

나는 이것을 변경합니다

squash e97a17b B
pick asd314f C

그런 다음 git 1.6.0.4는 말합니다.

Cannot 'squash' without a previous commit

방법이 있습니까 아니면 이것이 불가능합니까?

도움이 되었습니까?

해결책

사용 git rebase -i --rootgit로 버전 1.7.12.

대화식 Rebase 파일에서 두 번째 커밋 라인을 변경하십시오. 에게 스쿼시 그리고 다른 줄을 그대로 두십시오 선택하다:

pick f4202da A
squash bea708e B
pick a8c6abc C

이것은 두 커밋을 결합합니다 그리고 한 커밋에 AB.

발견되었습니다 이 답변.

다른 팁

당신은 시도:

git rebase -i A

계속하면 그렇게 시작할 수 있습니다. edit 보다는 squash:

edit e97a17b B
pick asd314f C

그런 다음 실행하십시오

git reset --soft HEAD^
git commit --amend
git rebase --continue

완료.

A 초기 커밋 이었지만 지금은 원합니다 B 초기 커밋이되기 위해. Git Commits는 전체 나무이며, 그들이 소개하는 차이로 정상적으로 묘사되고 보더라도 차이가 아닙니다.

이 레시피는 A와 B, B와 C 사이에 여러 커밋이 있더라도 작동합니다.

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp

대화식 Rebase의 경우 목록이 다음과 같이하기 전에 수행해야합니다.

pick A
pick B
pick C

가려진다 :

pick A
squash B
pick C

A가 초기 커밋 인 경우 A 전에 다른 초기 커밋이 있어야합니다. Git은 차이점에서 생각하면 (A와 B)와 (B 및 C)의 차이에 대해 작동합니다. 따라서 스쿼시는 당신의 예에서 작동하지 않습니다.

수백 또는 수천 개의 커밋이있는 경우 사용 Kostmo의 대답

git rebase -i --root

Rebase 스크립트가 처리 해야하는 많은 커밋으로 인해 비현실적이고 느리게 두 배, 대화식 Rebase 편집기 목록 (각 커밋에 대해 취할 조치를 선택하는 경우)을 생성하고 실제로 커밋의 재 응시를 실행하기 위해 한 번.

여기에 있습니다 대체 솔루션 대화 형 레바 제 편집기 목록을 생성하는 시간 비용을 피할 수 있습니다. 대화식 레바이스를 사용하지 않음 처음에. 이런 식으로, 그것은 비슷합니다 Charles Bailey의 해결책. 당신은 단순히 an을 만듭니다 고아 지점 두 번째 커밋에서, 그리고 모든 자손이 그 위에 위탁합니다.

git checkout --orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto orphan <second-commit-sha> master

선적 서류 비치

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

관심이 있다면 : GIT : 커밋을 첫 번째로 삽입하여 다른 모든 것을 바꾸는 방법은 무엇입니까?

분대를위한 Git Command : Git Rebase -I Head ~ [커밋 수

아래에 git 커밋 역사가 있다고 가정 해 봅시다.


5152061 선택 : 이미지 저장에 대한 지원이 추가되었습니다. (ㅏ)
39C5A04 수정 : 버그 수정을 선택하십시오. (비)
839c6b3 수정 : 충돌 해결. (씨)

이제 A와 B를 AB로 스쿼시하고 아래 단계를 수행하려고합니다.


5152061 선택 : 이미지 저장에 대한 지원이 추가되었습니다. (ㅏ)
S 39C5A04 수정 : 버그 수정. (비)
839c6b3 수정 : 충돌 해결. (씨)

참고 : 스쿼시 커밋의 경우 스쿼시 또는 s를 사용할 수 있습니다. 최종 결과는 다음과 같습니다.
5152061 선택 : 이미지 저장에 대한 지원이 추가되었습니다. (AB)
839c6b3 수정 : 충돌 해결. (씨)

당신은 약간의 명령 줄 마술을 수행해야합니다.

git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a

커밋대로 AB와 C가있는 지점을 남겨 두어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top