Git,如何将原点/主节点重置为提交?


244

我通过以下命令将本地主服务器重置为提交:

git reset --hard e3f1e37

当我输入$ git status命令时,终端会说:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

由于我也想重置原点/标头,因此我签出到原点/原版:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

并通过以下命令重置标头:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

然后,我尝试将提交失败的提交添加到源/标题。

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

最后,我结账给我的当地主人。

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

因为我重置了原点/主节点的头,我希望本地和原点应该在同一方向,但是正如您所看到的,git表示我的本地/主节点落后原点/主节点7次提交。

如何解决此问题?我要查找的内容是Local / master的负责人和origin / master的指向同一提交。下图显示了我的工作。谢谢。

在此处输入图片说明


首先,请确保允许将强制代码强制推送到项目中受保护的分支,否则您将无法...
DarmVillegas

Answers:


562

origin/xxx分支始终是指向远程的指针。您不能检出它们,因为它们不是指向本地存储库的指针(您仅检出提交。这就是为什么您看不到命令​​行界面分支标记中写的名称,仅看到提交哈希的原因)。

您需要做的就是更新远程服务器,以强制将本地更改推送到主服务器:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
该操作可以执行请求的操作,但请记住,这会使已经从master撤消提交的人感到不满。
mnagel

我按照此步骤操作,然后回滚。但是原点/ HEAD现在指向主节点以外的其他分支。我该怎么做才能解决此问题?
Daniil Shevelev 2013年

1
您不必在意原产地/ HEAD,只需将优质参考文献推到原产地/参考文献
Simon Boudrias

同意,在将错误的分支意外合并在一起然后推向原点之后,今天必须这样做。它运作良好,但是如果其他人从源头检查了受影响的分支机构,则可能会造成很大的破坏。请谨慎使用。
尼克W.

1
不起作用 remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

此处找到的解决方案帮助我们将master更新为已推送的先前提交:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

与接受的答案的主要区别是在推入命令中的主控之前的提交哈希“ e3f1e37:”。


1
不起作用:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0,如消息所示you should pull first:)
直观

这个问题的答案是stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards false但实际上我手动设置,在我的本地git仓库我有/opt/git我创建了这里的想法玩。我不确定如何或是否可以对bitbucket,github等执行此操作……@intuitivepixel毫无意义,因为它会逆转您尝试通过硬重置实现的目标。
汉卡2015年

嗨,@ jkovacs,我不想删除master中的新更改。我只想将提交哈希“ e3f1e37”推送到原始主机。是否可以跳过第二个命令git reset --hard“ e3f1e37”?
卡伦·安妮(KarenAnne)

@jkovacs,您好,我只是确认我可以跳过第二步。:)
KarenAnne 2015年

2

假设您的分支master在这里和远程都被调用,并且您的远程被调用origin,则可以执行以下操作:

git reset --hard <commit-hash>
git push -f origin master

但是,如果其他任何人正在使用远程存储库并撤消更改,则应避免这样做。在这种情况下,最好还原不需要的提交,然后按正常方式推送。


1

由于我的处境类似,因此我想与他人分享我的处境以及这些答案如何帮助我(感谢大家)。

因此,我决定每次想保存主分支上的进度时都要修改最后一次提交(在本地工作)(我知道,我应该分支出来,在上面提交,继续推送,然后再合并回master)。

一个深夜,由于担心会失去硬件故障或以太坊之外的东西而产生的偏执狂,我决定将master推向原点。后来我一直在修改本地的master分支,当我决定是时候再推时,我遇到了不同的master分支,发现我无法像本地开发分支一样修改原始/上游(duh!)。

所以我没有在本地结帐master,因为我已经在提交之后。主人没有改变。我什至不需要重置-辛苦,我现在的提交还可以。

我只是强行推入了原点,甚至没有指定我要向master强制的提交,因为在这种情况下,这就是HEAD所在的位置。经过检查,git diff master..origin/master所以没有任何区别,仅此而已。全部固定。谢谢!(我知道,我是git新手,请原谅!)。

因此,如果您已经可以在本地使用master分支,则只需:

git push --force origin master
git diff master..origin/master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.