0

给定初始状态:

A - origin/branch-1
|
X   A - origin/branch-2
| /
M - master

在两个A提交进行相同编辑并且与提交没有重叠的X情况下,使事情达到以下状态的最佳方法是什么?:

A - origin/branch-1 - origin/branch-2
|
X
|
M - master

具体来说,我不想最终处于以下状态,因为(无论采取何种物理动作)逻辑动作是顺序的并且不包括合并(即A未遵循的状态一开始X就永远不会有效,应该从存储库中删除):

M - origin/branch-1 - origin/branch-2
|  \
A   |
|   |
X   A
| /
M - master
4

1 回答 1

0

远程跟踪名称类似于origin/branch-1origin/branch-2代表您的Git对其他 Git 分支名称的记忆。也就是说,你的 Git 调用了他们的 Git;他们的 Git 说我的branch-2 holds hash ID _____(用实际的哈希 ID 填写空白),然后你的Git 会在必要时抓取该提交,以便你拥有它,并创建或更新 yourorigin/branch-2以指向该提交。

假设AandA确实是Aand ——即A',两个不同的提交,具有不同的哈希 ID,但效果相似),你的工作是说服另一个Git 存储库——一个在上面origin——将分支名称设置branch2为指向这两个中的任何一个所需的哈希。在Git 中以 name拥有该哈希 ID origin/branch-1,因此:

git push --force origin origin/branch-1:branch-2

会让你的 Git 调用 Gitorigin并告诉它:我不在乎你branch2现在识别哪个提交,现在让它指向哈希 ID _____(此处的空白处填写您的 Git 存储在 name 下的哈希 ID origin/branch-1)。

他们可能服从这个命令,也可能不服从。如果他们不这样做,你就不能像这样从这里修复它:你必须让可以发出此类命令的人来执行此操作。某人可能是您自己但直接登录到服务器,或者可能是具有管理权限的人。1

假设他们确实服从。他们branch-2当前指向一些提交——也许是你认为的那个,也许是从那时起添加的其他提交。不过,无论哪种方式,他们都服从你的有力命令,现在他们的branch-2观点指向了对方A。你的 Git 看到他们确实遵守了,并更新了你的origin/branch-2,你就得到了你想要的。

小心强制推送操作。请注意,您可以使用--force-with-lease,但要这样做,您需要在终端上创建一个本地分支名称。该--force-with-lease操作需要知道要交给他们的哈希 ID,因为它将命令从I don't care___更改为I think your branch is current ___; 如果是这样,请将其设置为___; 无论哪种方式,请告诉我我是否正确以及您是否服从。 为了使所有这些工作,您的 Git 拥有自己的本地名称branch-2,它可以映射回您的本地名称,origin/branch-2以便它可以获取两个空白的哈希 ID。


1作为一个诡计,有时如果您无法说服另一个 Git 更新分支名称,您可以告诉另一个 Git完全删除该分支名称。删除它后,您可以告诉其他 Git 创建一个全新的、完全不同的分支名称,只是恰好拼写完全相同。很多时候,一个不允许你强制更新分支名称的 Git 会允许你随意删除和重新创建它。

于 2020-03-24T19:30:50.920 回答