git 저장소의 처음 두 커밋을 결합 하시겠습니까?
-
22-07-2019 - |
문제
세 커밋이 포함 된 역사가 있다고 가정 해 봅시다 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 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 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가있는 지점을 남겨 두어야합니다.