0, はじめに
プログラミングを学び始め、チーム開発や実際の業務に足を踏み入れると、Gitは絶対に避けて通れない、必要不可欠なインフラとなります。
最初はcommit、push、pull という基本のサイクルを覚えるだけでも一苦労ですが、gitの基礎的な操作に慣れてくると、こんなふうに思うことはありませんか?
「日々の開発でもっと便利にGitを使いこなしたい!」
本記事は、そんな「Gitの基礎的なことは一通りわかるけれど、一歩進んで作業効率を上げたい!」という方に向けて書いた記事です。
背景
この記事を書いている私自身、入社時の外部研修ではpushやpullといった基本的な流れしか学びませんでした。そして配属されて開発携わった際、gitの操作に慣れておらず無駄に時間を割いていました。そのため、私が現場に携わってから特に「作業効率が格段に上がった」と感じた3つのgitコマンドstash、rebase、cherrypickについて教えたいと思います。
本記事を読むための前提知識
stash、cherry-pick、rebase という一歩進んだ機能をスムーズに理解し、安心して読み進めていただくために、以下の条件を前提知識として想定しています。
1, コマンドラインの基本的な操作に慣れていること
2, 以下コマンドの役割をなんとなく理解していること
| コマンド | 説明 |
|---|---|
git status |
現在の状態確認 |
git add / git commit
|
変更の記録 |
git push / git pull / git fetch
|
リモートとの同期 |
git checkout / git merge
|
ブランチの切り替え、ブランチの統合 |
1, 作業中の変更を一時退避する「stash」
stashは、「作業途中の変更を、一時的に安全な場所へ避難できる機能」です。
コーディングの最中、このような場面に遭遇したことないでしょうか?
「作業途中でコミットしたくないけど、別作業で別のブランチに切り替えたい。」
「間違えてdevelopブランチのままコードを書いてしまった。」
まだ区切りの良い状態になっていない未完成のコードをコミットする代わりに、ちょっと引き出しにしまっておく感覚で手軽に使えるのがstashです。
1-1, 変更を退避する
作業途中のコードを退避させて、作業ツリーを直前のコミットの綺麗な状態に戻します。
git stash
Point:メッセージを添えて退避する
Stashは1つだけでなく、複数作成できます。そのため、どれがどの変更かわからなくならないようにメッセージをつけて退避するのがおすすめです。
git stash push -m "(メッセージ内容)"
1-2, 退避した変更を適用する
退避していた変更を手元に戻します。 適用方法には「リストから削除して適用」と「リストに残して適用」の2パターンがあります。
1-2-A, 退避リストから削除して適用
退避リストから削除しながら変更を適用します。
git stash pop
1-2-B, 退避リストに残したまま適用
退避リストに保持したまま変更を適用します。
退避した変更を複数のブランチで使用したい際に役立ちます。
git stash apply
Point:特定の退避を指定して適用する
上記のapply(pop)コマンドは最新の退避に対して操作を行います。
退避が複数あり、特定の退避を適用したい場合は、後述のlistコマンドによって得られるインデックス番号を付与してコマンド実行することで実現可能です。
git stash pop stash@{n}
git stash apply stash@{n}
1-3, 退避の管理
退避リストを確認したり、リストから削除する操作です。
1-3-A, 退避リストの確認
退避リストの一覧を確認できます。
「インデックス番号」+「退避元のブランチ」+「メッセージ」の構成で表示されます。
git stash list
[出力例]
stash@{0}: WIP on main: a1b2c3d ログイン画面の修正
stash@{1}: On feature/login: 途中経過のメモ
1-3-B, 退避の削除
Popは変更を適用して削除しますが、drop/clearを使えば変更を適用せずに削除可能です。dropは1つの退避、clearは全ての退避を削除します。
git stash drop
git stash clear
Point:特定の退避を指定して削除する
dropはpop、applyと同様にインデックス番号を指定しないと最新の退避を対象にします。インデックス番号を指定することで特定の退避を指定できます。
1-4, stashを使う上のアドバイス
まずはstashとstash popを使って1つの退避から操作に慣れましょう。
その後listやインデックス番号を使って複数の退避を管理できればstashを十分活用できてると言えます!
2, ブランチを最新にして一本道にする「rebase」
rebaseは、「自分の作業の土台を、最新の場所へ付け替える機能」です。
コーディングしていると、こんな場面に遭遇します。
「作業中にmain(develop)ブランチが更新されたから、自分の作業ブランチにもその更新を取り込みたい」
そんな時、自分のブランチの土台を最新の親ブランチに付け替え、変更を取り込んでくれるのがrebaseです。
2-1, rebaseの基本操作
実際にコマンドを見ていきましょう。
以下はmainブランチから切ったブランチfeature/aブランチにrebaseする例です。
git rebase main
Point:ブランチを最新にして実行
rebase main を実行する前に、必ずあらかじめ最新の main ブランチに切り替えて、最新の変更を手元に取得(プル)しておく必要があります。 自分の手元の main が古いまま作業ブランチで rebase をしても、古い状態の上に積み木されてしまうのであまり意味がありません。
2-2, コンフリクトの対処法
rebaseを使っていると、コードが衝突して「コンフリクト」が発生することがあります。ここではrebase時のコンフリクトの正しい対処を知りましょう。
①衝突したファイルをエディタで開き、手動でコードを修正する
②修正したファイルをステージングする
git add (ファイル名)
③コミットは作らず、そのまま rebase を再開させる
git rebase --continue
困った時の緊急脱出
「なんかわからなくなってしまった…」となってしまった時は、以下のコマンドでrebaseを始める前の安全な状態に戻すことができます。
git rebase --abort
2-3, rebaseを使う上でのアドバイス
rebaseは他のメンバーにも影響を与える強力な機能です。そのため他のメンバーと共有しているブランチでのrebaseは絶対に避けましょう。
3, 別ブランチの特定のコミットを適用する「cherry-pick」
cherry-pickは、「他のブランチにある特定のコミットだけを、自分のブランチにパッチのように貼り付ける機能」です。
別ブランチの変更の取り込みは先ほどのrebaseでもできますが、次のような場面では少し大げさになってしまいます。
「別のブランチで直してバグ修正のコミットだけ、急ぎで自分のブランチにも欲しい」
「間違えて別のブランチにコミットしちゃったから、正しいブランチに移したい」
そんなときに、木からサクランボ(cherry)をもぎ取る(pick)ように、欲しいコミットだけをピンポイントで摘み取って持ってくることができるのがcherry-pickです。
3-1, cherry-pickの基本操作
実際にcherry-pickを使って、特定のコミットを引っ張ってくるコマンドです。
git cherry-pick (コミットID)
3-2, コンフリクトの対処法
cherry-pick もコードの貼り付け処理なので、rebaseと同じくコンフリクトが発生する可能性があります。
対処法はrebaseと同じなので慌てずに対処すれば大丈夫です。
①衝突したファイルをエディタで開き、手動でコードを修正する
②修正したファイルをステージングする
git add (ファイル名)
③cherry-pick を再開させる
git cherry-pick --continue
Cherry-pickもrebase同様、作業前の状態に戻すコマンドがあります。
Cherry-pickを取り消したい/やり直したい時に活用しましょう。
git cherry-pick --abort
3-3, cherry-pickを使う上でのアドバイス
cherry-pickを実行したら、コミットされた状態で変更が適用されます。pushは実行されないため、必要に応じてpushも行うようにしましょう。
また、厳密にはcherry-pickはコミットを複製する機能であるため、コミットの移し替えとして使用する際は、移し元のコミットを取り消すのを忘れないようにしましょう。
4, さいごに
Gitの操作は最初は誰でも不安になります。
私もコマンドを1行ずつ実行するのに毎回ヒヤッとしてました。
現在ある程度Gitを使いこなせるようになってみて、
「まずは実際にコマンドをたたいてみて、どのような変化が起きるのか、ということを体感することが一番大切」
だと感じました。
自分だけが作業するブランチを作成してよいなら、そこで練習するのが習得への早道だと思います。
(リモートリポジトリにGit練習用のブランチを上げないように気を付けて…)
この記事がGitをこれから活用していきたい方の力になれば幸いです。
最後までお読みいただきありがとうございました。