什么策略来推动和重新定位一个活跃的分支?
What strategy to push and rebase a living branch?
我想了解在已推送的分支上使用 rebase
策略是否是保持 master 日志历史记录干净的好解决方案。
情况是我正在现有项目上开发一项功能,而且我是该特定功能的唯一开发人员。但是,我不想在它准备好合并之前将其保留在本地。相反,我想定期推动我的工作以获得反馈并为我的同事提供可能的灵感。
不幸的是,在开发过程中 master
也在不断发展。为了避免我的分支与 master 偏离太远,我可以决定 merge
或 rebase
它与 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
但是,此解决方案并非没有缺陷。如果我不想被任何人讨厌,其他开发人员必须遵守一些规则。
- 名为
feature/<name>-u
的分支(对于不稳定的分支)有时可能会在 master 的顶部重新建立分支
- 在这些分支上,不会发布任何正式版本
- 我绝不能在外部功能分支的顶部提交
我还应该担心什么?
当然还有第三种解决方案,即 squash
该功能作为 master
上的一次提交,这可以作为此工作流的替代方案。这有利于保持 master 上的功能干净,但无助于保持功能分支干净。
我认为您应该使用 "merge" 解决方案。不要重写历史,因为你永远不知道是否有人基于你的 "old" 提交,这可能会在未来导致一团糟。 "merge" 解决方案中的历史图表非常清晰,如果您正确提交(原子提交)并编写良好的提交消息,可以特别理解。
我想了解在已推送的分支上使用 rebase
策略是否是保持 master 日志历史记录干净的好解决方案。
情况是我正在现有项目上开发一项功能,而且我是该特定功能的唯一开发人员。但是,我不想在它准备好合并之前将其保留在本地。相反,我想定期推动我的工作以获得反馈并为我的同事提供可能的灵感。
不幸的是,在开发过程中 master
也在不断发展。为了避免我的分支与 master 偏离太远,我可以决定 merge
或 rebase
它与 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
但是,此解决方案并非没有缺陷。如果我不想被任何人讨厌,其他开发人员必须遵守一些规则。
- 名为
feature/<name>-u
的分支(对于不稳定的分支)有时可能会在 master 的顶部重新建立分支
- 在这些分支上,不会发布任何正式版本
- 我绝不能在外部功能分支的顶部提交
我还应该担心什么?
当然还有第三种解决方案,即 squash
该功能作为 master
上的一次提交,这可以作为此工作流的替代方案。这有利于保持 master 上的功能干净,但无助于保持功能分支干净。
我认为您应该使用 "merge" 解决方案。不要重写历史,因为你永远不知道是否有人基于你的 "old" 提交,这可能会在未来导致一团糟。 "merge" 解决方案中的历史图表非常清晰,如果您正确提交(原子提交)并编写良好的提交消息,可以特别理解。