Cherry 挑选一个被推力覆盖的提交

Cherry picking a commit that was overwritten by a push force

这些是原始分支上的提交:

A -> B -> C1

在本地,当它只有 A -> B 提交时我有分支,我添加了一个新的提交。所以本地分支看起来像:

A -> B -> C2

我强制执行并覆盖远程分支,因此它删除了 C1 提交并将其替换为 C2

是否可以取回 C1 并将其添加回分支?

我尝试使用 cherry pick,但得到 fatal: bad revision。但是,我能够使用 gitlab 的网络界面挑选它。如果没有 gitlab,这可能吗?

您需要找到一个实际包含提交的存储库。

显然,您的 存储库没有:

I tried with cherry pick, but I get fatal: bad revision

很明显,他们的存储库(您强制推送到的存储库)之前有。他们是否仍然这样做取决于 (a) 是否可以通过其他方式访问提交,如果不能,(b) 他们对垃圾收集无法访问的提交的积极程度。

如果上游存储库有其他用户,这些其他用户可能已将提交复制到他们的存储库中。

请注意,当您再次获得 C1 并在其上使用 cherry-pick 时,您会得到一个新的不同的提交, 具有相同的效果C1,与 C1 的作者相同,但您是提交者。你可以称它为 C3,或者——为了表明它与原来的 C1 有多相似——你可以称它为 C1'。如eftshift0 noted in a comment,最终结果为:

A <-B <-C2 <-C1'   <-- branch

如果其他人仍有提交 C1,他们可能会尝试重新引入它。这通常是无害的:取决于他们如何进行此尝试,它可能只是 删除 他们的副本,或者它可能会进行无效的合并:

     C2--C1'
    /      \
A--B        M   <-- branch
    \      /
     --C1--

这种事情就是为什么变基 and/or 强制推开其他人的提交通常是不明智的。如果他们没有预料到,他们会重新提交他们的提交,即使您已经提交了包含他们工作的新提交。

如果这些存储库的所有各种克隆的所有用户都同意在该分支名称上使用变基 / cherry-picking 和强制推送 do,那么在那种情况下没关系。每个用户都应该注意到这种情况已经发生(如果有必要)并采取任何必要的措施(如果有的话)进行补偿。