왜 git revert가 누락 된 -m 옵션에 대해 불평합니까?


185

그래서 다른 사람들과 프로젝트를 진행 중이며 github 포크가 여러 개 있습니다. 누군가 문제를 해결하고 포크와 병합했지만 더 나은 솔루션을 찾을 수 있음을 깨달았습니다. 방금 만든 커밋을 되돌리고 싶습니다. 이 작업을 시도했지만 git revert HEAD이 오류가 발생했습니다.

치명적 : Commit <SHA1>은 병합이지만 -m 옵션이 제공되지 않았습니다.

그게 무슨 뜻이야? 병합하고 커밋 할 때 -m 옵션을 사용하여 "<username>과 병합"이라고했습니다.

내가 여기서 뭘 잘못하고 있니?

답변:


217

기본적 git revert으로 병합 커밋을 실제로 의미하는 것이 모호하기 때문에 되돌리기를 거부합니다. 나는 당신 HEAD이 실제로 병합 커밋 이라고 가정합니다 .

병합 커밋을 되돌리려면 병합의 부모를 메인 트렁크로 간주하려는 것, 즉 되돌릴 대상을 지정해야합니다.

예를 들어, 당신이 켜져 master있고 git merge unwanted의 병합을 되돌리기로 결정한 경우, 이것은 종종 부모의 번호가 될 것 입니다 unwanted. 첫 번째 부모는 병합 전 master지점이고 두 번째 부모는 팁입니다 unwanted.

이 경우 다음을 수행 할 수 있습니다.

git revert -m 1 HEAD

4
알았어 고마워. 병합의 영향을받은 두 파일을 변경 한 다음 다른 변경 사항도 커밋하는 것이 더 쉽다는 것을 알았습니다.
icnhzabot

43
-m1 또는 -m2 중 어느 것을 사용해야하는지 어디에서 정보를 찾을 수 있습니까? ...
Patrick Cornelissen

34
git cat-file -p [MERGE_COMMIT_ID]부모 분기를 순서대로 표시합니다. 나열된 첫 번째 -m 1는 두 번째 -m 2입니다.
nostromo

2
git revert [HASH] -m 2분기 1.x-1.x에서 커밋 할 항목이 없으며 작업 디렉토리를 정리하지만 커밋이 되 돌리지 않습니다.
jenlampton

3
따라서 10 개 이상의 병합을 되돌려 야하는 경우 (다른 개발자의 변경 사항을 가져올 때마다 git이 자동으로 병합을 수행하기 때문에) 모든 단일 병합 마다이 작업을 수행해야합니까? 되돌리기가 기본적으로 쓸모가 없기 때문에 git 팬이 rebasing에 너무 열중하는 이유입니까?
Neutrino

46

다른 사람이 foo 위에 bar를 만들었지 만 그 동안 baz를 만든 다음 병합하여

git lola
* 2582152 (HEAD, master) 병합 지점 'otherguy'
| \  
| * c7256de (otherguy) 바
* | b7e7176 바즈
| /  
* 9968f79 foo

참고 : git lola 는 비표준이지만 유용한 별칭입니다.

주사위 없음 git revert:

$ 자식 되돌리기 헤드
치명적 : Commit 2582152 ...는 병합이지만 -m 옵션이 제공되지 않았습니다.

찰스 베일리는 평소처럼 훌륭한 대답을 했습니다. git revert에서와 같이 사용

$ git revert --no-edit -m 1 머리
[마스터 e900aad] "병합 지점 'otherguy'"되돌리기
 파일 0 개 변경, 삽입 0 개 (+), 삭제 0 개 (-)
 삭제 모드 100644 bar

효과적으로 bar역사를 삭제 하고 생성

git lola
* e900aad (HEAD, master) "병합 지점 'otherguy'"되돌리기
* 2582152 'otherguy'병합 지점
| \  
| * c7256de (otherguy) 바
* | b7e7176 바즈
| /  
* 9968f79 foo

그러나 병합 커밋 을 버리고 싶다고 생각합니다 .

$ git reset-하드 헤드 ^
HEAD는 현재 b7e7176 baz에 있습니다

git lola
* b7e7176 (HEAD, 마스터) baz
| * c7256de (otherguy) 바
| /  
* 9968f79 foo

에 설명 된대로 git rev-parse수동

<rev>^, 예를 들어 HEAD ^,v1.5.1^0 개정 매개 변수
의 접미 ^부는 해당 확약 오브젝트의 첫 번째 상위를 의미합니다. n 번째 부모를 ^<n>의미합니다 ( 즉, 와 동일 함 ). 특수 규칙으로, 커밋 자체를 의미하며 커밋 객체를 참조하는 태그 객체의 객체 이름 이 사용될 때 사용됩니다 . <rev>^<rev>^1<rev>^0<rev>

그래서 호출하기 전에 git reset, HEAD^(나 HEAD^1) b7e7176이고 HEAD^2, c7256de이었다 각각 병합의 제 1 및 제 2 부모 커밋.

git reset --hard작업을 파괴 할 수 있으므로 주의하십시오 .


3
혼란스럽고 혼란스럽고 세상을 뒤흔들 었습니다. 롤라 만 빼고 이 환상적인 별명에 대해 백만 감사합니다.
Barney

lolagit 명령 에 추가 하는 쉬운 방법 :git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs

8

나는이 문제가 있었고 해결책은 커밋 그래프 (gitk를 사용하여)를보고 내가 다음을 가지고 있음을 보는 것이었다.

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

나는 지금하고 싶다는 것을 이해한다

git cherry-pick -m 2 mycommitsha

브랜치 y를 기준 -m 1으로 -m 2병합 할 때 즉, 체리 피킹하려는 공통 부모를 기반으로 병합 하기 때문 입니다 .


1
아마도 관련이 없기 때문에이 git-revert질문에 관한 것입니다.
pnomolos

1
이 질문은 -m독점적으로가 아니라 옵션에 관한 것 git merge입니다. 즉, -m옵션 사용에 대한 추론 은 되돌리기 및 체리 픽에 대해 비슷한 것으로 보입니다. 사실이 아닌 경우 알려주십시오. 체리 픽 사용을 구체적으로 다루는 다른 질문을 찾지 못했기 때문에이 답변에 감사드립니다.
nealmcb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.