Git / GitHub の実践コマンド Tips
はじめに
大規模開発では、ブランチの切り替えや変更の退避、コンフリクトの解消等の操作を行う場面が多くあります。 地道にファイルを退避させて作業することもできますが、適切なコマンドを知っておくと作業効率が向上します。
このブログでは、Git や GitHub CLI を使った開発で知っておくと便利なコマンドの Tips をまとめたいと思います。
ブランチ操作
ブランチの作成と切り替え
git checkout -b でも同じことができますが、Git v2.23 で checkout の責務を分離する目的で git switch / git restore が導入されました。
ブランチ操作には switch、ファイル復元には restore と使い分けることで意図が明確になります。
ブランチの削除
ブランチ名の変更
既に PR が作成されている場合、ブランチ名を変更すると元の PR はクローズされ、新しいブランチ名で push した際に別の PR として扱われる点に注意が必要です。
マージ済みブランチの一括削除
ローカルに溜まったマージ済みブランチを一括で削除できます。
リモートで削除されたブランチの追跡を解除
リモートで既に削除されたブランチのローカル追跡参照を整理します。
git fetch -p でも同様です。
変更の退避
stash を使った一時退避
作業途中の変更を一時的に退避させて、別のブランチで作業したい場面で使用します。
未追跡ファイルも含めて退避したい場合は -u フラグを付けます。
コミット操作
直前のコミットメッセージを修正
既に push 済みの場合は --force が必要になります。
直前のコミットを取り消し
--soft は変更内容を保持したままコミットだけを取り消すため、コミットをやり直したい場合に適しています。
コミットをまとめる
複数の細かいコミットを 1 つにまとめてから push したい場合は、rebase -i を使用します。
上記のように細かいコミットが並んでいる場合、rebase -i で 1 つにまとめられます。
エディタ(Vim)が開いたら、まとめたいコミットの pick を fixup(または f)に変更します。
fixup はコミットメッセージを破棄して直前のコミットに統合します。
メッセージも編集したい場合は squash(または s)を使います。
rebase 後は --force で push が必要です。
特定のコミットメッセージを修正
直前ではなく、過去の特定のコミットメッセージを修正したい場合も rebase -i を使います。
エディタ(Vim)で対象コミットの pick を edit に変更して保存します。
特定のコミットを別ブランチに取り込む
別ブランチの特定のコミットだけを取り込みたい場合は cherry-pick を使用します。
上図の例では、feature ブランチのコミット D だけを main に取り込んでいます。
リモートリポジトリとの同期
main ブランチの最新変更を開発ブランチに取り込む
開発ブランチで作業中に main の最新変更を取り込む方法は、merge と rebase の 2 通りあります。
merge はマージコミットが作られ、rebase はコミット履歴が直線になります。
rebase を使うとコミット履歴が綺麗に保たれますが、既に push 済みのブランチでは --force が必要になります。
ここはチームの運用ルールに合わせて使い分けます。
コンフリクトの解消
merge や rebase でコンフリクトが発生した場合は、以下の流れで解消します。
rebase を中断して元に戻したい場合は --abort を使います。
Fork 元の upstream と同期
OSS 等で Fork したリポジトリを upstream の最新に追従させる方法です。
差分と履歴の確認
差分の確認
コミット履歴の確認
特定の行の変更者を確認
GitHub CLI
ここまで紹介してきた git コマンドはバージョン管理システム Git 本体のコマンドであり、GitHub に限らず GitLab や Bitbucket 等のホスティングサービスでも共通で使用できます。
一方、GitHub CLI(gh)は GitHub が提供する専用の CLI ツールで、PR や Issue、Actions 等の GitHub 固有の機能をターミナルから操作できます。
認証
Pull Request
Issue
リポジトリ操作
GitHub Actions
Release
便利な設定
エイリアスの活用
.gitconfig にエイリアスを設定しておくと、よく使うコマンドを短縮できます。
シェルのエイリアスと組み合わせるとさらに効率的になります。
グローバル .gitignore
OS 固有のファイルや IDE の設定ファイル等、全リポジトリで無視したいファイルはグローバル .gitignore に設定します。
.gitignore の設定・雛形は github/gitignore が参考になります。
まとめ
今回のブログでは、Git のブランチ操作、変更の退避、コミット履歴の整理、リモートリポジトリとの同期、差分・履歴の確認、GitHub CLI を使った PR / Issue 操作、エイリアスやグローバル .gitignore 等の便利な設定についてまとめました。
普段何気なく使っている git コマンドも、オプションや組み合わせを知っておくと作業効率が大きく変わります。
特に rebase -i によるコミット整理や cherry-pick、stash あたりは使いこなせると開発のストレスがかなり減ると思います。
Happy Git & GitHub life !!