Git陷入错误的分支

时间:2010-10-22 16:26:27

标签: git branch undo pull

我和其他开发人员一直在合并并将我们的工作推向一个名为“工具”的非主分支。这样,我们没有影响团队的其他成员。我的主题分支叫做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

此时,在分支工具中出现了一堆新东西,我不知道如何摆脱删除我的工作区并重新克隆回购。

有什么方法可以把它退回到拉动之前的状态?

7 个答案:

答案 0 :(得分:89)

git reset --hard ORIG_HEAD 

来自git reset man page(如果你刚刚拉动):

撤消合并或拉

$ 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.   
  3. pull”尚未进行合并提交,因此“git reset --hard”是“git reset --hard HEAD”的同义词,可以清除索引文件和工作树中的混乱。
  4.   
  5. 将主题分支合并到当前分支中,从而产生快进。
  6.   
  7. 但您认为主题分支还没有为公众消费做好准备   “pull”或“merge”始终将当前分支的原始提示保留在ORIG_HEAD 中,因此重新设置它会使您的索引文件和工作树返回到该状态,并重置分支的尖端到那个提交。
  8.   

有关详情,请参阅HEAD and ORIG_HEAD

答案 1 :(得分:64)

重置主分支:

git reset --hard origin/master

答案 2 :(得分:9)

您可以使用git log查找您希望成为toolwork分支头部的修订版的SHA-1,然后使用git reset --hard <SHA1>将您的工作副本还原为修改

首先备份所有内容!并重新阅读git reset的手册页,以确保它正在执行您想要的操作。

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

答案 3 :(得分:4)

我最近做了类似的事情,并使用了基于this answer的更简单的解决方案。

假设您想要恢复为toolwork分支的状态已经推送到origin,您只需执行

git fetch origin
git reset --hard origin/toolwork

在我的情况下,ORIG_HEAD的值已被另一个分支上的另一个合并覆盖,并且这样做我不必担心在日志中搜索正确的提交。

答案 4 :(得分: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)
$

答案 5 :(得分:0)

您可以使用以下命令中止合并

git merge --abort

它将完全消除意外拉动...

答案 6 :(得分:0)

第 1 步:

git log

git reset --hard <hash>, 
  

散列类似于 0928817nsbn78867hs3g5666

例如:如果你git log,你会得到:

commit 0928817nsbn78867hs3g5666 (HEAD -> yourrepo, origin/yourrepo)

第 2 步:

git reset --hard 0928817nsbn78867hs3g5666