Git에서 되 돌린 병합 다시 실행


231

여기에 약간의 문제가 있습니다 28s.Git에 문제 별 분기가 있었고 일반 develop분기에 병합했습니다 . 너무 빨리 수행 한 것으로 나타 났으므로 병합 취소를 위해 git-revert를 사용했습니다. 그러나 지금, 시간이 병합왔다 28s으로 develop하지만, 자식 병합 명령은 원래 병합을보고, 즐겁게 모두가 잘와 가지가 이미되어 합병했다고 발표했다. 지금 무엇을해야합니까? 'Revert "28s-> develop"되돌리기'커밋을 만드시겠습니까? 그것을하는 좋은 방법은 아니지만 지금은 다른 상상할 수 없습니다.

트리 구조는 다음과 같습니다.

힘내 로그 출력


4
GitX ( gitx.frim.nl )입니다.
Toms Mikoss

답변:


169

"되돌리기"를해야합니다. 원본 복귀 방법에 따라 들리는 것처럼 쉽지 않을 수 있습니다. 이 주제에 대한 공식 문서를 보십시오 .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

허용하기 위해:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

그러나 모두 작동합니까? 물론입니다. 병합을 되돌릴 수 있으며 순수한 기술적 인 각도에서 git은 매우 자연스럽게 처리했으며 실제로 아무런 문제가 없었습니다.
방금 "병합 전 상태"에서 "병합 후 상태"로의 변경을 고려한 것입니다.
복잡한 것도없고 이상한 것도없고 위험한 것도 없습니다. 힘내 생각조차하지 않고 그것을 할 것입니다.

따라서 기술적 인 측면에서 병합을 되 돌리는 데 아무런 문제가 없지만 워크 플로 각도에서는 일반적으로 피해야하는 것 입니다.

당신은 메인 트리에 통합있어 문제가 발견되면 모두가, 예를 들어, 수에하면 오히려 병합 되돌리기보다는를하려고 정말 열심히 :

  • 문제를 병합 한 지점으로 나누고 해결하십시오.
  • 또는 원인이 된 개별 커밋을 되돌리려 고합니다.

그래, 더 복잡하고, 아니, 항상 일을하지 않을 것 (때로는 대답은 "죄송합니다, 아직 준비가되지 않았기 때문에 난 정말 그것을 통합 안, 나는 정말 취소해야 모든 의를 병합 "). 따라서 병합을 되돌려 야하지만 병합을 다시 실행하려면 되돌리기를 되돌려 야합니다.


10
연결이 양호합니다 (+1). 독자가이 경우 관련 옵션을 즉시 볼 수 있도록 귀하의 답변에 문서의 일부를 자유롭게 복사 할 수있었습니다. 동의하지 않으면 자유롭게 되 돌리십시오.
VonC

5
우리는이 작업을 수행해야하는 경우에 부딪 쳤고 재미는 여기서 끝나지 않습니다. 병합 된 장기 실행 브랜치이므로 계속 업데이트해야했습니다. 내 접근 방식은 여기 tech.patientslikeme.com/2010/09/29/…
jdwyah

나는 @jdwyah의 블로그 게시물을 따랐고 영광 스럽다 (정말로, 그것이 효과가 있다는 것이 굉장했다).
헬라 탄

2
@jdwyah는 깨진 링크 인 것처럼 보이지만 재미있는 읽은 것처럼 들립니다. 다음은 archive.org 거울이지만 이미지를 누락되었습니다 web.archive.org/web/20111229193713/http://...
알렉스 KeySmith

15
블로그 게시물이 다시 활성화
jdwyah

53

그런 역사가 있다고 가정 해 봅시다

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

A, B가 커밋에 실패하고 W-M을 되 돌리는 경우

그래서 발견 된 문제를 해결하기 전에 나는 지점에 W 커밋을 선택합니다.

git cherry-pick -x W

그런 다음 지점에서 W 커밋을 되돌립니다.

git revert W 

계속 고칠 수 있습니다.

최종 역사는 다음과 같습니다.

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

PR을 보내면 PR이 되돌리기 취소임을 분명히 표시하고 새로운 커밋을 추가합니다.


3
이 같은이 모습은 도움이 될 수 있지만, 더 실망이보다 유용하다는 (마지막 그림에서 C, D를 무엇) 스파 스 세부 사항에 그렇다 수
등시

4
@ 등시성 C와 D는 A와 B에 의해 도입 된 문제를 해결하는 커밋 인 것 같습니다.
Thomas

@Thomas 정확히
Maksim

마스터로 다시 병합하기 전에 최종 '위생 검사'를 제공 할 수 있으므로이 경우 PR 사용을 강조한 것이 좋습니다.
Willem van Ketwich

왜 원래 W에서 분기를 다시 시작합니까? 즉, W에서 C와 D로 계속해서 주제를 W에서 계속하게 하시겠습니까? 즉 일부 중복을 제거
에릭 Carstensen에게

12

워크 플로우를 너무 많이 방해하지 않고 되돌리기를 되돌리려면 :

  • 개발의 로컬 쓰레기 복사본 만들기
  • 로컬 개발 사본에서 되돌리기 커밋 되돌리기
  • 해당 사본을 기능 분기로 병합하고 기능 분기를 git 서버로 푸시하십시오.

이제 준비가되면 기능 분기를 정상적으로 병합 할 수 있습니다. 여기서 유일한 단점은 기록에 몇 가지 추가 병합 / 복귀 커밋이 있다는 것입니다.


추가 혼합을 막기 위해 기능 분기의 '휴지통'사본을 작성하고 되 돌린 개발을 병합했습니다.
jhhwilliams

감사합니다! 이것은 당신이 이것을해서는 안된다고 말하는 대신 실제로 그것을하는 방법을 설명하는 유일한 대답입니다. 정말 도움이됩니다.
Emmy

고마워요, 정말 도움이되었습니다. :)
Daniel Stracaboško

11

GIT에서 되돌리기를 되돌리려면 :

git revert <commit-hash-of-previous-revert>

1
내 작업 지점에서 이것을 사용하여 되돌리기를 되돌리고 새로운 PR을 개발하십시오. 이제 git은 이전 PR에서 변경된 모든 변경 사항을 봅니다. 감사.
Danstan

3

사용하는 대신 git-revert 당신은이 명령을 사용할 수도 devel하는 지점 버리고 잘못된 병합 (대신 그것을 되 돌리는의) 커밋 (취소).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

또한 작업 디렉토리의 내용을 적절하게 조정합니다. 조심하십시오 :

  • 변경 사항 저장병합이 잘못되었으므로 개발 브랜치에서 을git-reset . git reset인수 로 지정한 커밋 후 모든 커밋 이 사라집니다!
  • 또한 재설정이 히스토리를 다시 작성하므로 다른 저장소에서 변경 사항을 이미 가져온 경우이 작업을 수행하지 마십시오.

이것을 git-reset시도하기 전에 맨 페이지를주의 깊게 연구하는 것이 좋습니다 .

재설정 후 변경 사항을 다시 적용한 devel다음

git checkout devel
git merge 28s

이것은에서 실제 병합 될 것 28s으로 devel(지금은 자식의 역사에서 지워집니다) 초기처럼.


8
결합주의 : 자식 슈퍼 익숙하지 않은 이들의 지시에 따라 할 수있는 사람들을위한 reset --hardpush origin. 또한 GitHub에서 강제로 원점을 강요하면 실제로 공개 PR을 생성 할 수 있습니다.
funroll

개인 자식 서버에서 일부 병합 문제를 해결하는 데 매우 유용합니다. 감사!
mix3d

1
이 기술에 +1 잠재적으로 파괴적이지만 신중하게 적용하면 많은 두통 (그리고 엉망인 역사)을 줄일 수 있습니다.
siliconrockstar

1

같은 문제에 직면했을 때이 게시물을 찾았습니다. 나는 하드 등을 재설정하는 것이 무섭다는 것을 알게되었습니다.

대신 커밋을 확인하여 지점이 예를 들어 다시 돌아 가기를 원했습니다 git checkout 123466t7632723. 그런 다음 지점으로 변환됩니다 git checkout my-new-branch. 그런 다음 더 이상 원하지 않는 지점을 삭제했습니다. 물론 이것은 당신이 엉망인 지점을 버릴 수있는 경우에만 작동합니다.


1
git reflog나중에 당신이 잃어버린 커밋이 필요하다는 것을 발견 할 경우 몇 달을위한 하드 리셋에 당신을 보호 할 것입니다. 리플 로그는 지역 리포지토리로 제한됩니다.
Todd

1

SHA1과 같이 아래 단계를 따라 되돌리기를 되돌릴 것을 제안합니다.

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

이제 지점에 대한 PR을 작성하십시오. users/yourname/revertOfSHA1


1
  1. 원래 병합 전에 커밋시 새로운 브랜치를 생성하십시오-그것을 '개발 기반'이라고 부릅니다.
  2. '개발 기반'위에 '개발'의 대화식 리베이스를 수행합니다 (이미 위에 있음에도 불구하고). 대화식 리베이스 중에는 병합 커밋과 병합을 취소 한 커밋을 모두 제거 할 수 있습니다. 즉, git history에서 두 이벤트를 모두 제거합니다.

이 시점에서 정기적으로하는 것처럼 기능 브레이 치를 병합 할 수있는 깨끗한 '개발'브랜치를 갖게됩니다.


이 방법은 개발 브랜치를 다른 사람과 공유 할 경우 문제를 일으킬 것입니다.
PSR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.