1つの機能で複数のブランチで作業している場合は、git pull branch1 branch2 branch3
すべての変更をマスターブランチにプルするために使用します。ただし、各ブランチのすべてのコミットログもコピーされます。コミットログを単一のメッセージにフラット化するにはどうすればよいですか?
3 に答える
「gitmerge--squash」(「gitfetch」の後。「gitpull」は単にfetch + mergeであり、おそらく--squashオプションも許可されます)が必要な場合があります。
git-merge(1)から:
- 押しつぶす
実際のマージが発生したかのように作業ツリーとインデックスの状態を生成しますが、実際にコミットしたり、HEADを移動し
$GIT_DIR/MERGE_HEAD
たり、次のgitcommitコマンドでマージコミットを作成するように記録したりしないでください。これにより、現在のブランチの上に単一のコミットを作成できます 。その効果は、別のブランチ(タコの場合はそれ以上)をマージするのと同じです。
インタラクティブなリベースを使用して、コミットを「スカッシュ」できます。 rebase によるスカッシングに関する Git Ready チュートリアルも参照してください。リンクを張って申し訳ありませんが、それはかなり徹底したチュートリアルです。ああ、これでマージもうまく押しつぶされます。
Brian White がコメントしたように、問題git merge --squash
は、目に見えるリンクが表示されないため、マージしたブランチ (または個々の変更) まで追跡できないことです。
視覚的に (グラフとして表示した場合git log --graph
)、マージされた重要なブランチは、いじって喜んで破棄する実験的なブランチと何ら変わりはありません。両方とも、何にも接続されずにぶら下がっているだけです。私は個人的に、特定のブランチがマージされたことを知りたいので、作業が完了したことを知っています。
私にとって有効な解決策は、no-fastforward オプションを指定してマージを使用することです。
git merge --no-ff somebranch -m "my commit message"
これにより、git はすべてのブランチの変更を含む単一のコミットを強制的に作成します。(必要に応じて) コミット メッセージを自分で設定できますが、最も重要なのは、新しいコミットをマージしたばかりのブランチにリンクすることです。そのブランチは完了していますが、マージされたブランチから個々のコミットの詳細を確認するためにトレースバックすることもできます。
これは、それぞれ 1 つと 2 つのコミットを持つ非常に単純なブランチがマスターにマージされた例です。その後、マージされたブランチのブランチ タグを削除しましたが、ブランチ名はマージ コミット メッセージに表示されたままです。ブランチ名は変更を要約する必要があり、含まれている正確な変更を知りたい場合は、個々のコミットまでさかのぼることができます。このアプローチは、単純なプロジェクトではうまく機能するようです。
注 : コネクタの 1 つを手動で描画する必要がありました。これは、コネクタが非常に濃い青色で、ほとんど見えなかったからです。