开源项目二开如何让 git 不分叉。

2020-12-20 20:07:42 +08:00
 tlerbao

某个项目来自于开源项目的二次开发

项目本身有两个 remote

origin : 该项目我自己的私有 remote

upstream : 依赖的开源项目本身的 remote

项目有两个分支 master 和 dev,dev 用来开发,master 分支只合并 dev 上线分支。

现在是大部分时候我和 upstream 开源项目作者可能同时进行开发,如果我本地没有任何 commit 还好,一旦我本地有若干 commit (甚至已经合并到 master 并且已经 push 了)之后,我此时从 upstream 开源项目 pull 最新代码下来合并后,git log 就会分叉,并且会产生多余的一条 commit:Merge branch 'master' of https://xxx into dev 。

请问有办法避免分叉和产生这个多余的 commit 吗? rebase 似乎不行,求大神指教 另外这是我的强迫症作祟,如果能避免,避免分叉真的好吗,还是我无病呻吟 应该改掉这个强迫症,继续让他保持分叉。

5081 次点击
所在节点    git
30 条回复
YouLMAO
2020-12-21 00:38:16 +08:00
@msg7086 我有一个 Apache 项目 pmc,不知道比你的小多少
msg7086
2020-12-21 01:31:15 +08:00
@YouLMAO 其实我不太明白你提 Apache PMC 和你提出的团队里用 Rebase 是对团队不负责任有什么关系。
在我看来,Good practice 应该是对团队负责任的行为,只不过是因为需要妥协一些现实中无法解决的情况(例如队友太菜)而不得不采取变通的措施。
从你前面的观点,即「用 Rebase 」→「对团队不负责任」这个论点来看,我觉得有两种可能。
1. 你觉得 Rebase 让版本历史保持清晰不属于 Good practice ;
2. 你觉得 Good practice 是对团队不负责任的行为。
你想说的是其中的哪个呢?

我司姑且不算很小,但是我不代表我司发言,所以就不报名号了。
但是我司要求每个 MR 都使用 Squash 方式合并,这样既不会有 Merge 也不会有 Rebase 。
说白了只是为了省事,省得培训每个员工罢了。
我自己的个人项目是不会去用这么 low standard 的做法的。
ooops
2020-12-21 02:00:26 +08:00
PR/MR 没 merge 之前随便 rebase,有什么好纠结的。如果开发分支也多人协作那就定好了标准,做 rebase 完就即时同步给小伙伴就可以了。你 rebase,他也 rebase 没有太多问题。稍微配合下 cherry-pick 让提交历史好看一些也是不错的。
合并之后再改历史是大忌。
cnnblike
2020-12-21 02:14:47 +08:00
@YouLMAO 这不就典型的菜怪工具不好用么? squash+rebase 逻辑很清晰的,git blame 一下整个历史清清楚楚
cnnblike
2020-12-21 02:19:53 +08:00
squash+rebase 之后拿工具就可以方便的检测出整个系统的依赖关系,通过把 interface 写在一个独立的 repo 里面,可以很方便的实现多个 pipeline 同时自动回滚,如果是多个 branch merge 过来的话,回滚到哪个 branch 的哪里去?
chchwy
2020-12-21 09:29:04 +08:00
rebase 唯一解答,只要在本地端還沒推送上去的內容,沒有什麼理由不能 rebase 。
hantsy
2020-12-21 10:00:13 +08:00
@tlerbao 你这样用,本地 Master 还是 Origin Master,还是 Dev 分支内容都是一锅粥。现在你看到只是自己一个人的几次提交 Log,等你在项目有多个人的时候,提交了几个月再去看你的 Log 吧。

我使用的原则:我的 Master (本地或者 Origin 上)尽可能与 Upstream Master 致。每次创建分支前,都是必须要同步操作,保持与上游一致。

而且我的经验是是大部分情况下,我的开发分支不需要中途 Rebase,绝大多数情况下,在 PR Merge 的选择 rebase 是可以合并进 Upstream Master 的(冲突的时候,直接在 Github Web 界面上修改冲突,合并即可)。Git 不仅仅是配置管理一部分,分支与任务颗粒度大小匹配,这与软件开发管理经验和实实在在软件架构的设计也很大关系,尽可能是一个分支对应的任务快速完成( 4 小时到一天内最好,超过了一天,就应该考虑这个 Issue 是不是包含太多的内容),而且有清晰依赖关系(不要依赖没完成的任务)。

这个 Flow 不是我发明的,Github 最初版本的 Flow 包含这个步骤的。只是现在看到的 Github Flow 版本官方教程,省略了 Fork,简化了很多。而 Fork 在 Github 最初的理念正是体现了 Social Coding 。
Achieve7
2020-12-21 10:15:40 +08:00
我一般是本地 rebase 一遍 rebase -i, 然后 Squash, 最后再推上去 主干永远是一条线
Achieve7
2020-12-21 10:15:52 +08:00
@msg7086 很难不资瓷
geying
2020-12-21 11:19:35 +08:00
git stash
git fetch
git stash pop
git push

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/737281

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX