切换Git子树分支的正确方法?

时间:2018-07-17 22:32:13

标签: git git-subtree subtree

假设我已经添加了一个新的远程“ foo”,并拉了一个与分支主控一起压缩的子树。

$ git remote add -f foo some-repo.git
$ git subtree add --prefix=foo --squash foo master

从我读过的文章(herehere等)看来,这似乎是切换分支的常用方法。在这种情况下,分支“ bar”:

$ git rm -r foo
rm 'foo/file'.
...
$ git commit -m "Delete foo on branch 'master' to switch to branch 'bar'."
1350 files changed, 144703 deletions(-)
delete mode 100644 foo/file
...
$ git subtree add --prefix=foo --squash foo bar
git fetch foo master
From some-repo.git
 * branch            master     -> FETCH_HEAD
Added dir 'foo'

但这感觉很脏。为什么不只使用已经具有分支参数(没有rm / commit / add)的“ git subtree pull”?

$ git subtree pull --prefix=foo --squash foo bar
From some-repo.git
 * branch            master     -> FETCH_HEAD
Merge made by the 'recursive' strategy.
 foo/file                                                        |  2 ++
 ... smaller changeset output ...

 3 files changed, 41 insertions(+)
 ...

当我在本地都对它们进行测试时,我发现子树目录(./foo)之间没有差异。为什么每个人都推荐一种添加更复杂的变更集和提交(删除和重新添加)的方式?我想念的是什么,也许是一些边缘情况?

1 个答案:

答案 0 :(得分:0)

git subtree pullcommit 13648af5于2009年4月在Avery Pennarun apenwarr中为Git 1.7.11引入的。

  

添加'git subtree merge'和'git subtree pull'。

     

这些是'git merge -s subtree'和'git pull -s subtree'的简单快捷方式,但是将它们全部集中在一个命令中是很有意义的。

您可以在其associated test

中看到
-git merge -s subtree subproj-merge-split3
+git subtree pull --prefix=subdir ../subproj subproj-merge-split3

这与rm / subtree add不同,后者仍然更适合切换分支。