2016-10-18 3 views
0

개발자가 실수로 병합에 실패하여 빈 병합 커밋을 푸시하는 문제가 있습니다. 빈 Git 병합 제거 된 커밋

develop ----A----------------------------------F------------------I 
       \        /    /
    feature1 B----------------C----------------------G---------H 
           \   /
feature2 ------------------------D---------E----------------------- 

가 분기 feature1develop 지점에 점 A에서 만들어 졌음을 말해 : 아래 그림을 참조하십시오. 포인트 C에서, feature1feature2으로 통합되었습니다. 그러나 병합이 잘못되어 feature1 (변경 : BC)의 모든 변경을 효과적으로 거부 한 빈 커밋 인 경우 병합 커밋 인 D이 잘못 커밋되었습니다.

E에서, feature2develop으로 합병되었다. 마지막으로 H 지점에서 GH을 가져 오려면 feature1develop에 병합했습니다.

그러나, developC뿐만 아니라 GH을 변경 사항이 B 것이다 지점 I에 예상된다. 그러나, 그들이 병합시 거부되었으므로 나는 C -> D이라고 믿습니다.

실제 시나리오에서 잘못된 병합 이후 여러 분기에서 많은 커밋과 병합이 발생했음을 상기하면서이 시나리오를 수정하는 간단한 방법이 있습니까? 나는 C 포인트에서 중복 develop 브랜치를 생성하고 리베이스 (rebase)와 체리 피킹 (cherry-picking)의 조합을 사용하여이 작업을 수행하고 있습니다. 그러나 이것은 매우 힘든 일이 될 것이므로 상황을 신속하고 안전하게 안전하게 해결할 수있는 방법이 많이 있습니다.

+0

당신은이 커밋이 :

뭔가처럼

단계가 있어야한다 (즉, 잘못된 D 병합뿐만 아니라 BC하지만 마지막 Afeature2 알려진 커밋에서도 develop 역사를 되돌아 주) 당신의 다이어그램에서'G'라고 라벨링되었지만 그들은 다른 것처럼 보입니다. 그 사람은'F'라고 생각 하나? – torek

+0

@torek 네, 맞습니다. 결정된. – Dunnie

+0

당신의 계획이 옳은 길이라고 생각합니다.'git rebase'는'git merge'가 * new * (must-merge) 커밋이라고 생각할 커밋을 복사 할 수 있도록 특별히'-f' /'--no-ff'를 가지고 있습니다. 과거에는 충분히 일종의 재 작업 (체리 선택 또는 시간 병합)에 직면하게됩니다. – torek

답변

0

이 인스턴스를 수정하기 위해 수행해야 할 일이 빠르고 안전하다고 생각하지 않습니다.

향후 인스턴스를 피하려면 rebase-heavy 워크 플로우를 생각해보십시오. 메인 라인에 추가 할 때만 병합됩니다.

또한 많은 기능의 근본 원인이 될 수있는 기능이 오래 지속 된 것 같습니다.

행운을 비네. 당신이 D'로 올바르게 병합 D을 다시 실행 한 후 D하고 문제를 해결해야 D' 사이 I 차이에 적용 할 경우

0

나는 생각한다.

git checkout -b tmp_fix D~1 
git merge C 
# now, you have correct D', but you should make it child of D to pick it 
git reset --soft D 
git commit -m "Fix incorrect merge D" 
git checkout develop 
git cherry-pick tmp_fix 
관련 문제