サーチ…


備考

スカッシュって何ですか?

Squashは、複数のコミットを取り、最初のコミットからのすべての変更をカプセル化して単一のコミットに結合するプロセスです。

スカッシュとリモートブランチ

リモートブランチを追跡しているブランチでコミットを抑制するときは、特に注意してください。既にリモートブランチにプッシュされているコミットをスカッシュすると、2つのブランチが分岐し、 git push -fを使用してリモートブランチにそれらの変更を強制する必要があります。 これがリモートブランチを追跡する他の人に問題を引き起こす可能性があることに注意してください。そのため、潰れたコミットを公開リポジトリまたは共有リポジトリに強制的にプッシュするときは注意が必要です。

プロジェクトがGitHub上でホストされている場合は、 Settings - Branches - Protected Branches追加することで、 masterなどの一部の支店で「強制押し込み保護」を有効にすることができます。

リベースなしのスカッシュ最近のコミット

直前のxコミットを単一のものに縮小する場合は、次のコマンドを使用できます。

git reset --soft HEAD~x
git commit

xを、squashedコミットに含める前のコミット数で置き換えます。

これにより、 新しいコミットが作成され、作成者、メッセージ、日付を含む以前のxコミットについての情報が本質的に忘れることに注意してください。おそらく最初に既存のコミットメッセージをコピーペーストしたいと思うでしょう。

リベース中に搾取することを約束する

コミットはgit rebase中に押しつぶされる可能性があります。このようにしてコミットを縮小しようとする前に、 リベースを理解することをお勧めします。

  1. リベースするコミットを決定し、コミットハッシュに注意してください。

  2. git rebase -i [commit hash]実行します。

    別の方法として、次のように入力することができHEAD~4最新の前に、最新のコミットと4以上のコミットを表示するために、代わりにコミットハッシュのを。

  3. このコマンドを実行するときに開くエディタで、スカッシュするコミットを決定します。置き換えpick持つこれらの行の先頭にsquash前回のコミットにそれらをスカッシュします。

  4. スカッシュするコミットを選択した後、コミットメッセージを書き込むように求められます。

ロギングは、リベースする場所を決定するためにコミットします。

> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

> git rebase -i 36d15de

この時点で、選択したエディタがポップアップして、コミットで何をしたいかを記述することができます。 Gitはコメントのヘルプを提供します。あなたがそれをそのままにしておくと、すべてのコミットが保持され、その順序がリベースの前と同じになるので、何も起こりません。この例では、次のコマンドを適用します。

pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed

# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

コミットメッセージの書き込み後のGitログ

> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

Autosquash:リベース中にスカッシュしたいコードをコミットする

次のような歴史を考えると、あなたがコミットしたい変更をしたと想像してくださいbbb2222 A second commit

$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

変更を加えたら、いつものようにそれらをインデックスに追加して、 - --fixup引数を使ってスカッシュするコミットへの参照を加えてコミットすることができます:

$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit

これは、Gitがインタラクティブなリベース中に認識できるコミットメッセージで新しいコミットを作成します:

$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

次に、-- --autosquash引数を使用して対話型のリベースを--autosquashます。

$ git rebase --autosquash --interactive HEAD~4

Gitはあなたが作っコミットスカッシュすることができ提案しますcommit --fixup正しい位置へ:

pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit

すべてのリベースで--autosquashと入力しないようにするには、このオプションをデフォルトで有効にします。

$ git config --global rebase.autosquash true

マージ中に搾取することを約束する

git merge --squashを使用すると、ブランチによって導入された変更を1回のコミットにgit merge --squashせることができます。実際のコミットは作成されません。

git merge --squash <branch>
git commit

これは、 git resetとほぼ同じですが、組み込まれる変更にシンボリック名が付いている方が便利です。比較:

git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit

自動車洗浄およびフィックスアップ

変更をコミットするとき、コミットが将来他のコミットに押しつぶされることを指定することが可能であり、そうすることができます。

git commit --squash=[commit hash of commit to which this commit will be squashed to]

フィックスアップの代わりに、--fixup --fixup=[commit hash]使うこともできます。

また、コミット・ハッシュの代わりにコミット・メッセージの単語を使用することもできます。

git commit --squash :/things

そこでは、「物」という言葉を用いた最新のコミットが使用される。

これらのコミットのメッセージは'fixup!'始まります'fixup!'または'squash!'これらのコミットが押しつぶされる残りのコミットメッセージが続きます。

--autosquashするときには、autosquash / fixup機能を使用するために--autosquashフラグを使用する必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow