总结:如何处理长时间跟踪上游存储库的最佳实践,以便维护一组本地更改?
我希望保持Github上的分支与上游同步,同时仍然允许清晰地跟踪特定于该分支的更改。(对于这个讨论,假设
想象一下,当上游/主分支处于E时,我分叉了一个存储库,就像这样。
在复制仓库后,我创建了两个功能分支(L-M和Q-R),以添加所需的新功能,并将它们合并回我的原始/主分支。因此,现在我的分支具有上游不存在的改进。
我发现上游有一些有趣的修复,因此我想与上游保持同步。根据我找到的大多数参考资料(git hub fork),建议的方法是将上游/主分支合并到您的原始/主分支中,然后继续进行。因此,我会发出以下命令:
然后我最终得到的代码库看起来会像这样:
我看到这里有几个问题。
注意:我曾考虑使用rebase来保持我的存储库与上游的同步,但这会带来完全不同的问题。例如,如果有人通过子模块、分支等引用我的存储库,那么历史记录重写将破坏他们的引用。此外,我认为我的分支历史记录无法在rebase中得以保存,因此我将无法完整地查看我所创建的所有功能分支及其相关历史记录。
其他人是如何处理这个问题的?有哪些最佳实践值得我去了解?
我希望保持Github上的分支与上游同步,同时仍然允许清晰地跟踪特定于该分支的更改。(对于这个讨论,假设
upstream
指向主项目存储库,而origin
指的是我对存储库的分支)想象一下,当上游/主分支处于E时,我分叉了一个存储库,就像这样。
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T
\-L-M-/ \-Q-R-/
在复制仓库后,我创建了两个功能分支(L-M和Q-R),以添加所需的新功能,并将它们合并回我的原始/主分支。因此,现在我的分支具有上游不存在的改进。
我发现上游有一些有趣的修复,因此我想与上游保持同步。根据我找到的大多数参考资料(git hub fork),建议的方法是将上游/主分支合并到您的原始/主分支中,然后继续进行。因此,我会发出以下命令:
git checkout master
git fetch upstream
git git merge upstream/master
git push
然后我最终得到的代码库看起来会像这样:
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T-F'
\-L-M-/ \-Q-R-/
我看到这里有几个问题。
实际上,我的repo中并没有提交F,而是有一个内容相同但哈希值不同的F'。因此,我不能轻易地在两个repo之间引用提交并知道我有哪些更改。(考虑到upstream可能有多个更改,并且有自己的一组功能分支被合并,情况会变得更加复杂)
随着我继续前进并继续这样做,我越来越难以知道我在我的repo中有哪些更改超出了upstream的范围。例如,我可能会将其中一些更改提交回upstream,同时继续添加自己的改进。经过几次迭代后,查看我的repo的人怎么知道它与upstream有何不同?(是否有git命令可以找到这些更改?)
类似于#2,有人如何在upstream中找到修复方法并检查我的fork是否包含该修复程序?
注意:我曾考虑使用rebase来保持我的存储库与上游的同步,但这会带来完全不同的问题。例如,如果有人通过子模块、分支等引用我的存储库,那么历史记录重写将破坏他们的引用。此外,我认为我的分支历史记录无法在rebase中得以保存,因此我将无法完整地查看我所创建的所有功能分支及其相关历史记录。
其他人是如何处理这个问题的?有哪些最佳实践值得我去了解?
更新:
根据Seth的反馈,我创建了一组测试存储库来展示我所说的内容以及它按照他的说法如何运作。
这些存储库是:
它们应该更清楚地展示当有本地更改时从上游合并的情况。
git log --graph --decorate --oneline master..upstream/master
根据您的需求,改变两个点分隔参数的顺序或将点的数量改为三个可能会有所帮助。 - Seth Robertson