연속적이지 않은 커밋 두 개를 제거하려면 어떻게 해야 합니까?
Git 내의 기본 재배치 기능은 조금 생소합니다.다음과 같은 커밋을 수행했다고 가정합니다.
A -> B -> C -> D
그 후에, 저는 깨닫습니다.D에 추가된 일부 새 코드에 의존하는 수정 사항 포함A그리고 이 커밋들이 함께 속한다는 것.스쿼시 방법A&D함께 떠나다B&C혼자서?
실행할 수 있습니다.git rebase --interactive그리고 B보다 먼저 D를 재주문하고 D를 A로 밀어넣습니다.
Git가 편집기를 열면 다음과 같은 파일이 표시됩니다.git rebase --interactive HEAD~4
pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D
# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
이제 다음과 같은 파일을 변경합니다.
pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C
그리고 Git는 이제 A와 D의 변경 사항을 하나의 커밋으로 결합하고 B와 C를 나중에 배치할 것입니다.D의 커밋 메시지를 유지하고 싶지 않을 때 대신squash당신은 그것을 사용할 것입니다.fixup키워드자세한 내용은fixup당신은 문서를 참조하거나 좋은 답변이 있는 이 질문을 확인할 수 있습니다.
참고: 다른 보관소로 푸시된 커밋은 결과를 알지 못하는 한 어떤 방식으로든 변경해서는 안 됩니다.
git log --oneline -4
D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A
git rebase --interactive
pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
유형i(VIM을 삽입 모드로 설정)
목록을 이와 같이 변경합니다(커밋 메시지를 제거하거나 포함할 필요는 없습니다).철자를 틀리지 마십시오!:
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D
다음을 입력합니다.ZZ(VIM 저장 및 종료)
# This is a combination of 2 commits.
# The first commit's message is:
commit_message_for_D
# This is the 2nd commit message:
commit_message_for_A
유형i
텍스트를 새 커밋 메시지의 모양으로 변경합니다.커밋의 변경 사항에 대한 설명이 될 것을 권장합니다.A그리고.D:
new_commit_message_for_A_and_D
다음을 입력합니다.ZZ
git log --oneline -4
E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B
git show E
(You should see a diff showing a combination of changes from A and D)
이제 새 커밋을 만들었습니다.E커밋A그리고.D당신의 역사에는 더 이상 없지만 사라지지는 않았습니다.이 시점에서도 잠시 동안 복구할 수 있습니다.git rebase --hard D(git rebase --hard로컬 변경 내용이 삭제됩니다!).
소스 트리를 사용하는 경우:
이미 커밋을 푸시하지 않았는지 확인합니다.
- 리포지토리 > 대화형 기본 재배치...
- D(새 커밋)를 A(이전 커밋) 바로 위로 끕니다.
- 커밋 D가 강조 표시되었는지 확인합니다.
- 클릭
Squash with previous
대화형 리베이스는 20-30개의 커밋 및/또는 마스터 또는/또는 분기에서 커밋하는 동안 충돌을 해결하는 큰 기능 분기가 있을 때까지 잘 작동합니다.역사를 통해 내 약속을 찾고 대체하더라도 말입니다.pick와 함께squash여기서는 작동하지 않습니다.그래서 다른 방법을 찾다가 이 기사를 발견했습니다.이 작업을 다른 지점에서 수행하기 위해 변경 작업을 수행했습니다.
git checkout master
git fetch
git pull
git merge branch-name
git reset origin/master
git branch -D branch-name
git checkout -b branch-name
git add --all
#Do some commit
git push -f --set-upstream origin branch-name
이 이전에 마스터 + 수정 충돌에서 2-3개의 병합과 함께 약 30개의 커밋으로 풀 요청을 받았습니다.그리고 그 후 저는 한 번의 약속으로 명확한 홍보를 받았습니다.
추신: 자동 모드에서 이 단계를 수행하기 위한 bash 스크립트입니다.
git 체크아웃 마스터
git log --한 줄
D
C
B
A
gitrebase --to HEAD^^^ HEAD^
git log --한 줄
D
A
언급URL : https://stackoverflow.com/questions/3921708/how-do-i-squash-two-non-consecutive-commits
'programing' 카테고리의 다른 글
| 최신 레코드를 제외한 모든 레코드를 삭제하시겠습니까? (0) | 2023.07.07 |
|---|---|
| 사용자별 gitignore 파일을 만들 수 있습니까? (0) | 2023.07.07 |
| CSRF 보호가 Spring Security 6과 함께 작동하지 않음 (0) | 2023.07.07 |
| SQL Server에서 ORDER BY 및 UNION 조합 (0) | 2023.07.07 |
| Oracle SQL - 열의 상위 5개 값을 검색하는 방법 (0) | 2023.07.07 |