什么策略来推动和重新定位一个活跃的分支?

What strategy to push and rebase a living branch?

我想了解在已推送的分支上使用 rebase 策略是否是保持 master 日志历史记录干净的好解决方案。

情况是我正在现有项目上开发一项功能,而且我是该特定功能的唯一开发人员。但是,我不想在它准备好合并之前将其保留在本地。相反,我想定期推动我的工作以获得反馈并为我的同事提供可能的灵感。

不幸的是,在开发过程中 master 也在不断发展。为了避免我的分支与 master 偏离太远,我可以决定 mergerebase 它与 master 。

因为 rebase 是在改写历史,社区 (SO) 通常不鼓励我这样做。特别是当我已经推动了我的一些工作时。尽管有这些建议,但我觉得将我的工作重新定位在 master 之上有时仍然是正确的做法。

让我们想象一下我在使用 rebase 和更常见的 merge 策略的情况下几周后的工作:

Solution with merge                Solution with rebase

G    master origin/master              n feature origin/feature
| e  feature origin/feature            m
F/|                                    l
E |                                    k
| d                                   /
| c                                  G master origin/master
D/|                                  F
C |                                  E
| b                                  D
| a                                  C
B/                                   B
A                                    A

当最后的 merge 到来时,将我的完整开发历史拖回 master 会导致日志复杂,有时难以阅读。

rebase 解决方案导致简单的快进合并并最终导致更清晰的日志。

H    master/origin/master
G \    
| e                                  n master origin/master
F/|                                  m
E |                                  l
| d                                  k 
| c                                  G 
D/|                                  F
C |                                  E
| b                                  D
| a                                  C
B/                                   B
A                                    A

但是,此解决方案并非没有缺陷。如果我不想被任何人讨厌,其他开发人员必须遵守一些规则。

  1. 名为 feature/<name>-u 的分支(对于不稳定的分支)有时可能会在 master
  2. 的顶部重新建立分支
  3. 在这些分支上,不会发布任何正式版本
  4. 我绝不能在外部功能分支的顶部提交

我还应该担心什么?

当然还有第三种解决方案,即 squash 该功能作为 master 上的一次提交,这可以作为此工作流的替代方案。这有利于保持 master 上的功能干净,但无助于保持功能分支干净。

我认为您应该使用 "merge" 解决方案。不要重写历史,因为你永远不知道是否有人基于你的 "old" 提交,这可能会在未来导致一团糟。 "merge" 解决方案中的历史图表非常清晰,如果您正确提交(原子提交)并编写良好的提交消息,可以特别理解。