web-dev-qa-db-ja.com

Gitマージのフラット化

1つの機能の複数のブランチで作業している場合、git pull branch1 branch2 branch3を使用してすべての変更をマスターブランチにプルします。ただし、各ブランチのすべてのコミットログもコピーされます。コミットログを1つのメッセージに統合するにはどうすればよいですか?

41
Verhogen

インタラクティブな rebase を使用してコミットを「スカッシュ」できます- rebaseによるスカッシュに関するGit Readyチュートリアル も参照してください。リンクをダンプするだけで申し訳ありませんが、これはかなり完全なチュートリアルです。ああ、これでマージもうまくいきます。

25
Pat Notz

"git merge --squash"( "git fetch"の後; "git pull"はfetch + mergeにすぎません、おそらく--squashオプションも許可されます)mightあなたが望むものになる。

git-merge(1) から:

- 押しつぶす

実際のマージが発生したかのように作業ツリーとインデックスの状態を生成しますが、実際にコミットを行ったり、HEADを移動したり、$GIT_DIR/MERGE_HEADを記録して次のgit commitコマンドでマージコミットを作成したりしないでください。これにより、現在のブランチの上に1つのcommitを作成できます。その効果は、別のブランチ(タコの場合はさらに)をマージするのと同じです。

71
Jakub Narębski

ブライアンホワイトがgit merge --squashは、目に見えるリンクがないため、マージしたブランチ(または個々の変更)に戻るトレーサビリティがないことです。

視覚的に(グラフとして表示した場合git log --graph)、マージされた重要なブランチは、いじくって実験的に破棄した実験的なブランチと同じように見えます。どちらも何にも接続されていない状態でぶら下がっています。私は個人的に、特定のブランチがマージされて戻ってきたので、作業が完了したことを知りたいと思っています。

私にとって有効な解決策は、no-fastforwardオプションを使用してマージを使用することです。

git merge --no-ff somebranch -m "my commit message"

これはgitにすべてのブランチの変更を含めて単一のコミットを作成することを強制します(必要に応じて)コミットメッセージを自分で設定できますが、最も重要なのは、マージしたばかりのブランチに新しいコミットをリンクすることです。そのブランチでは完了ですが、マージされたブランチからの個々のコミットの詳細をトレースして確認することもできます。

これは、それぞれ1つと2つのコミットを持つ非常に単純なブランチがマスターにマージされた例です。その後、マージされたブランチのブランチタグを削除しましたが、ブランチコミットメッセージにブランチ名が表示されます。ブランチ名は変更を要約する必要があり、含まれている正確な変更を知りたい場合は、個々のコミットまで追跡できます。このアプローチは、単純なプロジェクトではうまく機能するようです。

注:コネクターの1つを手動で描画する必要がありました。これは、非常に濃い青色で、ほとんど見えなかったためです。

git log output

8
samaspin