내가 수행 한 단계 :
나는 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
이 사람들을 떠난다으로 작동하지 않는 f1
및f2
사이에 커밋.
해결책은 간단했고, 중간 커밋이없는 일반적인 시나리오에서 작동합니다.
git rebase -i HEAD~6
6 대신 변경하려는 과거 커밋 수에 따라 적절한 숫자를 사용하십시오. 이제 Vim 편집기가 열리면 원하지 않는 커밋을 drop
동일한 것으로 표시 하고 :wq
확인 로그를 사용하여 종료합니다 .
git log --oneline
강제 푸시
git push -f
이제 원격 분기가 이전 상태에 있어야합니다.