[git] 푸시 된 후 병합 되돌리기

내가 수행 한 단계 :

나는 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에 남깁니다.

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

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


답변

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

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

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

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


답변

첫 번째 옵션은 git revert.

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

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

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


답변

제 경우에는 브랜치 (예 : 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

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


답변