摆脱以前的提交,移动原点/头部原点/主人

时间:2017-10-30 00:11:58

标签: git github

我不知何故让我的本地回购(c9.io和我的网络服务器)不同步,这是一个非常混乱。我尝试git pull,然后推动更改,每次它都拧紧另一个位置。

我想做的是在e39a8ac之后删除所有提交,所以我不再收到10个提交消息。我尝试做一个git rebase并恢复和重置,但我不知道如何解决它。

请帮助。 Git有时很好,但除此之外我感到迷茫。

Photo of my sourcetree

1 个答案:

答案 0 :(得分:4)

TL; DR

您可以尝试使用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 询问他们请设置他们的 mastere39a8ac。问题是他们会注意到这会丢失至少五个提交 - 我们在你的图像中可以看到的五个 - 几乎肯定是另外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 ,并将其更改为命令:更新您的mastere39a8ac他们是否会服从完全是另一个问题;它取决于他们和他们的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。