你听说过git worktree命令么?
你听说过git worktree命令么?
今天蟒爹发了一条推文 Why did I not know before about "git worktree"? :-( https://git-scm.com/docs/git-worktree)
我个人感觉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)✗
你学会了么?