git - 摆脱先前的提交,移动原点/头部原点/母版

标签 git github

不知怎么的,我的本地repo(c9.io和我的web服务器)失去了同步,这是一个巨大的混乱。我试着用git pull,然后按更改,每次都会把另一个位置搞砸。
我想做的是去掉e39a8ac之后的所有提交,所以我不再得到behind 10 commits消息。我试着做一个git回退,还原和重置,但我不知道如何修复它。
请帮忙。吉特有时是好的,但否则我会感到失落。
Photo of my sourcetree

最佳答案

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 master1)要求他们将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:mastergit 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/

相关文章:

git - 为什么 git stash pop 说它无法从存储条目中恢复未跟踪的文件?

git - 是否可以在不更改当前提交中的文件的情况下修改父提交?

Git 认为我是另一个人

javascript - 为什么我无法在 .gitignore 中指定相对路径?

Github 代码评论 : Automatically Reset and Rerequest Approvals after Changes

git - 有没有办法将 Git 限制为稀疏 checkout ?

git - 是否有与 git archive 相反的命令用于导入 zip 文件

git - 修剪空格

git - git 克隆后我可以发出 pull 请求吗?

docker - 如何使用 GitHub Actions 实现多阶段 Docker 构建?