Git에서 병합을 다시 실행할 수 있는 방법이 있나요?

Git에서 병합을 다시 실행할 수 있는 방법이 있나요?

그래서 나는 꽤 큰 실수를 저질렀다. 커밋하고, 끌어오고, 병합한 다음(그러나 그렇게 하는 동안 코드가 엉망이 됨) 푸시했습니다. 병합을 다시 실행하여 코드를 올바르게 얻고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?

저는 비트버킷을 사용합니다.

답변1

이것이 "축복받은" 방법인지는 확실하지 않지만, "강제 푸시"나 이와 유사한 작업 없이 동일한 문제를 해결하기 위해 수행한 작업은 다음과 같습니다.

귀하의 기록이 다음과 같다고 가정해 봅시다(그리고 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

그리고 거기에 있습니다! 기록을 무효화하지 않고 병합을 성공적으로 다시 수행했습니다!

답변2

다음과 같이 할 수 있습니다.

  1. 병합하기 전에 커밋으로 재설정하세요.
  2. 병합을 다시 수행하십시오.
  3. 강제 푸시

그건:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

git push --force원격 지점에 있던 모든 내용을 다시 작성하게 되며 해당 지점을 사용하는 다른 사람도 이로 인해 영향을 받을 수 있다는 점을 명심하세요 . (일반적으로 이렇게 하면 안 됩니다.)

답변3

git merge --abort 그런 다음 다시 병합할 수 있습니다

답변4

나는 좀 더 복잡한 설정을 가지고 있었습니다.

기본적으로 세 가지 시작점이 있습니다. (다른 솔루션은 모두 1 또는 2를 가정합니다.)

  1. redo-branch완전히 병합되어야 하며
    병합 후에 redo-branch다른 병합 없음
  2. redo-branch완전히 병합되어야 하며
    병합 후에 redo-branch이미 병합되어 있어야 합니다.기타 병합, 그건 보관해야 해
  3. redo-branch오래 사는 가지반복적으로 병합되고 AND
    개정 범위만~였다병합의 일부그리고
    있었다마스터의 다른 커밋/병합병합 실패 후(아야)

(3)의 설정은 다음과 같습니다.

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. 당신은 해결책이 괜찮을 것입니다https://superuser.com/a/691497/308385
  2. 1과 동일한 솔루션이 작동할 수 있습니다.
  3. 시작하자 :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge

# now let's pick all the revisions D through E
git cherry-pick D^1..E

# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge

관련 정보