Open3

【学び】Git操作

git checkoutで特定のファイルの内容を取得して上書きする方法

実務で教えてもらって便利そうだったので備忘録として残しておく。

使う場面としては、「自分の作業ブランチ内で作成したファイル」が他の人の作業でも使いたいファイルだったときに、そのファイルの分だけ切り出して先にPRを作るみたいな場合。つまり、別ブランチから一部のファイルのみを取得したいようなケース。共通で使うモデルクラスとかでよく起きそうなイメージ。

やり方

# 特定のコミットID内の特定のファイルを今いるブランチのファイルに上書きしてステージング(git add)された状態にする(コミットはされていない状態)
git checkout {コミットID} {ファイル名}
git checkout {コミットID} -- {ファイル名} # 参考記事では -- のハイフンが区切り文字として付いていた
git checkout {コミットID} {ディレクトリ名}  # ディレクトリごと取り込んで上書きすることもできる

# コミットIDの箇所はブランチ名を指定することもできる。別ブランチ内の特定のファイルを今いるブランチのファイルに上書きしてステージング(git add)された状態にする
git checkout {ブランチ名} {ファイル名}
git checkout {ブランチ名} -- {ファイル名} 
git checkout {ブランチ名} {ディレクトリ名}

実際の例

前提:Aさんが開発しているfeature/aブランチで作成したHogeModel.phpを、Bさんが開発しているfeature/bブランチの方でも使う必要が出てきた。

対応策としては、今回のgit checkoutで取り込む方法以外にも、Bさん側が🍒git cherry-pickで取り込む方法が考えられるが、cherry-pickは取り込む対象のコミットにHogeModel.php以外の変更も含まれている時には少し使いづらい。
こういった場合においては、特定の対象ファイルだけを取り込むことのできるgit checkoutの方が有用でありそう。

# 共通で使うブランチへ取り込みたいため、まずはdevelopブランチに移動しておく(ブランチ移動のcheckout)
git checkout develop

# feature/aから取り込みたい対象ファイルを指定して、今いるブランチに取り込む(ファイル取り込みのcheckout)
git checkout feature/a HogeModel.php

# 取り込んだファイルはステージング状態(git add)なのでコミットする
git commit -m "HogeModelの作成"

# プッシュする(developブランチ内にHogeModel作成の変更が入る)
git push origin HEAD

# feature/bの作業をしているBさんが最新のdevelopを取り込んだら作業終了

ローカルブランチをリモートブランチの状態に強制的に合わせる方法

やり方

# リモート追跡ブランチの更新
git fetch --prune

# ローカルの内容をリモートブランチの内容に強制的に合わせる
git reset --hard origin/hoge

補足

git reset --hardは、現在のブランチの状態を強制的に対象に合わせるコマンド

git reset --hard {コミットへの参照}

今回やっていることは、現在いるブランチの内容を、強制的にリモート追跡ブランチの内容に書き換えたということ。リモート追跡ブランチ(=リモートブランチ(ほぼ))なので、リモートブランチの内容に強制的に合わせるということが実現できる。

ログインするとコメントできます