여기에있는 다른 답변에서 git rebase -i
커밋을 제거하는 데 어떻게 사용 되는지 혼동 스러웠 으므로 테스트 사례를 여기에 적어 두는 것이 좋습니다 (매우 OP와 유사).
다음은 폴더에 bash
테스트 저장소를 작성하기 위해 붙여 넣을 수 있는 스크립트입니다 /tmp
.
set -x
rm -rf /tmp/myrepo*
cd /tmp
mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com
mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"
echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"
echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
이 시점에서 file.txt
다음과 같은 내용이 있습니다.
aaaa
bbbb
cccc
dddd
eeee
이 시점에서 HEAD는 5 번째 커밋에 있으며 HEAD ~ 1은 4 번째이고 HEAD ~ 4는 첫 번째 커밋입니다 (따라서 HEAD ~ 5는 존재하지 않음). 세 번째 커밋을 제거하고 싶다고 가정 해 봅시다. myrepo_git
디렉토리 에서이 명령을 실행할 수 있습니다 .
git rebase -i HEAD~4
( "치명적인 : 단일 개정이 필요했습니다; 유효하지 않은 업스트림 HEAD ~ 5"의 결과를 참고하십시오 git rebase -i HEAD~5
. ) 텍스트 편집기 ( @Dennis의 답변 스크린 샷 참조 )는 다음 내용으로 열립니다.
pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit
# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...
따라서 요청 된 HEAD ~ 4 이후 ( 포함 하지는 않음 ) 모든 커밋을받습니다 . 줄을 삭제하고 pick 448c212 3rd git commit
파일을 저장하십시오. 이 응답은 git rebase
다음 에서 얻을 수 있습니다 .
error: could not apply b50213c... 4th git commit
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit
이 시점 folder/file.txt
에서 텍스트 편집기에서 myrepo_git /를여십시오 . 당신은 그것이 수정 된 것을 볼 수 있습니다 :
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
기본적으로 git
HEAD가 2 차 커밋 할 때 aaaa
+의 내용이 있음을 알 수 있습니다 bbbb
. 다음은 추가 패치가 cccc
+ dddd
는 기존 내용에 추가하는 방법을 알고하지 않습니다.
그래서 여기에 git
이 - 당신을위한 결정할 수없는 당신 (여기에 선을 당신도 그것에 의해 도입 된 변경 내용을 유지, 커밋 3을 제거하여 : 결정을 내려야하는 사람 cccc
) - 또는 당신은하지 않습니다. 그렇지 않으면 텍스트 편집기 cccc
를 folder/file.txt
사용하여 추가 라인을 포함하여 추가 라인을 제거하면 다음과 같습니다.
aaaa
bbbb
dddd
... 그리고 저장하십시오 folder/file.txt
. 이제 myrepo_git
디렉토리 에서 다음 명령을 실행할 수 있습니다 .
$ nano folder/file.txt # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
아-그래서 우리가 갈등을 해결했다는 것을 표시 하려면 git add
다음 folder/file.txt
을 수행하기 전에 해야 합니다 git rebase --continue
.
$ git add folder/file.txt
$ git rebase --continue
여기에 텍스트 편집기가 다시 열리고 행이 표시됩니다. 4th git commit
여기에서 커밋 메시지를 변경할 수 있습니다 (이 경우 의미있게 변경 될 수 있음 4th (and removed 3rd) commit
). 원하지 않는다고 가정 해 봅시다. 저장하지 않고 텍스트 편집기를 종료하십시오. 일단 그렇게하면, 당신은 얻을 것이다 :
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
이 시점에서, 당신은 (원래 커밋의 타임 스탬프가 변경되지 않은) gitk .
내용에 대해 다음과 같은 이력을 가지고 있습니다 (말 이나 다른 도구로 검사 할 수 있음 folder/file.txt
).
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| dddd
| +eeee
그리고 이전에 라인을 유지하기로 결정했다면 cccc
(우리가 제거한 3 번째 자식 커밋의 내용) :
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
글쎄, 이것은 내가 찾길 바라는 일종의 독서였습니다. git rebase
커밋 / 개정 삭제 측면에서 어떻게 작동 하는지 파악하기 시작했습니다 . 다른 사람들도 도울 수 있기를 바랍니다.