Git拉入错误的分支


74

我本人和其他开发人员一直在合并并将我们的工作推到一个非主分支(称为工具工作)。这样,我们就不会影响团队的其他成员。我的主题分支称为DPM-93,我的git工作流程就是这样。

# do some work
git checkout DPM-93
git commit -m "did some work"

# catch up
git checkout toolwork
git pull origin toolwork

# rebase my topic branch
git checkout DPM-93
git rebase toolwork

# merge and push my changes
git checkout toolwork
git merge --no-ff DPM-93
git push origin toolwork

在我不小心发出了这些git命令之前,那几乎可以正常工作

git checkout toolwork
git pull origin master

那时,分支工具中出现了一堆新东西,我不确定如何删除它,除非删除我的工作区并从仓库中重新克隆。

有什么办法可以将其恢复到拉动之前的状态吗?

Answers:


104
git reset --hard ORIG_HEAD 

git reset手册页中(如果您刚刚进行了提取):

撤消合并或拉动

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)
  1. 尝试从上游进行更新导致了很多冲突;您现在不准备花费很多时间进行合并,因此您决定稍后再进行。
  2. pull”尚未进行合并提交,因此“ git reset --hard”的同义词是“ git reset --hard HEAD”,清除了索引文件和工作树中的混乱情况。
  3. 将一个主题分支合并到当前分支中,从而实现了快进。
  4. 但是您认为主题分支尚未准备好供公众使用。
    “ pull”或“ merge”始终将当前分支的原始尖端保留在中ORIG_HEAD,因此很难对其进行重设置,将索引文件和工作树恢复到该状态,并将分支的尖端重置为该提交。

请参阅HEADORIG_HEAD更多。


难道是好使用git rebase -i ORIG_HEAD,删除无用的提交,假设没有人尚未从主拉?
unutbu

@unutbu:我相信这种改头换面的最终结果将与git reset这种情况相似。
VonC

谢谢@VonC。很抱歉这个愚蠢的问题。不知何故,我没有意识到,git reset --hard不仅改变了工作树和索引,而且还删除了DAG中的父指针。
unutbu 2010年

82

重置master分支:

git reset --hard origin/master

11
不知道这是否是因为“正确”答案已经2岁了,但是在没有运气的情况下尝试了其他建议之后,这对我有用。
Levi Rosol 2012年

5
这解决了我遇到的问题,就是我进入了错误的分支
HorseloverFat 2013年

2
为我工作。谢谢
Glen

9

您可以用来git logtoolwork分支的开头找到想要的修订版本的SHA-1 ,然后用于git reset --hard <SHA1>将工作副本还原到该修订版本。

首先备份一切!然后重新阅读该手册页,git reset以确保它正在执行您想要的操作。

编辑:哦,是的,ORIG_HEAD应该包含正确的SHA-1。但是先检查一下。


起初没有看到您的回答。git reset是正确的(尽管您正确地提到了一点危险)。+1
VonC

最好选择此答案,因为您可以更明确地确定要还原到的提交。就我而言,这很有用,因为在我不小心拉错了分支之前,我已经进行了几次本地提交,因此我不想对ORIG_HEAD进行硬重置。
约瑟夫·洪弗里

5

我最近做了类似的事情,并根据此答案使用了更简单的解决方案。

假设toolwork您要还原到的分支的状态已推送到origin,则只需执行以下操作

git fetch origin
git reset --hard origin/toolwork

就我而言,的值ORIG_HEAD已被另一个分支上的另一个合并所覆盖,并且这样做无需担心在日志中搜索正确的提交。


0

对我有用的只是

git reset --hard

我是通过不幸的合并/拉动从本地存储库中完成此操作的:

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2|MERGING)
$ git reset --hard
HEAD is now at 2d5a511 [last commit comment]

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2)
$

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.