2012-07-19 8 views
7

베타 분기를 마스터 분기에 병합했습니다. 나는 원래로 밀었다. 나는 이제 마스터가 로컬 및 원격으로 합병되기 전과 같이되기를 원합니다.git-revert를 사용하여 푸쉬 된 병합을 취소하기 위해 해시를 커밋하는 것은 무엇입니까?

undoing a merge that was already pushed에 대한 좋은 대답은 내가 commit_hash을 확인하는 방법이 참 길을 가야하는 경우

git revert -m 1 commit_hash 

을 제안? 나는 실패 merge-base에 의해 반환되는 해시 시도 :

$ git merge-base --all master beta 
1f4b949b7ef97abf913ae672e3acd0907abfac1b 
$ git revert -m 1 1f4b949b7ef97abf913ae672e3acd0907abfac1b 
error: Mainline was specified but commit 1f4b949b7ef97abf913ae672e3acd0907abfac1b is not a merge. 
fatal: revert failed 

내가 가지 모두 자식 로그 및 gitk이 렌 디션을 조사했습니다,하지만 그들은 매우 긴 것, 그리고 내가해야한다고 생각하는 나의 해석의 충분한 불확실입니다 아마 더 큰 혼란을 만들기 전에 도움을 요청하십시오. 베타는 마스터에서 파생 된 v2에서 파생되었습니다. 새로운 지사를 마스터와 함께 최신 상태로 유지하면서 마스터가 v2 및 베타로 일부 합병되었습니다. 베타 버전에서 마스터 버전으로의 합병은 실수를 저지른 것입니다.

병합 지점을 결정한 후에 합병 후에 실제로 베타 지점에 있어야하는 커밋을 찾으면이를 옮기는 가장 좋은 방법은 무엇입니까?

+2

다음을 시도하십시오 : log --all --graph --pretty = tformat : '% Cred % h % Creset - % C (노란색) % d % Creset % s % Cgreen (% an % cr) % Creset - abbrev-commit --date = relative' (개인적으로 별칭), 모든 브랜치의 커밋과 날짜, 그리고 머지가 발생한 위치를 표시합니다. –

답변

4

병합 커밋을 찾아야합니다. git merge-base은 병합을 수행 할 수있는 커밋을 알려줍니다. 기본적으로이 두 가지에 존재하는 마지막 커밋입니다. 병합 후에 새 분기를 만들지 않는 한 병합 커밋이 마스터 분기에만 존재하지만 여기서는 관련이 없습니다. :)

가 병합 시도를 저지 찾으려면 : git log master ^beta --ancestry-path --merges

필요한 커밋은 매우 마지막 커밋이다.

그러나 '리누스에 읽어주십시오 최대 쓰기 :