解释发生的事情的唯一合理方法是使用图表(提交是按字母顺序排列的)
开始状态:
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
-有些东西可能是合适的,但我不确定如何应用它(即,我不确定如何确保在合并时抛出b和c)。如你所见,我有许多遥控器,我更喜欢一个命令,我可以安全和容易地应用到所有的遥控器(或更可怕的可能有一些东西,我可以列出所有的遥控器来运行它)。更新:
我现在挖了一个稍微深一点的洞:
我在所有的遥控器上运行。
所以,一个新用户会加入这个:
E (master, HEAD, origin/master, origin/HEAD, ec2/master, devserver/master, devserver/HEAD)
|
D
|
A
然而,我忘记了如何在ec2上设置一些东西,在ec2上,服务器的裸机repo有一个post-receive挂钩,cd连接到本地的常规repo,并从那里运行
git push -f
。所以我有一个虚拟用户他妈的一直在拉所有的分支。对于这个repo,现在看起来是这样的,因为这个用户只有一个远程
git pull
,它与我的macbook中的origin
是同一个远程的(所有其他图表):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.
救命啊!
最佳答案
当git push -f
和git reset --hard origin/master
不是一个选项(即问题中的更新之前的问题)时,这将解决问题。
创建指向提交的分支:
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
现在要移动提交
C
和D
以便它们在还原之后。有几种方法可以做到这一点,其中一种可能是: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
它可以安全地推到你所有的遥控器上。