태그 보관물: git-rebase

git-rebase

git remove merge commit from history 커밋으로 스쿼시하고 싶습니다.

내 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.


답변