Git でのコミット スカッシングをマスターする:
プロジェクトに取り組んでいると、コミット履歴が多数の小さなコミットで乱雑になることがあります。これらのマイナーなコミットにより、変更を確認したり、プロジェクト履歴を理解したりすることが困難になる場合があります。
Git では、最後の N 個のコミットを 1 つのコミットにまとめて、よりクリーンで管理しやすい履歴を作成できます。このガイドでは、これを達成してバージョン管理をより効率的にするための手順を説明します。
指示 | 説明 |
---|---|
git rebase -i HEAD~N | 最後の N 個のコミットの対話型リベースを開始します。 |
pick | インタラクティブなリベース中にコミットをそのまま維持します。 |
squash | インタラクティブなリベース中にコミットを前のコミットと結合します。 |
sed -i '1!s/pick/squash/' .git/rebase-merge/git-rebase-todo | リベース Todo リストの最初のコミットを除くすべてのコミットについて、「pick」を「squash」に自動的に置き換えます。 |
git rebase --continue | 競合を解決した後、リベース プロセスを続行します。 |
git rebase --abort | リベースプロセスを中止し、リベース開始前の状態に戻します。 |
HEAD~N | 現在の HEAD の N 個前のコミットを参照します。 |
Git コミット スカッシングを理解する
最初のスクリプトでは、 git rebase -i HEAD~N 最後の N 個のコミットの対話型リベースを開始します。インタラクティブ画面では、結合するコミットの「pick」を「squash」に置き換えます。このプロセスは、複数の小さなコミットを 1 つに統合するのに役立ち、コミット履歴がクリーンになり、管理しやすくなります。編集後、保存してエディタを閉じます。競合がある場合は、競合を解決して続行します。 git rebase --continue。
2 番目のスクリプトは、スカッシュ プロセスを自動化する Bash スクリプトです。まず、コミット数 (N) が指定されているかどうかを確認します。それから、それは実行されます git rebase -i HEAD~N そして使用します sed リベース Todo リストの最初のコミットを除くすべてのコミットについて、「pick」を「squash」に置き換えます。これにより、ファイルを手動で編集することなく、複数のコミットを簡単に潰すことができます。最後に、次のようにしてリベース プロセスを続行します。 git rebase --continue、必要な競合解決を自動的に処理します。
Git Rebase を使用して複数のコミットを 1 つにまとめます
Git コマンド
git rebase -i HEAD~N
# Replace N with the number of commits you want to squash
# In the interactive rebase screen that appears, change 'pick' to 'squash' (or 's') for the commits you want to squash
# Save and close the editor
# Edit the commit message if needed, then save and close the editor again
# If there are conflicts, resolve them and then run
git rebase --continue
# Your last N commits are now squashed into one commit
シェルスクリプトによるコミットスカッシュの自動化
Bash スクリプト
#!/bin/bash
if [ -z "$1" ]
then
echo "Usage: ./squash_commits.sh <N>"
exit 1
fi
git rebase -i HEAD~$1
# Automatically replace 'pick' with 'squash' for all but the first commit
sed -i '1!s/pick/squash/' .git/rebase-merge/git-rebase-todo
git rebase --continue
高度な Git スカッシュ手法
Git でコミットをスカッシュするもう 1 つの重要な側面は、プロセス中に発生する可能性のあるマージ競合を処理することです。複数のコミットを結合すると、異なるコミットからの変更が互いに競合する可能性があります。これらの競合を解決するために、Git には次のようなコマンドが用意されています。 git status どのファイルが競合しているかを確認し、 git add 解決済みとしてマークします。競合を解決した後、次のようにしてリベースを続行します。 git rebase --continue。
また、問題が発生した場合にリベースを中止する方法を知っておくと役立ちます。コマンド git rebase --abort リベース プロセスを停止し、リポジトリをリベースが開始される前の状態に戻します。これにより、リベース プロセス中に加えられた変更を安全に元に戻すことができます。これらのコマンドを理解すると、複雑な Git 履歴を効率的に管理する能力が大幅に向上します。
Git コミット スカッシングに関するよくある質問
- コミットのスカッシュとはどういう意味ですか?
- コミットのスカッシングとは、コミット履歴を簡素化するために、複数のコミットを 1 つのコミットに結合することを意味します。
- なぜコミットをスカッシュする必要があるのでしょうか?
- コミットを潰すと、特に小さなコミットが多数使用されている場合に、プロジェクト履歴がすっきりして読みやすくなります。
- インタラクティブなリベースを開始するにはどうすればよいですか?
- コマンドを使用する git rebase -i HEAD~N、N を潰したいコミットの数に置き換えます。
- インタラクティブなリベースにおける「ピック」と「スカッシュ」は何を意味しますか?
- 「Pick」はコミットをそのまま保持しますが、「squash」はコミットを前のコミットと結合します。
- リベース中の競合を解決するにはどうすればよいですか?
- 使用 git status 競合を特定し、手動で解決してから、 git add そして git rebase --continue。
- 何か問題が発生した場合にリベースを中止できますか?
- はい、使用できます git rebase --abort リベースを停止し、前の状態に戻ります。
- コミットを潰すために Bash スクリプトを使用する利点は何ですか?
- Bash スクリプトはプロセスを自動化し、時間を節約し、手動エラーのリスクを軽減します。
- リベース内のコミットを自動的にスカッシュする方法はありますか?
- はい、スクリプトを使用してリベース Todo リストを変更します。 sed, 「ピック」を「スカッシュ」に自動的に変更できます。
Git コミット スカッシングのまとめ
Git でのコミットのスカッシュは、クリーンで読みやすいプロジェクト履歴を維持するための強力なテクニックです。インタラクティブなリベースを使用する場合でも、Bash スクリプトによる自動化を使用する場合でも、複数のコミットを 1 つのコミットに結合できるため、ログの管理が容易になります。競合を解決してリベースを中止する方法を理解すると、Git の習熟度が高まり、発生した問題に確実に対処できるようになります。これらのコマンドとメソッドをマスターすると、バージョン管理の実践が大幅に改善されます。