2016-09-22 6 views
2

나는 다음과 같은 역사를 가지고 가정 이전에 주목받지 못했습니다. 내가 먼저 모든 권리 장소에 고정합니다 : 그것은 같은 feature와 함께 할 일이 많이하지를 가지고 모든 버그 후이기 때문에,리셋, 체크 아웃, 체리 - 픽, 체크 아웃, 리베이스 조합을 수행하는 더 좋은 방법이 있습니까? 포인트 <code>E</code>에서</p> <pre><code>A ─▶ B -- master ╲ ◀ C ─▶ D ─▶ E -- feature </code></pre> <p>, 나는 엄격하게 <code>feature</code>와는 아무 말하지 않았다 코드의 작은 버그에 stuble하지만,하지만,이 시점에서 중요한 될 일 :

A ─▶ B -- master 
     ╲ 
     ◀ 
     C ─▶ D ─▶ E ─▶ F -- feature 
         ⋮ 
         fix bug 

하지만, 이건 정말 내가 원하는 역사하지 않습니다 - 이 수정은 master에 있어야합니다 (전용 bugfix 분기가 아닌 경우).

git checkout master 
git cherry-pick F 

A ─▶ B ─▶ F' -- master 
     ╲ 
     ◀ 
     C ─▶ D ─▶ E ─▶ F -- feature 

좋아, 좋아,하지만 난 정말이 그것을 떠날 수 없다 (또는 I 수 있습니까?) - F 지금은 아직 병합 할 활성 지점에 두 번 발생합니다. 나는

git checkout feature 
git reset --hard HEAD^ 

A ─▶ B ─▶ F' -- master 
     ╲ 
     ◀ 
     C ─▶ D ─▶ E -- feature 

을 할 수 있었던 master로 다시 feature을 병합 할 때 F' 대기,하지만 난 그것을 필요로하는 버그를 수정 한 바로 사용할 필요가 없기 때문에 그런 짓을하지 않습니다 - feature에 작업을. 그래서 나는 다음

git rebase master 

A ─▶ B ─▶ F' -- master 
      ╲ 
      ◀ 
      C' ─▶ D' ─▶ E' -- feature 

이 본질적으로 하나가 역사에 커밋 이동하는 목표를 달성 복잡하고 다소 오류가 발생하기 쉬운 방법을 느낌으로 마무리합니다.

이 작업을 수행하는 데 더 엄격한 방법이 있습니까?

+2

그런 식으로 작업을 수행 할 때 리셋을 건너 뛸 수 있습니다. 리베이스하면 F 커밋이 이미 존재하고 건너 뜁니다. 그 외의 다른 방법은 없습니다. – 1615903

+0

^- rebit 후에 중복 커밋을 삭제할만큼 똑똑하기 때문에 재설정이 필요하지 않습니다. 좋은 화살 btw –

답변

1

요약

가장 쉬운 방법은 master에 직접 버그를 수정하는 것 (또는 master 기반의 버그 수정 지점에서). master에 bugfix가 포함 된 후 master에 기능 분기를 리베이스 할 수 있습니다. 끝난.

버그 수정 지점 (버그 수정 지점) 상세한 흐름 :

git checkout master && git checkout -b bugfix 

* 98f2c4f (HEAD -> bugfix) bugfix commit 
| * efe77fd (feature1) test2 
|/ 
* 3c3a2ee (master) test 

master으로 bugfix 병합하고 bugfix 삭제 :

git checkout master && git merge bugfix && git branch -d bugfix 

* 98f2c4f (HEAD -> master) bugfix commit 
| * efe77fd (feature1) test2 
|/ 
* 3c3a2ee test 

Rebase 현재 기능 분기 master 상 :

git checkout feature1 && git rebase master 

* e3a55ed (HEAD -> feature1) test2 
* 98f2c4f (master) bugfix commit 
* 3c3a2ee test 
+0

당신은 아마 맞을 것입니다. 그러나'feature '에 대한 버그를 먼저 수정하는 것이 편리합니다. 바로 거기에 대해 실제로 실패한 테스트가 있기 때문입니다. 그 작품을 '기능'에 위임하지 않고'마스터 '에게 양도 할 수있는 좋은 방법이 있을까요? – leftaroundabout

+0

커밋되지 않은 변경 사항을 한 브랜치에서 다른 브랜치로 전송하는 가장 쉬운 방법은 현재 사용중인 커밋에 'git stash'를 사용하고 대상 브랜치에 'git stash pop'을 사용하는 것입니다. 그러나'git stash'는 모든 로컬 수정을 숨기므로주의해야합니다. 버그에만 관심을 가져야합니다. – gucce

1

당신은 자식 체리 복사자식 체리 - 이동 명령을 제공 GitHub의에서 gitl project에 의해 흥미로운 일이 될 수 있습니다. 이것은 git core 명령을 사용하여 더 빨리 수행 할 수 없습니다.

원본 대답 lennartcl에서 this other post에. 제 생각에는