내 Git 기록은 다음과 같습니다.
보라색 커밋을 하나의 커밋으로 스쿼시하고 싶습니다. 내 커밋 로그에서 다시는보고 싶지 않습니다.
나는을 시도했지만 파란색 가지에 git rebase -i 1
있지만 1
(그림 참조) 보라색 가지에있는 모든 커밋을 볼 수 있습니다.
커밋 로그에서 퍼플 브랜치를 완전히 제거하려면 어떻게해야합니까?
답변
마 git rebase -i <sha before the branches diverged>
이 당신이 병합을 제거 할 수 커밋하고 당신이 원하는대로 로그는 하나 개의 라인을 것입니다. 더 이상 원하지 않는 커밋을 삭제할 수도 있습니다. 리베이스가 작동하지 않는 이유는 충분히 멀리 돌아 가지 않았기 때문입니다.
경고 :이 작업을 수행하면서 기록을 다시 작성하고 있습니다. 원격 리포지토리에 푸시 된 변경 사항으로이 작업을 수행하면 문제가 발생합니다. 로컬 커밋으로 만이 작업을 수행하는 것이 좋습니다.
답변
원래 상태의 저장소로 시작
병합 커밋을 제거하고 분기를 메인 라인의 단일 커밋으로 스쿼시하려면
다음 명령을 사용하십시오 (5 및 1을 해당 커밋의 SHA로 대체).
git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
병합 커밋을 유지하지만 분기 커밋을 하나로 스쿼시하려면 :
다음 명령을 사용하십시오 (5, 1 및 C를 해당 커밋의 SHA로 대체).
git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master
병합 커밋을 제거하고 분기에서 개별 커밋으로 바꾸려면
그냥하세요 (5를 해당 커밋의 SHA로 대체) :
git rebase 5 master
마지막으로 가지를 완전히 제거하려면
다음 명령을 사용합니다 (C와 D를 해당 커밋의 SHA로 대체).
git rebase --onto C D~ master
답변
병합 커밋 만 제거하려면
만약 당신이하고 싶은 것이 합병 커밋을 제거하는 것 뿐이라면 (2) 그것이 결코 일어나지 않은 것처럼 보이게하는 것입니다. 명령은 다음과 같습니다.
git rebase --onto <sha of 1> <sha of 2> <blue branch>
이제 보라색 가지가 파란색 커밋 로그에 전혀 없으며 두 개의 개별 가지가 다시 있습니다. 그런 다음 보라색을 독립적으로 스쿼시하고 병합 커밋없이 원하는 다른 조작을 수행 할 수 있습니다.
답변
원하는 사항에 따라이 문제를 해결하는 방법에는 두 가지가 있습니다.
해결 방법 1 : 보라색 커밋을 제거하고 기록을 보존합니다 (롤백하려는 경우).
git revert -m 1 <SHA of merge>
-m 1
선택할 상위 라인을 지정합니다.
보라색 커밋은 여전히 역사에 있지만 되돌 렸으므로 해당 커밋의 코드는 볼 수 없습니다.
해결 방법 2 : 퍼플 커밋을 완전히 제거 (리포지토리가 공유되는 경우 중단 변경)
git rebase -i <SHA before branching out>
퍼플 커밋에 해당하는 삭제 (줄 제거).
병합 후 커밋이 이루어지지 않으면 덜 까다로울 것입니다. 추가 커밋은 revert/rebase
.