在本地从Detached HEAD进行一系列提交后,如何更新远程分支?

时间:2013-08-02 03:31:21

标签: git

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

开始状态:

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

垃圾。忘了我离开了HEAD。好的。我们来试试吧! 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 - 这可能是合适的,但我不确定如何应用它(即,我不确定我怎么能确定B和C被抛出合并时)。你可以看到我有很多遥控器,我更喜欢一个命令,我可以安全,轻松地应用到所有的遥控器(或者甚至更棒的可能还有一些东西,我可以列出所有的遥控器来运行它)。

更新

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

我在所有遥控器上都跑了git push -f

所以,一个新用户会提到这个:

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

然而,我忘记了如何在ec2上设置东西,其中该服务器的裸仓库有一个后接收挂钩,cd到本地常规仓库,并从那里运行git pull。所以我确实有一个虚拟用户在所有该死的时间拉动所有分支。

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

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.

帮助!

2 个答案:

答案 0 :(得分:1)

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

创建一个指向commit C的分支:

git checkout -b temp origin/master

然后按照here说明恢复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

推送所有遥控器是安全的。

答案 1 :(得分:1)

啊哈!我第二次查看了错误消息,并且更加字面地解释了它。然后我突然意识到,我只能跳下我站在那里移动它的岩石。

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

成功!