2010-03-25 6 views
11

커밋이 있습니다. 특정 브랜치에만 있어야하기 때문에 분기에 저장했습니다.Git에서 분기에서 커밋을 제외합니다.

내가 지점 마스터에 병합했는데, 로컬로 사용하는 지점 dev가 아닙니다.

이제 실수로 마스터를 dev에 병합하고 dev에이 커밋을 도입했습니다.

내가 dev에 지점을 dev에 되돌릴 수있는 사실을 알고 있습니다; 그러나 이것은 커밋을 취소하는 커밋을 소개 할 것이기 때문에 (나는 추측하고있다, 나는 정확히 이것을 시도하지 않았다), 내가 마스터를 병합 할 때,이 커밋 역시 취소 될 것인가?

그렇다면, 어떻게 분기 dev에서만이 커밋을 취소 할 수 있습니다.

오, git reset HEAD^1 - 불필요한 커밋 이후 마스터에 다른 커밋이 있기 때문에 --hard는 옵션이 아닙니다.

다시 적용하고 적용하는 것이 유일한 옵션 인 경우, 불필요한 커밋이 아닌 다른 추가 커밋 만 병합하는 방법은 무엇입니까?

업데이트 : 여기

은 커밋 나무입니다. 복잡한 것처럼 보입니다. 나는 개발자에게 필요하지 않은 커밋을 지적했다. (개인 식별 정보도 삭제 했으므로 이해해 주셔서 감사합니다. 아스키 아트보다 화면 캡처가 훨씬 간단합니다.)

미리 감사드립니다.

+1

그것은 ASCII 예술을하는 아니에요이로 가능 병합 커밋이 원하지 않는 커밋과 관련하여 어디에서 발생했는지 완전히 알 수 있습니까? –

+0

svn에서는 1-19, 49, 52-90 버전의 리비전 범위를 병합 할 수 있습니다.이 작업은 git에서도 할 수 있습니다. – SeanJA

+1

@SeanJA : svn과 유추가 가장 좋은 방법이라고 확신하지 않습니다. 특히 git을 사용하면'A - B - C '로 시작하고'B'를 제거하여'A - C '를 얻는다면'C'커밋은'C'커밋과 동일하지 않습니다. 같은 부모가 없습니다. 따라서 원래의 커밋과 빠져있는 커밋으로 구성된 두 번째 분기를 구성한 다음 병합 할 수는 있지만 원래 분기를 병합하지는 않습니다. – Cascabel

답변

16

분기의 스크래치 사본에 git rebase --interactive을 복사하고 원하지 않는 커밋을 삭제하십시오. 또는 원하지 않는 커밋의 업스트림에 새로운 브랜치를 만들고 git cherry-pick을 원하는 커밋으로 만들 수 있습니다.

더 많은 방법이 있습니다.

2

git reflog, 그러면 git reset --hard는 실수를 되돌리기위한 친구입니다.

  • 은 가정 : 머리에 지점 B에서 병합 A는 분기를 병합 할 때 커밋이 난 그냥 내 프로젝트에서 사용했던 것입니다 단일 피하기 위해

    .

  • 커밋의 revid를 확인 피해야하는 (R0)
  • R0 직전에 커밋의 revid를 확인 (R1)

    git merge <R1> 
    git merge -s ours R0 
    git merge B 
    
관련 문제