解释所发生事情的唯一合理方法是使用图表(提交按字母顺序排列)
开始状态:
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.
帮助!
答案 0 :(得分:1)
这将解决git push -f
和git 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
现在您要移动提交D
和E
,以便它们在恢复之后。有几种方法可以做到这一点,其中一种可能是:
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
成功!