web-dev-qa-db-ja.com

SHAの開始と終了を指定して、一連のgitコミットをまとめて潰すにはどうすればよいですか?

約20のコミットがあるブランチがあります。

ブランチの最初のSHAはbc3c488...
ブランチの最後のSHAは2c2be6...

すべてのコミットをマージするにはどうすればよいですか?

コミットが非常に多いため、インタラクティブなリベースを使用せずにこれを実行したいと思います。

コミットをマージするように求められるgithubプルリクエストにこれが必要です。

ローカルでスカッシュする必要があり、別の開発者がマージを実行し、マージする前に最初にスカッシュを実行するように求めているため、git merge --squashを実行せずにこれを実行する必要があります。

13
Michael Durrant

拳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を使用することを強くお勧めします

4
IgnazioC

ブランチの最初の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
1
Michael Dimmitt

ここでは、インタラクティブなリベースが役立ちます。

あなたのブランチがあなたのアップストリームのマスターブランチに基づいているとしましょう。 (そして、アップストリームが「アップストリーム」リモートによって定義されているとしましょう)

これを行う:

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

0
Jonathan.Brink

git rebaseのインタラクティブシェルを使用して、リベースするコミットを選択的に選択できます。

git rebase -i bc3c488...

次に、スカッシュするコミットを、ピックではなくスカッシュと言うように変更します

チェックアウト https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/

0
pwilmot