サーチ…
備考
スカッシュって何ですか?
Squashは、複数のコミットを取り、最初のコミットからのすべての変更をカプセル化して単一のコミットに結合するプロセスです。
スカッシュとリモートブランチ
リモートブランチを追跡しているブランチでコミットを抑制するときは、特に注意してください。既にリモートブランチにプッシュされているコミットをスカッシュすると、2つのブランチが分岐し、 git push -f
を使用してリモートブランチにそれらの変更を強制する必要があります。 これがリモートブランチを追跡する他の人に問題を引き起こす可能性があることに注意してください。そのため、潰れたコミットを公開リポジトリまたは共有リポジトリに強制的にプッシュするときは注意が必要です。
プロジェクトがGitHub上でホストされている場合は、 Settings
- Branches
- Protected Branches
追加することで、 master
などの一部の支店で「強制押し込み保護」を有効にすることができます。
リベースなしのスカッシュ最近のコミット
直前のx
コミットを単一のものに縮小する場合は、次のコマンドを使用できます。
git reset --soft HEAD~x
git commit
x
を、squashedコミットに含める前のコミット数で置き換えます。
これにより、 新しいコミットが作成され、作成者、メッセージ、日付を含む以前のx
コミットについての情報が本質的に忘れることに注意してください。おそらく最初に既存のコミットメッセージをコピーペーストしたいと思うでしょう。
リベース中に搾取することを約束する
コミットはgit rebase
中に押しつぶされる可能性があります。このようにしてコミットを縮小しようとする前に、 リベースを理解することをお勧めします。
リベースするコミットを決定し、コミットハッシュに注意してください。
git rebase -i [commit hash]
実行します。別の方法として、次のように入力することができ
HEAD~4
最新の前に、最新のコミットと4以上のコミットを表示するために、代わりにコミットハッシュのを。このコマンドを実行するときに開くエディタで、スカッシュするコミットを決定します。置き換え
pick
持つこれらの行の先頭にsquash
前回のコミットにそれらをスカッシュします。スカッシュするコミットを選択した後、コミットメッセージを書き込むように求められます。
ロギングは、リベースする場所を決定するためにコミットします。
> 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
フラグを使用する必要があります。