比较Git中切换四个分支的方法的优缺点。
经常使用Git的人都会以某种形式使用上下文开关。 这只会给你的工作流程增加少量的开销,但有时可能是痛苦的经历。
让我们用以下示例来说明常见的上下文切换策略的优缺点。
假设你在一个叫feature-X的分支工作。 我刚意识到有必要解决无关的问题。 这不能在功能- x分支上进行。 必须在新的分支功能中完成此任务。
方案 1:暂存 + 分支
解决此问题最常见的工作流程如下:停止在分支功能- x上工作,狠狠地揍gitstashgitcheckout-b功能原点/主,以解决功能- y的问题
缺点:使用此工作流时,一次只能有一个工作区。 另外,根据你仓库的状态,使用舞台是麻烦的一环。
方案 2:WIP 提交 + 分支
解决方案与上一个解决方案非常相似,但使用正在进行的工作进度(WIP )而不是转移来提交。 当hxdmd准备切换回来而不是弹出转移时,git reset HEAD~1将展开WIP提交。 虽然可以像之前的方案一样自由地继续,但是不会接触舞台。git add -u (仅添加已更改和已删除的文件) git commit-m ' WIP ' git check out-b feature-y origin/master,停止在分支功能- x上工作,其原因是: git checkout feature-X或git switch -git reset HEAD~1的优点:对于简单的更改,这是一个简单的工作流程,也适用于小型仓库。 不需要使用暂时保存。
优点:一次只能拥有一个工作区。 此外,如果您或您的代码审阅人不小心,WIP提交可能会集成到最终产品中。
使用此工作流时,请不要将--hard添加到git reset中。 如果这样做了,应该可以使用git reflog重新开始提交,但是最好完全避免。 否则,会听到心碎的声音。
方案 3:克隆一个新仓库
此解决方案不创建新分支,而是为每个新功能分支创建存储库的新克隆。好处:可以同时在多个工作区工作。 你不需要提交git stash和WIP
缺点:由于可能会占用大量磁盘空间,因此必须考虑仓库的大小。 (浅克隆有助于解决这种情况,但可能不一定合适。 另外,你仓库的克隆人互相不知道。 他们无法互相追踪,所以必须手动追踪克隆人的源仓库。 如果需要git挂钩,则必须为每个新克隆设置。
方案 4:git 工作树
要使用此解决方案,您可能需要了解“添加工作树”。 如果您不熟悉Git工作树,请不要难过。 很多人多年来都不知道这个概念。
什么是工作树?
工作树被视为属于仓库中项目的文件。 本质上,这是一种工作区。 你可能没有注意到你已经在使用工作树了。 开始使用Git时,将自动检索第一个工作树。$ mkdir/tmp/foo光盘/tmp/foo
$ git init
$ git工作树列表
/tmp0000000[主机]
从上面的代码可以看出,在首次提交之前也有一个工作树。 接下来,试着在你的项目中再增加一个工作树。
添加一个工作树
要添加新的工作树,必须提供:硬盘上的一个位置要添加到一个分支名称中的分支$ git clone https://github.com/oal ders/http-browser detect.git
$ CD http -浏览器检测/
$ git工作树列表
/users/olaf/http -浏览器检测90772 AE [主机]
$ gitworktreeadd~~/trees/oal ders/feature-x-boalders/feature-xorigin/master
$ Gitworktreeadd~~/trees/Oal ders/Feature-y-Boalders/Feature-ye9DF 3c 555 e 96 B3 F1
$ git工作树列表
/users/olaf/http -浏览器检测90772 AE [主机]
/users/olaf/trees/oal ders/featu
re-X 90772ae [oalders/feature-X] /Users/olaf/trees/oalders/feature-Y e9df3c5 [oalders/feature-Y]与大多数其他 Git 命令一样,你需要在仓库路径下使用此命令。一旦创建了工作树,就有了隔离的工作环境。Git 仓库会跟踪工作树在磁盘上的位置。如果 Git 钩子已经在父仓库中设置好了,那么它们也可以在工作树中使用。
请注意到,每个工作树只使用父仓库磁盘空间的一小部分。在这种情况下,工作树需要只大约三分之一的原始磁盘空间。这这非常适合进行扩展。如果你的仓库达到了千兆字节的级别,你就会真正体会到工作树对硬盘空间的节省。
$ du -sh /Users/olaf/http-browserdetect 2.9M $ du -sh /Users/olaf/trees/oalders/feature-X 1.0M优点:你可以同时在多个工作区中工作。你不需要使用暂存。Git 会跟踪所有的工作树。你不需要设置 Git 钩子。这也比git clone更快,并且可以节省网络流量,因为你可以在飞行模式下执行此操作。你还可以更高效地使用磁盘空间,而无需借助于浅层克隆。
缺点:这是个需要你额外学习和记忆的新东西,但是如果你能养成使用这个功能的习惯,它会给你丰厚的回报。
额外的小技巧
有很多方式可以清除工作树,最受欢迎的方式是使用 Git 来移除工作树:
git worktree remove /Users/olaf/trees/oalders/feature-X如果你喜欢 RM 大法,你也可以用 rm -rf来删除工作树。
rm -rf /Users/olaf/trees/oalders/feature-X但是,如果执行此操作,则可能需要使用 git worktree prune清理所有剩余的文件。或者你现在可以跳过清理,这将在将来的某个时候通过git gc自行完成。
注意事项
如果你准备尝试 git worktree,请记住以下几点:
删除工作树并不会删除该分支。可以在工作树中切换分支。你不能在多个工作树中同时签出同一个分支。像其他命令一样,git worktree需要从仓库内运行。你可以同时拥有许多工作树。要从同一个本地仓库签出创建工作树,否则它们将互不可知。git rev-parse
最后一点注意:在使用 git worktree时,仓库根所在的位置可能取决于上下文。幸运的是,git rev parse可以让你区分这两者。
要查找父仓库的根目录,请执行以下操作: git rev-parse --git-common-dir 要查找你当前所在仓库的根目录,请执行: git rev-parse --show-toplevel根据你的需要选择最好的方法
就像很多事情一样,TIMTOWDI(条条大道通罗马there's more than one way to do it)。重要的是你要找到一个适合你需要的工作流程。你的需求可能因手头的问题而异。也许你偶尔会发现自己将 git worktree作为版本控制工具箱中的一个方便工具。
via: https://opensource.com/article/21/4/context-switching-git
作者:Olaf Alders选题:lujun9972译者:Chao-zhi校对:wxy
本文由 LCTT原创编译,Linux中国荣誉推出