卖兜搞IT

你听说过git worktree命令么?

你听说过git worktree命令么?

今天蟒爹发了一条推文 Why did I not know before about "git worktree"? :-( https://git-scm.com/docs/git-worktree)

Image

我个人感觉git worktree这个命令应该知道的人不多,更不用说平时用了。我知道git worktree这个命令,但是基本没有用过,因为平时的场景我一般都使用git stash

git stash

先说说git stash吧,git stash可以把你当前的工作分支里的修改暂存起来,然后你可以自由的切换到其他的分支进行其他的工作,然后回过头来再通过git stash pop把你之前的修改弹出,继续你之前未完成的工作。

比如当前你在dev分支上工作呢,突然发现有个master分支上的问题,或者你的同事要你帮修复一下master分支上的一个问题,而你又不想在当前的工作中插入这个修复,打乱你的工作内容,怎么办?

最笨的办法就是我直接把我当前的未完成的工作git add&commit,然后再checkout 到其他分支进行工作。

➜  awx-ansible-demo git:(dev)✗ git statusOn branch devUntracked files:(use"git add <file>..." to include in what will be committed)        inventories/testing/        roles/cisco_nxos/nothing added to commit but untracked files present (use"git add" to track)➜  awx-ansible-demo git:(dev)✗

但是更方便的办法是用stash, 先 git add, 再git stash

➜  awx-ansible-demo git:(dev)✗ git add .➜  awx-ansible-demo git:(dev)✗ git stashSaved working directory and index state WIP on dev: fb8c7f4 test➜  awx-ansible-demo git:(dev) git statusOn branch devnothing to commit, working tree clean➜  awx-ansible-demo git:(dev)

等你切换到其他分支完成工作以后,你可以再切回dev分支,通过git stash pop, 把之前的修改拿出来继续

➜  awx-ansible-demo git:(dev) git stash popOn branch devChanges to be committed:(use"git restore --staged <file>..." to unstage)new file:   inventories/testing/hostsnew file:   roles/cisco_nxos/tasks/main.ymlDropped refs/stash@{0}(2eb223667ff0d11368f1b4b6b29fcafc892705cd)➜  awx-ansible-demo git:(dev)✗

git worktree

git worktree命令其实也可以实现git stash类似的效果,但是它更彻底,有时候更方便。比如你现在正在dev分支工,工作到一半,然后突然想去master分支做其他的事情。

➜  awx-ansible-demo git:(dev)✗ git statusOn branch devChanges to be committed:(use"git restore --staged <file>..." to unstage)new file:   inventories/testing/hostsnew file:   roles/cisco_nxos/tasks/main.yml➜  awx-ansible-demo git:(dev)✗ git worktree add ../awx-ansible-demo-master masterPreparing worktree (checking out'master')HEAD is now at fb8c7f4 test

git worktree add ../awx-ansible-demo-master master 通过这个我创建了一个新的worktree,放到上一层目录一个叫awx-ansible-demo-master的文件夹,然后分支是master

通过git worktree list 你能看到你现在有几个worktree,以及他们的分支和文件路径:

➜  awx-ansible-demo git:(dev)✗ git worktree list/home/penxiao/awx-ansible-demo         fb8c7f4 [dev]/home/penxiao/awx-ansible-demo-master  fb8c7f4 [master]

比如说你现在想暂时去master分支工作一下,直接cd过去就行。

➜  awx-ansible-demo git:(dev)✗ cd ../awx-ansible-demo-master➜  awx-ansible-demo-master git:(master)➜  awx-ansible-demo-master git:(master)

工作完成以后,可以非常方便的把这个worktree给删掉

➜  awx-ansible-demo git:(dev)✗ git worktree list/home/penxiao/awx-ansible-demo         fb8c7f4 [dev]/home/penxiao/awx-ansible-demo-master  fb8c7f4 [master]➜  awx-ansible-demo git:(dev)✗ git worktree remove awx-ansible-demo-master➜  awx-ansible-demo git:(dev)✗ git worktree list/home/penxiao/awx-ansible-demo  fb8c7f4 [dev]➜  awx-ansible-demo git:(dev)✗

你学会了么?

Image