それで、私がメインブランチを持っているとしましょう、私たちは「マスター」と呼びます。「新機能」というブランチを作成しました。このブランチで大量のコミットを行ったので、時間を遡ることができますが、機能の開発中にかなりの作業を行ったため、コミットログはかなり乱雑になっています。
たとえば、gitdiffmaster..new-featureを見るとしたら。
2つのブランチ間のすべての変更を含む「master」に新しいコミットを1つだけ作成したい場合、それを行うための最も効率的な方法は何ですか?
git checkout master
git merge --squash new-feature
git commit
コミットメッセージは、マージ/スカッシュされているコミットのリスト全体を表示することから始まりますが、もちろん、それを編集して必要なものにすることができます。
より適切に機能する可能性のある別のオプションは、 でパッチ ファイルを生成しgit diff --patch > "patch filename"
、git apply "patch file name"
.
git-diff のマニュアル ページ (特に「-p を使用したパッチの生成」): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html
git-apply の man ページ: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html
これには、インタラクティブなリベースを使用できますgit rebase --interactive
。次に、スカッシュオプションを使用します。コミットからの更新のみを使用し、コミットは作成しません。
git rebase --interactive HEAD~ を使用します (スカッシュしたいコミットの数に関係なく)。例: git rebase --interactive HEAD~5。これにより、最後の 5 つのコミットが読み込まれ、メッセージを含むエディター ウィンドウが表示されます。各メッセージには、先頭に「pick」が付きます。最後のメッセージに移動し、'pick' を 'squash' に変更して終了します。コミット メッセージを求める新しいウィンドウが開きます。これは、スカッシュ コミットの新しいコミット メッセージになります。終了すると、すべてのコミットが 1 つの新しいコミットに押しつぶされます。
ここに例があります: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
機能ブランチのすべてをコミットしてから、すべての変更に対して「自分のもの」を受け入れるマスターにマージできます。
これを行う方法に関する優れた回答を含むスタック オーバーフローの質問を次に示します。 「git merge -s ours」の「theirs」バージョンはありますか?