約20のコミットがあるブランチがあります。
ブランチの最初のSHAはbc3c488...
ブランチの最後のSHAは2c2be6...
すべてのコミットをマージするにはどうすればよいですか?
コミットが非常に多いため、インタラクティブなリベースを使用せずにこれを実行したいと思います。
コミットをマージするように求められるgithubプルリクエストにこれが必要です。
ローカルでスカッシュする必要があり、別の開発者がマージを実行し、マージする前に最初にスカッシュを実行するように求めているため、git merge --squashを実行せずにこれを実行する必要があります。
拳SHA is HEADの場合、このアプローチを使用することもできます。
git reset --soft $OLD_SHA; git add -A; git commit --amend --no-edit
注意してください。このコマンドはリポジトリの履歴を変更します。
履歴の途中にあるコミットを潰したい場合:
|---* --- 0 --- 1 ---- 2 --- 3 --- * --- * --- * --- HEAD
この場合のように、コミット1、2、3
rebase -i
を使用することを強くお勧めします
ブランチの最初のSHAはbc3c488.。
ブランチの最後のSHAは2c2be6.。
# non dangerous implementation that creates a new branch.
git checkout 2c2be6
git rebase -i bc3c488~
git checkout -b your_new_squashed_branch
# then squash the commits by replacing the pick with s
コミットの最後のティルダ(〜)は、前のコミットを意味します。
コミットbc3c488がインタラクティブリベースに表示されるようにします。
# dangerous implementation that rewrites history
git checkout -b new_branch_with_rewritten_history
git reset --hard 2c2be6
git rebase -i bc3c488~
# then squash the commits by replacing the pick with s
ここでは、インタラクティブなリベースが役立ちます。
あなたのブランチがあなたのアップストリームのマスターブランチに基づいているとしましょう。 (そして、アップストリームが「アップストリーム」リモートによって定義されているとしましょう)
これを行う:
git rebase -i upstream/master
より正確にする必要がある場合は、「upstream/master」を任意のSHA.
git rebase -i bc3c488
$ EDITOR環境変数で定義されたエディターに配置されます。一番上の行を除くすべての行で、「pick」を「squash」(または略して「s」)に変更します。これは、これらすべてのコミットを1つに押しつぶしています。
他の作業ラインに対するマージまたはリベースと同様に、コードの競合が発生する可能性があります。これが発生した場合は、「git status」を実行して競合するファイルを確認し、それらのファイルを編集して(競合は<<<および>>>記号で区切られます)、「gitrebase--continue」を実行します。
リプレイコミットを一度に1つずつリベースします。同じ競合を何度も修正していることに気付いた場合は、このことに注意してください(これを支援するツールもあります)。
次に、新しい押しつぶされたコミットのコミットメッセージを編集する機会が表示されます。
-fを使用してリモートブランチにプッシュします(これにより、必要な履歴が書き換えられますが、これには注意してください)。
これは、インタラクティブなリベースに関する非常に優れたチュートリアルです: https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase-i
git rebaseのインタラクティブシェルを使用して、リベースするコミットを選択的に選択できます。
git rebase -i bc3c488...
次に、スカッシュするコミットを、ピックではなくスカッシュと言うように変更します
チェックアウト https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/