Git Squash すべてのコミット
すべての開発者の生活の中で、スカッシュ
という言葉は、Git 分散制御システムで作業しているときに頻繁に使用されます。 Git のこの機能は便利なオプションであり、多くの場合、開発者チームでのきちんとしたワークフローのために開発者によって使用されます。
このブロックでは、Git の主な機能である Squashing
について詳しく説明します。 さらに、開発者チームと協力しながら、つぶすプロセスとなぜそれが必要なのか。
Git スカッシュ
まず、スカッシュとは何かを知る必要があります。 一般に、つぶすとは、何かを利用可能なすべてのものと混ぜ合わせることです。
Git では、squash
という用語は、コマンド ラインを使用してさまざまなコミットを 1つのコミットに結合するために使用されます。 そして、この機能により、物事は先入れ先出しの正しい順序に保たれます。
以下の例を使用して、コミットでのスカッシュとシーケンスの順序を説明しましょう。
A ◄───── B ◄──── C ◄───── D
After Squashing commits B, C, and D:
A ◄───── E
Commit E includes the commits B, C, and D changes.
すべてのコミットを新しい commit E
にマージするとしましょう。 commit E
は、commit B、C、および D
で行われた変更を含みます。
スカッシングは、より長いライフ サイクルでブランチ グラフを整理するために特別に行われます。
アプリケーションで新しい機能を使用する場合、目的の結果が得られるまでにいくつかのコミットを行うことは明らかです。 これは、品質保証チームまたはいくつかのテストによって報告されたバグの修正である可能性があります。
これらの機能を適用した後、ブランチがコミットでごちゃごちゃに見える不必要なコミットをいくつか収集しました。 このシナリオでは、そのリポジトリ ブランチでスカッシュを行います。
これらの冗長なコミットを 1つにまとめるのに役立ちます。
ここで覚えておくべき主なポイントは、squash
は Git コマンドではないということです。 ただし、これは必須の Git 操作です。
git squash
を実行すると、エラーが発生します。これは単なる操作であり、Git の interactive rebase
コマンドで実行できるためです。
Git Interactive Rebase を使用してすべてのコミットをスカッシュする
Git の interactive rebase
機能を使用すると、ブランチ ライフ サイクルの任意の時点で、いつでも手動でコミットを破棄できます。 エイリアスslog
を使用して以下のコマンドを実行することから始めましょう。これにより、コンパクトなコミットログを表示できます。
git config --global alias.slog = log --graph --all --topo-order --pretty='format:%h %ai %s%d (%an)'
出力:
$ git slog
* ac1sd5f 2022-02-11 11:09:15 +0600 Commit D (HEAD -> master) (test)
* 5dasq6f 2022-02-11 11:09:02 +0600 Commit C (test)
* 5asa04d 2022-02-11 11:09:02 +0600 Commit B (test)
* c40as62 2022-02-11 11:10:56 +0600 Commit A (test)
* 29awqc5 2022-02-11 11:10:33 +0600 BugFix #1 (test)
* 3asafeb 2022-02-11 11:10:19 +v Feature1 implemented (test)
* cbas10d 2022-02-11 11:26:19 +0600 Init commit (test)
ここで、Git コマンド Interactive Rebase
は、関連するすべてのコミットをデフォルトのエディターでシーケンス順に表示します。 ここでは、Git コマンドを使用して、これらのコミットを押しつぶし、制御し、エディターに保存します。
以下は、最後の X
コミットをスカッシュするために使用されるコマンドです。
git rebase -i HEAD~[X]Copy
最後の 4つのコミットを押しつぶしたいので、上記のコマンドのように、X
の代わりに 4 を指定します。
git rebase -i HEAD~4Copy
最後の X コミット
と言うとき、最後の x
が 先頭
から最後までコミットすることを意味します。
インタラクティブなリベースの結果として、Git のデフォルト エディターが起動し、1つのコミットにする必要があったコミットを押しつぶし始めます。 コマンドpick
でリストされているコミットは、スカッシュしたいものです。
ここで、コミットのコマンド ピックを s
または squash
に変更して、これらのコミットがスカッシュされるようにします。
その後、変更を保存してエディターを閉じます。 git rebase
操作は、指示に従って実行されます。
$ git rebase -i HEAD~4
[detached HEAD fa29cd5] Commit A
Date: Tue Sep 04 11:10:11 2022 +0600
1 file changed, 1 insertion(+), 1 deletion(-)
Successfully rebased and updated refs/heads/master.
リベースが正常に実行されました。 念のため、次のように git slog
コマンドをもう一度実行して、コミット ログを確認できます。
$ git slog
* f9SAEd5 2022-05-22 4:09:02 +0600 Commit A (HEAD -> master) (test)
* 29aS6c5 2022-05-22 4:09:02 +0600 BugFix #1 (test)
* 34faseb 2022-05-22 4:09:02 +0600 Feature1 implemented (test)
* cbadw0d 2022-05-22 4:09:02 +0600 Init commit (test)
上記の出力ウィンドウでわかるように、最後に、最後の 4つのコミットが 1つにまとめられ、開発者が 4つの異なるコミットすべてを 1つの機能コミットにまとめることは簡単になりました。
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn