2016-11-29 4 views
3

フィーチャーが進化するにつれて、多くの紆余曲折で成長し成長した機能ブランチを持っています。個別に解放可能なチャンクを自分の枝に分けたいと思っています。Git:大規模で面倒な機能ブランチを小さなブランチに分割する

コミットは、コミットで選択することでそのようなブランチを構築するのに十分なほどクリーンではありません(複数のファイルを処理するコミットがありますが、そのうちいくつかは選択したい)。私はインタラクティブなリベース、ハンク編集などでは手の平になっていますが、これを行うより良い方法があるのだろうかと思います。

私の最初の考えは、元のフィーチャブランチのコピーであるブランチを作成し、すべてを1にコミットし、以前のコミットにリセットします(コミットされていない未処理のブランチを自分の作業ツリーに残します)私が望む部分を追加してコミットする。エディタで

$ git co -b partial-feature 
$ git rebase -i HEAD~170 

pick 234e78fa Begin writing feature 
f 7844c437 Add more stuff 
f 3523437 And even more 
... 

その後、

$ git reset HEAD~ 
$ git add first_good_change.rb 
$ git commit -m 'Add a good change' 
$ git add second_good_change.rb 
$ git commit -m 'Add another good change' 
... 

は賢く方法はありますか?

+1

私はいつもそうです:) –

+0

はい。あなたは何らかの形で分裂を行う必要があるように思えます。そして、あなたはあなたのための最少のステップで道を見つけました。 –

答えて

3

これは基本的にはかなりうまいですが、少し単純にすることができます。

私の最初の考えはスタートにソフトリセットと同等です前回のコミット

にリセット、それはだ、すべてが1にコミットスカッシュ、本来の機能ブランチのコピーでブランチを作成することです支店のこれはリベースとその後のリセットの代わりに、単一のコマンドです。

ここで、startは、ブランチを開始するSHA1です。 これはHEAD~170とは異なります。170を計算する必要がないので、単にgit logを確認し、適切なSHA1を見つけてください。この後

は、あなたが行ったように継続:

git add first_good_change.rb 
git commit -m 'Add a good change' 
git add second_good_change.rb 
git commit -m 'Add another good change' 

のように。あなたがしたい場合は任意の時点で、あなたはたとえば、簡単に自分の仕事を作り、少しずつ校閲変化に発揮するために、別の機能ブランチを続けることができますように

git checkout -b partial-feature-round-2 
git add more_good_change.rb 
git commit -m 'Add a good change' 
git add even_more_good_change.rb 
git commit -m 'Add another good change' 

とします。 partial-featureがマージされる前に、確認のためにpartial-feature-round-2を投稿しないようにしてください。

元のブランチのすべてがコミットされた後、 プロジェクトの内容は元のブランチと同じになります。 履歴が異なるように見えます。 このような履歴をスライスしてダイスするのは完全に正常です。

このようにブランチを小規模なブランチに分割することは常に可能ではありません。例えば、変更があまりにも関連している場合は、 などのように、まだ機能するチャンクに分離することは困難です。 つまり、コードレビューのためにpartial-featureを投稿すると、 がコンパイルされ、完全に機能するようになりました。 これは変更が複雑すぎると達成するのが難しいかもしれません。

最後のヒント:多段階コードレビューの部分分岐を構築中、 部分的な機能がまだ動作し、コードレビュー可能な状態であることを簡単に確認するには、残りの変更を隠してコンパイルし、テストを実行する。ブランチがコードレビューの準備ができていれば、プルリクエストを作成して、次の段階に進み、隠しをポップしてさらにコミットを追加することができます。

+0

ソフトリセットのニースキャッチ。 –

2

あなたの方法はかなり良いですし、これらのケースのかなりの数のために私が行くだろうかなり多くの正確なアプローチです。ただし、ファイルごとにコミットするのではなく、複数のファイルに変更を同時にコミットする場合は、1つのウィンドウをgit add -iに、次に2番目をgit commit対話的に変更しておくとよいでしょう。


書き換えとgit add sが特に厄介得たとき、私は過去に使用した、私は示唆している唯一の選択肢は、レポのうち、最終的なファイルをコピーすることが作業を含む枝を(ロールバックう木)、その後、選択的には、中以上のものとgit commit -amのものをコピーするような何か:。

# starting from branch with messy commit histories 
cp file1 file2 file3 [...] ~/final_versions 
git reset --hard <good_commit> 
vim -p file1 file2 file3 [...] ~/final_versions/* 

とその間に、別のウィンドウ、git commit -amに。

関連する問題