情境:
人A创建一个实验分支来解决问题。 B人有兴趣并希望检查代码,由于懒惰的人A推送到他的github而不是配置他的工作站让B人直接从他那里拉。
A和B正在被黑客攻击,C人看到github和克隆人的活动,急于查看最新情况。同时A和B总结了一个可怕的解决方案,并且删除了分支。但是,C人设法将这个想法变成了一个伟大的想要分享的东西。合并地狱开始于C的分支不再与他的合并目标有共同的祖先。
我很高兴看看应如何处理这种情况。
如果所有其他方法都失败了,在这种情况下,C人的正确策略是什么?如何在断开连接的图表中完成工作后如何正确应用更改?
答案 0 :(得分:4)
目前还没有正式的惯例。
抛弃分支的一个很好的例子(2010年3月在Git rebase上的文章中提到)是 git.git的分支pu 。
“pu”分支通常不会快进,因为自上次拉动以来,某些提交已完全删除。
如果要跟踪它,请在
.git/config
文件中的正确行添加加号(+),如下所示:
[remote "origin"]
fetch = +refs/heads/pu:refs/remotes/origin/pu
告诉git只需跳过快进检查(用旧的<覆盖您的旧参考)就可以解决问题。
或者,如果您根本不想跟踪pu分支,则可以完全删除该行。可以想象,在git的未来版本中,我们可能希望能够标记一些分支“这预计会被重绕”显式并使克隆操作注意到,给你加号自动。
所以一个想法就是主动阻止(通过钩子)对那些扔掉分支的推动:
答案 1 :(得分:2)
合并地狱开始,因为C的分支不再与他的合并目标有共同的祖先。
当然,A的主分支在已删除的分支中有一个祖先(在其历史中)。
C可以将分支推送到github,A可以再次将其拉出。这有什么问题?或者,C可以在一个新的分支中(在A的主人之上)进行合并/变基,再次让A从他那里拉出来。
删除分支实际上并不会重写历史记录,至少不会以阻止合并的错误方式重写。
我假设A有这样的历史:
a--b--c--d--e--f--g master
|
x--y--z experiment
所以删除分支后,他仍然有从a到c的提交,可能看起来更像是:
a--b--c--d--e--f--g--h--i--j--k master
人C可能有:
a--b--c--d--e--f--g master
|
x--y--z--w--v--q experiment
这是一个完全合理的情况,合并不应该那么糟糕。
例如,C人可以从A的主人那里取出并将实验合并到其中。
答案 2 :(得分:0)
每个维护者都对自己的分支负责。你不能假设另一个提交者提交或不提供了很好的东西。
如果提交者和作者不是同一个人,您可以查看信息。
如果您不想要某个补丁,可以在自己的分支中恢复它。