我不知何故让我的本地回购(c9.io和我的网络服务器)不同步,这是一个非常混乱。我尝试git pull,然后推动更改,每次它都拧紧另一个位置。
我想做的是在e39a8ac之后删除所有提交,所以我不再收到10个提交消息。我尝试做一个git rebase并恢复和重置,但我不知道如何解决它。
请帮助。 Git有时很好,但除此之外我感到迷茫。
答案 0 :(得分:4)
您可以尝试使用force-push:git push -f origin master
。这可能就足够了。它可能不会。它可能太多。要非常小心。
相反,通常会更好地添加新的提交,撤消您不想做的事情,并将之前的提交保留在那里,然后只需按下新国家。 Git非常适合添加新的提交,并且没有像使用force-push那样的危险。
请记住,在使用Git时,您拥有您的存储库,其他所有人(例如c9.io
和其他人的Web服务器)他们的> em>存储库。您可以对您的存储库执行任何操作。让他们做你想要他们的存储库的内容更难。
您的图片显示您的master
指向e39a8ac
,这就是您想要的内容。所以你的存储库现在可以了。请注意,我们将其称为" master
指向e39a8ac
"。
您的存储库中有一个缩写URL的短名称origin
。在该URL,还有另一个Git与另一个存储库。你可以运行git fetch origin
让你的Git连接到他们的Git并从他们那里获得新的提交。如果您这样做,您的Git会在您的存储库中记录他们的 master
作为您的origin/master
。这就是你的Git记得你最后在那里看到的东西。在某些时候,你看起来就是这样做的,或类似的东西。
(到目前为止,这只是为了让你能够看到我在下面谈论的内容。)
您还可以运行git push origin <hash-or-branch-name>:<their-branch>
让您的Git连接到他们的Git,向他们发送任何新的提交。 (他们已经拥有的任何提交,你不必发送。)你的Git然后礼貌地问他们的Git,如果它会介意请将你的分支名称设置为你的Git建议给他们的commit-hash。他们可以出于任何原因拒绝,但如果他们与您合作,他们可能只会因为一个原因而拒绝:您的请求会导致他们丢失某些提交。< / p>
因此,您可以运行:
git push origin master:master
(您可以简称为git push origin master
1 )询问他们请设置他们的 master
到e39a8ac
。问题是他们会注意到这会丢失至少五个提交 - 我们在你的图像中可以看到的五个 - 几乎肯定是另外5个(你自己的Git说你是&#34;十)根据你Git对他们的master
的Git记忆,他们背后了。
Git非常非常更多地面向&#34;添加新提交&#34;的概念。 It's always happy to assimilate new distinctive technology into its Borg Collective.但是,它倾向于忽略了远离的想法。
但是,您可以尝试使用&#34;强制推送&#34;:
git push --force origin master:master
这会更改您Git的礼貌请求,请将您的master
更新为e39a8ac
,并将其更改为命令:更新您的master
到e39a8ac
!他们是否会服从完全是另一个问题;它取决于他们和他们的Git及其设置。如果他们服从,那将从他们的存储库中删除一些提交。这可能正是你想要的,如果是,你可以在这里完成。
但请记住,可能有许多存储库。假设他们接受了您的命令,现在您的Git让您的主人指向e39a8ac
并且他们的Git将master
指向e39a8ac
(以便您的origin/master
也指向{ {1}})。然后第三个Git出现并对他们说:嘿,我有e39a8ac
还有九个你可以添加到4a3c63d
的提交,你想要它们吗? Git be所以像Borg一样,他们的Git可能会立即将它们收起来并将它们放回他们的存储库中......现在,如果你将你的Git连接到他们的Git,你将会得到那些相同的提交
对于强制推送&#34;采取&#34;,您必须说服拥有该存储库副本的每个 Git用户设置他们的 {{ 1}}返回,以便他们所有抛出你将丢弃的十个提交。如果只有两个存储库,那么你很好。如果有第三个,但你说服他们这样做,你就会很好。否则,请考虑另一种选择:不要尝试删除提交,而不是尝试添加另一个新提交,以便按照 这样的方式设置回事:
master
假设您添加了一个新提交,我们只需将其命名为master
, 2 ,将每个文件放回原来的位置:
* 4a3c63d (origin/master) Merge ...
|\
| * dcca8ec made ONE CHANGE to console log
* | aa6b21e changed console log
* | ...
如果您现在运行nnnnnnn
,您的Git将为他们的Git提供此新提交。他们会贪婪地吞噬它并将其添加到他们的集体中,并将他们的* 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都会选择master
,依此类推。
缺点是这会留下一些无用的提交,包括所有这些文件的版本。但通常这不是非常有害(除非这些文件中有秘密密码,或者是数千兆字节的电影或DVD图像,或者其他什么)。
1 如果您遗漏nnnnnnn
,默认情况是您的Git要求他们设置您提供的相同名称:nnnnnnn
=&gt; :master
; git push origin master
=&gt; git push origin master:master
;等等。您甚至可以一次指定多个内容:git push origin xyz
表示git push origin xyz:xyz
。
2 预测下一个提交的哈希ID太难了。即使是Git还不知道,因为Git用来制作它的一个输入就是你制作它的确切时间。即使关于提交的所有其他内容完全相同,每一秒都会尽快更改ID。