git 子树无用合并

git subtree useless merge

我用这种方式在我的项目demo中添加了一个子树

$ git subtree add --prefix=plugins/plugone plugone master --squash
$ tree .

demo
|___.git
|___plugins
       |___plugone

$ git log --oneline --all --graph --decorate

* 200e94c (HEAD -> master, origin/master) Merge commit 'f9a745bb60b3e5816f918c0ec736714bd362bce7' as 'plugins/plugone'
| \
|  * f9a745b Squashed 'plugins/plugone/' content from commit 5c4a153
* 947ebfe bla bla

到目前为止一切顺利,我对 subtree 很满意。然后我将一个文件编辑到 subtree plugone 中并提交并 subtree pushed

* 07b3046 (HEAD -> master, origin/master) plugone append #1
* 200e94c Merge commit 'f9a745bb60b3e5816f918c0ec736714bd362bce7' as 'plugins/plugone'
| \
|  * f9a745b Squashed 'plugins/plugone/' content from commit 5c4a153
* 947ebfe bla bla

我注意到在我从我的项目 demogit subtree push --prefix=plugins/plugone plugone master 更新 plugone 之后,当我 运行

$ git subtree pull --prefix=plugins/plugone plugone master --squash

我原以为这 什么都不会做 ,但我注意到 demo 项目中的新提交:

*   a5ab686 (HEAD -> master) Merge commit 'c8cd6206950dc45196cf6fd1f17e8587a115fee6'
|\
| * c8cd620 Squashed 'plugins/plugone/' changes from 5c4a153..1fd84fe
* | 07b3046 (origin/master) plugone append #1
* |   200e94c Merge commit 'f9a745bb60b3e5816f918c0ec736714bd362bce7' as 'plugins/plugone'
|\ \
| |/
| * f9a745b Squashed 'plugins/plugone/' content from commit 5c4a153
* 947ebfe blabla

这很尴尬,因为这意味着我和我的同事必须在每次 [= 之后 运行 git 子树拉取 50=] subtree push 在我看来没有多大意义。

如何防止这种行为?

好吧,确实存在另一种方法可以做到这一点,但方法有点困难(更多命令 运行)。 我没有使用 ,而是尝试了 git read-tree/merge,它给了 IMO 更好的东西...

优点是我不需要安装额外的工具...

这是一篇有用的文章,很好地描述了如何手动使用子树概念https://delicious-insights.com/en/posts/mastering-git-subtrees/#subtrees-step-by-step