Programing

git remove merge commit from history

lottogame 2020. 11. 1. 17:14
반응형

git remove merge commit from history


내 Git 기록은 다음과 같습니다.

힘내 역사

보라색 커밋을 하나의 커밋으로 스쿼시하고 싶습니다. 내 커밋 로그에서 다시는보고 싶지 않습니다.

나는을 시도했지만 파란색 가지에 git rebase -i 1있지만 1(사진 참조) 보라색 가지에 모든 커밋이 표시됩니다.

커밋 로그에서 보라색 분기를 완전히 제거하려면 어떻게해야합니까?


git rebase -i <sha before the branches diverged>이 당신이 병합을 제거 할 수 커밋하고 당신이 원하는대로 로그는 하나 개의 라인을 것입니다. 더 이상 원하지 않는 커밋을 삭제할 수도 있습니다. 리베이스가 작동하지 않는 이유는 충분히 멀리 돌아 가지 않았기 때문입니다.

경고 :이 작업을 수행하면서 기록을 다시 작성하고 있습니다. 원격 저장소에 푸시 된 변경 사항으로이 작업을 수행하면 문제가 발생합니다. 로컬 커밋으로 만이 작업을 수행하는 것이 좋습니다.


원래 상태의 저장소로 시작

원래 repo 기록

병합 커밋을 제거하고 분기를 메인 라인의 단일 커밋으로 스쿼시하려면

스쿼시 된 커밋, 병합 커밋 없음

다음 명령을 사용하십시오 (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

원하는 항목에 따라이 문제를 해결하는 방법에는 두 가지가 있습니다.

해결 방법 1 : 보라색 커밋을 제거하고 기록을 보존합니다 (롤백하려는 경우).

git revert -m 1 <SHA of merge>

-m 1 선택할 상위 라인을 지정합니다.

보라색 커밋은 여전히 ​​역사에 남아 있지만 되돌 렸으므로 해당 커밋의 코드는 볼 수 없습니다.


해결 방법 2 : 퍼플 커밋을 완전히 제거합니다 (리포지토리가 공유되면 중단 변경).

git rebase -i <SHA before branching out>

퍼플 커밋에 해당하는 삭제 (줄 제거).

병합 후 커밋이 이루어지지 않으면 덜 까다로울 것입니다. 추가 커밋은 revert/rebase.


병합 커밋 만 제거하려면

만약 당신이하고 싶은 것이 합병 커밋을 제거하는 것 뿐이라면 (2) 그것이 결코 일어나지 않은 것처럼 보이게하는 것입니다. 명령은 다음과 같습니다.

git rebase --onto <sha of 1> <sha of 2> <blue branch>

이제 보라색 가지가 파란색 커밋 로그에 전혀 없으며 두 개의 개별 가지가 다시 있습니다. 그런 다음 보라색을 독립적으로 스쿼시하고 병합 커밋없이 원하는 다른 조작을 수행 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/17577409/git-remove-merge-commit-from-history

반응형