Git 저장소의 처음 두 커밋을 결합하시겠습니까?
세 가지 커밋 A, B 및 C를 포함하는 이력이 있다고 가정합니다.
A-B-C
저는 두 개의 커밋 A와 B를 하나의 커밋 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 --root
Git 버전 1.7.12 이후.
대화형 기본 재배치 파일에서 커밋 B의 두 번째 행을 스쿼시로 변경하고 다른 행은 선택된 상태로 둡니다.
pick f4202da A
squash bea708e B
pick a8c6abc C
이렇게 하면 두 개의 커밋 A와 B가 하나의 커밋 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 커밋은 트리 전체이며, 일반적으로 설명되고 그들이 도입하는 diff의 관점에서 보더라도 diff가 아닙니다.
이 레시피는 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
수백 또는 수천 개의 커밋이 있는 경우, 코스트모의 답변을 사용하여
git rebase -i --root
기본 재배치 스크립트가 두 번, 대화형 기본 재배치 편집기 목록을 생성하기 위해(각 커밋에 대해 수행할 작업을 선택하기 위해) 한 번, 그리고 실제로 커밋의 재적용을 실행하기 위해 한 번씩 처리해야 하는 많은 커밋 때문에 비현실적이고 느릴 수 있습니다.
먼저 대화형 기본 재배치를 사용하지 않음으로써 대화형 기본 재배치 편집기 목록을 생성하는 데 드는 시간 비용을 피할 수 있는 대체 솔루션이 있습니다.이런 식으로, 찰스 베일리의 해결책과 비슷합니다.두 번째 커밋에서 독립 분기를 만든 다음 그 위에 모든 하위 커밋을 다시 작성하면 됩니다.
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
문서화
대화형 리베이스의 경우 목록이 다음과 같이 되도록 A보다 먼저 수행해야 합니다.
pick A
pick B
pick C
대상:
pick A
squash B
pick C
A가 초기 커밋인 경우 A보다 먼저 다른 초기 커밋을 수행해야 합니다.Git는 (A와 B)와 (B와 C)의 차이에 대해 다르게 생각합니다.따라서 예제에서는 스쿼시가 작동하지 않습니다.
관련 질문에서, 저는 첫 번째 약속, 즉 두 번째 약속을 만드는 것에 대한 압박의 필요성에 대해 다른 접근법을 생각해냈습니다.
만약 당신이 관심이 있다면: git: 어떻게 커밋을 첫 번째로 삽입하고 다른 모든 커밋을 이동시킬 수 있습니까?
스쿼드용 Git 명령: gitrebase -i HEAD~[커밋 수]
아래의 git commit 내역을 가지고 있다고 가정해 보겠습니다.
feat:5152061 feat: 되었습니다. ( 이미지 저장. (A)
픽스:픽스. ( 39c5a04 파일: 버그픽스스. (B)
픽스: 충돌 839c6b3 파일: 스픽해결충돌. (C)
이제 A와 B를 AB로 스쿼시하려면 다음 단계를 수행합니다.
feat:5152061 feat: 되었습니다. ( 이미지 저장. (A)
(B) s39c5a04 파일: 버그수정수. (B)
픽스: 충돌 839c6b3 파일: 스픽해결충돌. (C)
참고: 스쿼시 커밋에는 스쿼시 또는 s를 사용할 수 있습니다.다음과 .
feat:5152061 feat: 되었습니다. ( 이미지 저장. (AB)
픽스: 충돌 839c6b3 파일: 스픽해결충돌. (C)
당신은 약간의 명령 줄 마법을 수행해야 합니다.
git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a
그러면 AB와 C를 커밋으로 하는 지점이 남게 됩니다.
언급URL : https://stackoverflow.com/questions/435646/combine-the-first-two-commits-of-a-git-repository
'programing' 카테고리의 다른 글
래퍼를 사용하여 데이터베이스에 작성된 보기에 액세스하는 방법 (0) | 2023.07.09 |
---|---|
선택 쿼리 내에서 저장 프로시저를 실행하는 방법 (0) | 2023.07.09 |
Oracle에서 AUTO_INCREMENT로 ID를 생성하는 방법은 무엇입니까? (0) | 2023.07.09 |
sqlplus 원격 연결 제공 ORA-21561 (0) | 2023.07.09 |
Mac용 Office 2011의 VBA 셸 기능 (0) | 2023.07.09 |