不知怎么的,我的本地repo(c9.io和我的web服务器)失去了同步,这是一个巨大的混乱。我试着用git pull,然后按更改,每次都会把另一个位置搞砸。
我想做的是去掉e39a8ac之后的所有提交,所以我不再得到behind 10 commits消息。我试着做一个git回退,还原和重置,但我不知道如何修复它。
请帮忙。吉特有时是好的,但否则我会感到失落。
最佳答案
TL;博士
您可以尝试使用强制推:git push -f origin master
。那就够了。可能不会。可能做得太多了。小心点。
相反,最好添加新的提交来撤消您不想做的事情,并保留以前的提交,然后只推送新状态。git在添加新提交方面非常棒,而且没有像force push那样的危险。
说明
记住,当使用git时,您拥有自己的存储库,而其他人(例如c9.io
代表一个存储库,而web服务器代表另一个存储库)拥有自己的存储库。您可以对存储库执行任何操作。让他们做你想做的事情是很难的。
您的图像显示您的master
指向e39a8ac
,这是您想要的。所以你的仓库现在没问题了。注意,我们称之为“master
指向e39a8ac
”。
在存储库中,您有一个缩写url的短名称origin
。在那个url上,有另一个git和另一个存储库。您可以运行git fetch origin
让您的git连接到他们的git并从他们那里获得新的to you提交。如果您这样做了,您的git将在您的存储库中记录它们的master
作为您的origin/master
。这就是你的吉特上次在那里看到的东西。看起来你在某个时候做了那件事,或者类似的事。
(到目前为止,这一切都只是为了让你能看到我下面所说的。)
您还可以运行git push origin <hash-or-branch-name>:<their-branch>
让您的git连接到他们的git并向他们发送任何新的提交。(他们已经有了任何提交,您不必发送。)您的git然后礼貌地询问他们的git,如果介意的话,请将其分支名称设置为git向他们建议的提交散列。他们可以以任何理由拒绝,但如果他们与你合作,他们可能只会以一个理由拒绝:你的请求会导致他们失去一些承诺。
因此,您可以运行:
git push origin master:master
(您可以缩写为
git push origin master
1)要求他们将master
设置为e39a8ac
。问题是,他们会注意到这将丢失至少5次提交,我们可以在您的图像中看到的5次提交,几乎可以肯定还有5次提交(您自己的git说您“落后”了10次,这是基于您的git对其gitmaster
的记忆)。git非常非常面向“添加新提交”的概念。It's always happy to assimilate new distinctive technology into its Borg Collective.但它往往对拿走东西的想法犹豫不决。
不过,你也可以尝试使用“强制推送”:
git push --force origin master:master
这将更改git的礼貌请求,请将您的
master
更新为e39a8ac
,改为命令:将您的master
更新为e39a8ac
!他们是否会服从完全是另一个问题;这取决于他们和他们的git和他们的设置。如果他们真的服从,这将从他们的存储库中删除一些提交。这可能正是你想要的,如果是的话,你可以在这里完成。但请记住,可能有很多存储库。假设他们接受您的命令,现在您的git让您的master指向
e39a8ac
,他们的git让他们的master
指向e39a8ac
(这样您的origin/master
也指向e39a8ac
)。但是第三个git出现了,并对他们说:嘿,我有4a3c63d
和9个您可以添加到master
的提交,您想要它们吗?Git是如此的像博格人,他们的Git可能会立即抓到他们,并把他们放回他们的仓库…现在,如果你将你的git连接到他们的git,你将得到相同的提交。对于强制“获取”,您必须说服每个拥有存储库副本的git用户将其
master
设置回原来的位置,以便他们都抛出您将抛出的10个提交。如果只有两个仓库,你就很好了。如果有第三个,但你说服他们也这么做,你是好的。否则,请考虑另一种选择:不要尝试删除您不喜欢的提交,只需添加另一个新的提交,使事情恢复到您喜欢的方式:* 4a3c63d (origin/master) Merge ...
|\
| * dcca8ec made ONE CHANGE to console log
* | aa6b21e changed console log
* | ...
假设您添加了一个新的提交,我们就称它为
nnnnnnn
,2将每个文件都按您所希望的方式放回去:* nnnnnnn (master) Put everything back the right way
* 4a3c63d (origin/master) Merge ...
|\
| * dcca8ec made ONE CHANGE to console log
* | aa6b21e changed console log
* | ...
如果您现在运行
git push origin master
,您的git将向他们的git提供这个新的提交。他们会贪婪地吞下它并将其添加到集体中,并将其master
设置为nnnnnnn
。现在你和他们会匹配,任何连接到他们的第三个git都会选择nnnnnnn
,以此类推。缺点是,这会留下一些无用的提交,以及所有这些文件的版本。但一般来说,这并不是非常有害的(除非这些文件中有秘密密码,或者是千兆字节的电影或DVD图像,或者其他什么)。
1如果省略
:master
,默认情况下,git会要求他们设置与您相同的名称:git push origin master
=>git push origin master:master
;git push origin xyz
=>git push origin xyz:xyz
;依此类推。您甚至可以一次指定多个对象:git push origin master xyz:hello
表示git push origin master:master xyz:hello
。2预测下一次提交的散列ID太难了。甚至Git还不知道,因为Git用来生成散列ID的输入之一就是生成散列ID的确切时间。即使提交的其他内容完全相同,但迟早会完全更改ID。
关于git - 摆脱先前的提交,移动原点/头部原点/母版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47006567/