解释发生的事情的唯一合理方法是使用图表(提交按字母顺序排列)
起始状态:
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.
帮助!