git worktreeを理解したい!!!!【もりけん塾 勉強会の復習】
目次
先日、もりけん塾で行われた勉強会で
もりけん先生がgitについてのハンズオンをおこなってくださいました
https://twitter.com/terrace_tech/status/1468584083706224643?s=20
もりけん先生のハンズオン
https://github.com/kenmori/handsonFrontend/blob/master/git/work/advance.md
今回は、ハンズオンの中のgit worktreeについての復習を行いました
git worktreeとは。use caseは。
git worktreeを使用すると、一つのリポジトリに複数のワークツリーを作成し作業できます
もりけん先生のハンズオン教材にありますが、
新機能開発中など、ブランチで作業中に
急なバグ対応をしなくてはいけなくなった場合などに 使用するそうです。
ドキュメントには以下の様にありました
> You are in the middle of a refactoring session and your boss comes in and demands that you fix something immediately. You might typically use git-stash[1] to store your changes away temporarily, however, your working tree is in such a state of disarray (with new, moved, and removed files, and other bits and pieces strewn around) that you don’t want to risk disturbing any of it. Instead, you create a temporary linked working tree to make the emergency fix, remove it when done, and then resume your earlier refactoring session.
DEEPL訳
リファクタリングの最中に、上司がやってきて、すぐに何かを修正するように要求された場合。通常なら git-stash[1] を使って変更を一時的に保存しておくかもしれませんが、作業ツリーは(新しいファイルや移動・削除したファイル、その他の断片が散らばって)無秩序な状態になっており、それを邪魔するリスクは避けたいと思うでしょう。その代わりに、一時的にリンクされた作業ツリーを作成して緊急修正を行い、完了したらそれを削除して、以前のリファクタリングセッションを再開するのです。
https://git-scm.com/docs/git-worktree
早速やってみる
① 開発用ブランチ(feature/a)で作業中
// 開発用ブランチを作成し、移動
% git checkout -b feature/a
Switched to a new branch 'feature/a'
// 現在のブランチ状況
% git branch
* feature/a
main
② 急なバグ対応が入った! 💥
worktreeを作成・追加
git worktree add <path> <branch>
% git worktree add ./worktree/dev main
Preparing worktree (checking out 'main')
HEAD is now at 9359c6c first commit
現状のディレクトリ状況
作成したworktreeの中でmainブランチにcheckout
この状態で、別のworktreeからmainブランチにcheckoutすることはできない
% git checkout main
fatal: 'main' is already checked out at <path>
また、上記では既存のbranchを使用しましたが、新たにbranchを切ることもできる
% git worktree add worktree/dev -b feature/b
③ 現在のworktreeの状況を確認する
% git worktree list
/Users/sae/Desktop/git_lesson 35fd158 [feature/a]
/Users/sae/Desktop/git_lesson/worktree/dev 513153e [main]
④ 追加したworktreeのディレクトリへ移動
% cd ./worktree/dev
⑤ ブランチを切り、何か修正・編集を行う
% git checkout -b feature/b
Switched to a new branch 'feature/b'
現状のブランチ状況
% git branch
+ feature/a
* feature/b
main
⑥ 作業した内容をgit add、commitする
※./worktree/dev内のファイルで作業する
% git add .
% git commit -m "fix:fix"
[feature/feature/b 95a6d32] fix:fix
1 file changed, 1 insertion(+), 1 deletion(-)
⑦ 元の場所へ戻る
% cd ../../
⑧ 不要になったworktreeを削除する
% git worktree remove ./worktree/dev
feature/bは残ったまま
% git branch
* feature/a
feature/b
main
これを統合するタイミングは自分でコントロール可能
また、作成したworktreeから 直接pushすることもできる
git push origin HEAD
参考サイト
https://opensource.com/article/21/4/git-worktree
まとめ
gitはまだまだ苦手意識があり、基本的に個人開発でしか使用していないので
use caseもいまいちリアルに感じることができませんでした
git管理をしている現場で働いている方との差を感じました
こういった勉強会の機会を無駄にせず
必要に応じて使いこなせる様にしていきたいです✨
もりけん塾でJavaScriptを学習をしています!
もりけん先生のTwitter:https://twitter.com/terrace_tech
https://kenjimorita.jp/