푸시 된 후 병합 되돌리기


80

내가 수행 한 단계 :

나는 branch1과 branch2 두 개의 브랜치를 가지고 있습니다.

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

나는 갈등을 해결하고

$git commit -m "Merge resolved"

그때

$git checkout branch1
$git merge branch2
$git push origin branch1

이제 1 단계에서 자동 병합으로 일부 코드가 제거되고 변경 코드가 푸시되었음을 깨달았습니다. 이제 변경 사항을 되돌리기 위해 초기 상태로 돌아가고 싶습니다. 즉각적인 도움을 찾고 있습니까?


git revert가 원하는 작업을 수행하지 않습니까?
— Frederick Cheung

1
다음과 같은 메시지를 제공합니다. 치명적 : Commit b4a758b36a5bde9311061fe7b56e4f47859de052는 병합이지만 -m 옵션이 제공되지 않았습니다. @FrederickCheung
— Bijendra

-m 옵션에 대한 매뉴얼을 확인하십시오. kernel.org/pub/software/scm/git/docs/git-revert.html 곧 -m 1 또는 -m 2를 사용할 수 있습니다. 이렇게하면 되돌리려는 두 상위 개정판 중 어느 것을 선택할 수 있습니다.
— Ilya Ivanov

yaa 나는 git revert -m 1 SHA를 사용했습니다. 이제 모든 변경 사항은 내 로컬에서 커밋 될 변경 사항으로 제공됩니다.
— Bijendra

되돌리기 작업 중에 vim을 종료하는 오류가 발생했습니다. git config --global core.editor / usr / bin / vim을 실행하고 문제를 해결 한 다음 되돌리기를 성공적으로 실행하여 문제를 해결했습니다
— .Thanx

답변:


96

공식 가이드에 따라 병합을 되돌릴 수 있지만 병합 된 커밋이 여전히 대상 브랜치에 있다는 잘못된 믿음을 Git에 남깁니다.

기본적으로 다음을 수행해야합니다.

git revert -m 1 (Commit id of the merge commit)

27
하나는 1. first병합 커밋 의 부모를 의미합니다 . 그러나 (가상적으로) '우연히'마스터가 브랜치에 병합 된 경우, 빨리 감기 마스터가 병합 된 커밋으로 -m 2병합 된 경우 마스터에서 병합을 되 돌리는 데 사용해야 합니다.
— Krzysztof Jabłoński 2014 년

1
조심하세요 1. 병합을 부분적으로 되돌려 내 저장소를 엉망으로 만들었지 만 병합을 완전히 되돌리고 싶었습니다. 나는 되돌리기를 되돌 렸습니다!
— 실용적인 괴짜

1
@JavadSadeqzadeh은 또는, 당신은 완전히 대답은 무엇을 확인하지 않고 복사 붙여 넣기 SO에서하여 저장소를 엉망
— 조엘

33

를 사용 git reflog <branch>하여 병합 전에 분기가 있었던 위치를 찾고 git reset --hard <commit number>이전 개정을 복원하십시오.

Reflog는 분기의 이전 상태를 표시하므로 원하는 변경 세트로 되돌릴 수 있습니다.

git reset을 사용할 때 올바른 분기에 있는지 확인하십시오.

원격 저장소 기록을 변경하려면을 수행 할 수 git push -f있지만 누군가 사용자가 푸시 한 변경 사항을 이미 다운로드 할 수 있으므로 권장되지 않습니다.


1
나는 코드를 원격 지점으로 푸시했는데, 이것이 어떻게 거기에서 코드를 되돌릴 것인가 ..
— Bijendra

3
이미 푸시 한 경우 Ilya가 설명한대로 로컬 히스토리 재 작성을 원하지 않습니다
— ms-tg

2
죄송합니다. 놓친 부분이 있습니다 ... 때때로 git push -f를 사용하여 원격 기록을 다시 작성할 수 있습니다. 이것은 원격 저장소 구성 및 다른 팀 구성원에 따라 다릅니다 (강제 푸시로 인해 사용자를 죽이지 않는 경우).
— Ilya Ivanov

8

첫 번째 옵션은 git revert.

git revert -m 1 [sha-commit-before-merge]

는 git revert변경 사항을 되돌리려하지만 역사를 유지합니다. 따라서 병합 된 분기와 기능 분기 간의 실제 차이를 더 이상 볼 수 없으므로 동일한 분기에서 계속 작업 할 수 없습니다. 다음 방법을 사용하여 기록도 제거하십시오. 현재 브랜치에 변경 사항을 적용하는 유일한 사람인 경우에만 매우 신중하게 수행하십시오.

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force

1

제 경우에는 브랜치 (예 : my-branch)를 다른 기능 브랜치 (feature-branch)와 병합했지만 마스터는 병합하지 않았습니다. 그래서 내 지점 역사는 다음과 같습니다.

my-branch (before merge)

---master----m1----m2----m3---m4

master 위에 feature-branch커밋 이있는 다른 것과 병합 한 후 f1, f2다음과 같이됩니다.

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

이것은 내 브랜치에서 작업하는 동안 2 개의 커밋 후 마스터에서 병합을 수행했거나 두 브랜치 중 하나가 마스터와 최신 상태가 아니었기 때문에 발생했을 수 있습니다. 이 경우 그래서 것은 git revert -m 1이 사람들을 떠난다으로 작동하지 않는 f1및f2 사이에 커밋.

해결책은 간단했고, 중간 커밋이없는 일반적인 시나리오에서 작동합니다.

git rebase -i HEAD~6

6 대신 변경하려는 과거 커밋 수에 따라 적절한 숫자를 사용하십시오. 이제 Vim 편집기가 열리면 원하지 않는 커밋을 drop동일한 것으로 표시 하고 :wq 확인 로그를 사용하여 종료합니다 .

git log --oneline 

강제 푸시

git push -f

이제 원격 분기가 이전 상태에 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.