그래서 나는 큰 실수를했다. 나는 커밋을 작성하고 병합하고 (그러나 코드를 엉망으로 만들었습니다) 밀었다. 병합을 다시 실행하고 코드를 올바르게 작성하고 싶습니다. 이것을 할 수있는 방법이 있습니까?
비트 버킷을 사용합니다.
그래서 나는 큰 실수를했다. 나는 커밋을 작성하고 병합하고 (그러나 코드를 엉망으로 만들었습니다) 밀었다. 병합을 다시 실행하고 코드를 올바르게 작성하고 싶습니다. 이것을 할 수있는 방법이 있습니까?
비트 버킷을 사용합니다.
답변:
이것이 "축복 된"방법인지 확실하지 않지만, 여기에 "강제로 밀기"또는 그와 비슷한 것을하지 않고도 동일한 문제를 해결하기 위해 수행 한 작업이 있습니다.
당신의 역사가 다음과 같다고 가정 해 봅시다 (그리고 M은 연약한 합병입니다).
-A--B--C--M (master points here)
\ /
D----E
달리기 git checkout -b merge_fix <commit ID E>
는 실수하기 전에 지점을 만듭니다.
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
이제 새 지점에서 병합을 다시 수행하겠습니다. 우리는 단지 병합 할 수 없으므로 master
잘못된 병합 전에 커밋을 수동으로 선택해야합니다. git merge <commit ID C>
지난번에했던 것과 같은 실수를하지 마십시오!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
커밋 G
이 좋아 보인다고 가정하면 master
지점 의 상단과 동기화하고 싶습니다 . 이 명령은 git에게 master에 대한 변경 사항을 무시하고 변경 사항을 강제로 병합 결과로 만들도록 지시합니다.git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
마지막으로 (커밋 H
이 좋아 보인다고 가정하면 master
고정 병합 을 빨리 포함하고 싶습니다.
git checkout master
git merge merge_fix
이것은 실제로 master
분기 포인터를로 이동 H
하지만 ASCII 아트를 약간 정리할 수 있습니다.
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
그리고 당신은 그것을 가지고 있습니다! 기록을 무효화하지 않고 병합을 다시 완료했습니다!
다음과 같이 할 수 있습니다.
그건:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
git push --force
원격 지점에 있던 모든 것을 다시 작성 한다는 점을 명심하십시오. 해당 지점을 사용하는 다른 사람들도 이것의 영향을받을 수 있습니다. (일반적으로이 작업을 수행해서는 안됩니다.)
git push --force
안전한 것은 기억 하지 마십시오
git merge --abort
그런 다음 다시 병합 할 수 있습니다
이 희망이 당신에게 유용하다는 희망을 확인하십시오
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html