푸시 된 후 병합 되돌리기


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이 사람들을 떠난다으로 작동하지 않는 f1f2 사이에 커밋.

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

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.