LoginSignup
8
9

More than 5 years have passed since last update.

git stashはもういらない! 3分で分かるgit worktree

Last updated at Posted at 2018-09-12

alt
git worktree はstashのいらないbranchのようなものだ。
git 2.7から使える。
branchを作る代わりに worktreeという名前のフォルダを作る
以下のメリットがある。
・複数のブランチを、別々のエディタで呼び出し、並列的に修正可能。
・ブランチの切り替えという概念がなくなるため作業効率が上がる。 つまり、git stashの必要がなくなる
 以下のデメリットがある
・branchを作るのと違いgitignoreが適用されるため、1設定必要。

git worktreeがエンジニアの生産性を大幅に上げることを証明する。

1.まず、作業フォルダを作る。

mkdir workspace; cd workspace

2. 何かプロジェクトを作成。

react-native init AwesomeProject; cd AwesomeProject

3. 以下のコマンドで、branchとworktreeを一緒に作る。

git worktree add -b Foo ../Foo origin/master

Foo = 新しく作られるbranch名
../Foo = 新しく作られるworktree名
origin/master = origin/masterからbranchとworktreeを生やす。

現状以下のような構成になっている。
workspace
--AwesomeProject
----.git
--Foo (worktree)
----.git

4.Fooフォルダに移動してgitが使えることを確認。

cd ../Foo; git log;

試しにFooの中でcommitしてgit pushしてみよう。

以上!!!

実務で使うときは、以下のように、あるプロジェクトのmasterと、そのworktreeだけを含むフォルダを作るといい。
その際、masterは削除できないように設定しておくともっといい。
AwesomeProject
--AwesomeProject (master)
----.git
--Foo (worktree)
----.git
--HotFix (worktree)
----.git

便利なのはworktree間で.git以下のフォルダが同期していること。
そしてbranchが別々のフォルダにあることでそもそもgit stashをせずに作業が出来ること。
stashでなく、新しいエディタで、「直接」branchを開ける。
worktreeを消したい時は、rm -rf Fooだ。

なんて単純ながら革新的だろう。学習コストがほぼいらず、単純に生産性が上がる。
ただ.gitignoreで除外されるファイルはworktreeで同期しない。

gitignoreされてしまう。

そう、git worktreeはgitignoreが適用されてしまう。

それを回避するためにはrsync!

git worktree add -b Foo ../Foo master; rsync -a --exclude='.git' ../awesomeProject(コピー元のプロジェクトの名前)/ ../Foo

解説すると、localのmasterからFooというbranchを切り、Fooというフォルダの中にそのbranchを入れる。
rsyncは複雑なことができるcpコマンドだ。
localのmasterをFooというフォルダに.git以外のフォルダをコピーする。
30秒ほどかかるのが欠点。gitignoreされたファイルだけ、選択してコピーするやり方がわかるbashの達人の方がいらっしゃったらコメントしてください。

npmがインストールされている人は、
npx kabatree newBranch
で上記と同じことをしてくれる。
(私が制作しているnpmライブラリです。)

もし、git worktreeの仕組みが分からなかったら、worktreeの.gitとmasterの.gitを見てみよう。worktreeは単純な仕組みなので、すぐに理解できる。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9