3

解释发生的事情的唯一合理方法是使用图表(提交按字母顺序排列)

起始状态:

C (master, HEAD, origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
|
B
|
A

然后我又回到了 A,因为我和 B 和 C 走错了方向:git checkout A

C (master, origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
|
B
|
A (HEAD)

现在我做了一系列新的好改变:

E (HEAD)
|
D
|
| C (master, origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
| |
| B
| |
|/
A

废话。忘了我把我的头分开了。好的。让我们试试这个! git branch -f master E

E (master, HEAD)
|
D
|
| C (origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
| |
| B
| |
|/
A

这就是我现在的位置。我知道如果我跑步git pull,我会从 B 和 C 那里得到糟糕的变化。我不确定如果我尝试会发生什么git push

我是否必须去所有遥控器,git revert然后将那些新的“还原”提交合并回这里?这是解决问题的方法吗?有额外的与合并相关的提交混乱是可以的,但我希望有一种方法可以摆脱这种情况而不会留下混乱。

理想情况下,我希望保留 B 和 C 的历史,以防我确实希望它们回来。我想我需要建立一个分支来正确地做到这一点,但现在这些更改还不够重要,甚至不足以保证为它们配置(并考虑名称)分支所需的努力。

我做了一些搜索,发现git revert -m-something 可能是合适的,但我不确定如何应用它(即,我不确定如何确定合并时 B 和 C 被丢弃)。正如你所看到的,我有很多遥控器,并且更喜欢一个我可以安全轻松地应用于所有遥控器的命令(或者更棒的是,也许我可以列出所有遥控器来运行它)。

更新:

我现在挖了一个更深的洞:

我跑git push -f了我所有的遥控器。

所以,一个新用户会加入这个:

E (master, HEAD, origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
|
D
|
A

但是我忘记了我是如何在 ec2 上设置东西的,该服务器的裸仓库有一个 post-receive 钩子,它 cd 到本地常规仓库,并git pull从那里运行。所以我确实有一个虚拟用户一直在拉所有分支。

对于这个 repo,它现在看起来像这样,因为这个用户只有一个遥控器,origin它与ec2我的 macbook(所有其他图表)中的遥控器相同:

E (origin/master, origin/HEAD)
|
D
|
| C (HEAD, master)
| |
| B
| |
|/
A

在这一点上,我想,好吧,我还是去保存 B 和 C(稍后将它们作为分支推送到远程,它应该可以安全地传播):

E (origin/master, origin/HEAD)
|
D
|
| C (HEAD, saving-B-C, master)
| |
| B
| |
|/
A

但这是我卡住的地方:

$ git branch -f master E
fatal: Cannot force update the current branch.

帮助!

4

2 回答 2

1

这将解决何时git push -fgit reset --hard origin/master不是选项的情况(即问题中更新之前的问题)。

创建一个指向 commit 的分支C

git checkout -b temp origin/master

然后按照此处的说明还原 B 和 C。

所以现在你的历史看起来像这样:

E (master)
|
D (BC)' (temp, HEAD)
| |
| C (origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
| |
| B
| |
|/
A

现在您要移动提交DE因此它们在还原之后。有几种方法可以做到这一点,一种可能是:

git checkout master
git rebase temp
git branch -d temp

现在你的历史看起来像这样:

E (master, HEAD)
|
D
|
(BC)'
|
C (origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
|
B
|
A

可以安全地推送到您的所有遥控器。

于 2013-08-02T03:47:32.283 回答
1

啊哈!我第二次查看错误消息,并按字面意思解释它。然后我想到我必须跳下我站着的岩石才能移动它。

git checkout saving-B-C
git branch -f master E

成功!

于 2013-08-02T04:19:47.513 回答