私の会社では、最近 git を移動しました。この環境で作業している間に、(ローカル ブランチで) 大量のローカル コミットを作成することになります。コードを最新の状態に保つために、プルを作成します。最終的な結果として、git ログを実行すると、そのログに自分のコミットと他の開発者のコミットが見つかります。コミットをリモートにプッシュする前に、すべてのローカル コミットを収集し、それらを 1 つのコミットにマージして (ログのノイズを減らすため)、リモートにプッシュしたいと考えています。gitでそれを行うにはどうすればよいですか?
3 に答える
最も簡単な方法は、 agit pull
を実行して競合を解決し、すべて最新の状態になったら、ブランチ ポインターを最新のリモート コミット (私はorigin/master
.
git reset --soft origin/master
git commit
新しいコミットは、リモートのマスター コミットの上にある単一の新しいコミットとして、すべての変更になります。その後、このコミットをリモートにプッシュできます。git show
プッシュする前にコミットを検証するために使用します。
注:master
これは、1 つの共有ブランチ ( ) からのみプルしたか、プルした他の共有ブランチが既にリモートの にマージされていることを前提としていますmaster
。
git fetch <remote name>
git rebase -i <remote name>/<branch name>
rebase -i
(インタラクティブなリベース) の使用方法の詳細については、次のガイドを参照してください。
http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
リベース/スカッシュは、マージ コミットで常にうまく機能するとは限らないことに注意してください。リベースすると、マージしたものの後にコミットが移動することが多いため、マージしたコミットがなくなる可能性があり、問題が発生することはありませんが、マージしたものがリモート ブランチにまだない場合は、気をつけろ。
アプローチを変えるべきです。ローカル ブランチでの開発中は、プール (またはフェッチ) を行うべきではありません。むしろ、「メイン」開発ブランチを更新してから、開発ブランチを「メイン」ブランチでリベース (git rebase) してください。
今のところ、あなたが探しているのはgit cherry-pickかもしれません。
また、手動でリセット (git reset --soft) を特定の (開発中の) ブランチの最初のコミットに試行し、次に 1 つのコミットとしてコミットする変更のみを選択することもできます。
ブランチに自分のコミットしかない場合は、問題ははるかに簡単です。それらをスカッシュできます (git squash)。開発ブランチであまり多くのコミットを作成しないためのいくつかの方法は、コミットを修正することでもあります (git ammend)。