Git拉入错误的分支

Posted

技术标签:

【中文标题】Git拉入错误的分支【英文标题】:Git pull into wrong branch 【发布时间】:2011-04-29 06:31:41 【问题描述】:

我自己和另一位开发人员一直在合并并将我们的工作推送到一个名为 toolwork 的非主分支。这样,我们就不会影响团队的其他成员。我的主题分支称为 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

那时,分支工具中出现了一堆新东西,除了删除我的工作区并从 repo 中重新克隆之外,我不知道如何摆脱它。

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

【问题讨论】:

【参考方案1】:
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)
    尝试从上游更新导致很多冲突;你现在还没有准备好花很多时间合并,所以你决定稍后再做。 “pull”没有进行合并提交,所以“git reset --hard”是“git reset --hard HEAD”的同义词,清除了索引文件和工作树中的混乱。 将主题分支合并到当前分支中,导致快进。 但是您决定主题分支尚未准备好供公众使用。“拉”或“合并”总是将当前分支的原始提示留在ORIG_HEAD,所以硬重置它会使您的索引文件和工作树恢复到该状态,并将分支的尖端重置为该提交。

请参阅HEAD and ORIG_HEAD 了解更多信息。

【讨论】:

可以使用git rebase -i ORIG_HEAD 删除不需要的提交,假设还没有人从 master 中拉出? @unutbu:我相信在这种情况下,这种变基的最终结果将类似于git reset 谢谢,@VonC。对不起这个愚蠢的问题。不知何故,我没有意识到git reset --hard 不仅改变了工作树和索引,而且还删除了 DAG 中的父指针。【参考方案2】:

重置主分支:

git reset --hard origin/master

【讨论】:

不确定这是否是因为“正确”答案是 2 岁,但在尝试其他建议但没有成功后,这对我有用。 这解决了我的问题,就是我拉错了分支 为我工作。谢谢【参考方案3】:

您可以使用git log 找到您希望位于toolwork 分支头部的修订版的SHA-1,然后使用git reset --hard <SHA1> 将您的工作副本恢复到该修订版。

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

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

【讨论】:

一开始没看到你回答。 git reset 是对的(尽管您正确地提到了这有点危险)。 +1 更喜欢这个答案,因为您更明确地知道要恢复到哪个提交。就我而言,这很有用,因为在我不小心拉错了分支之前,我有几个本地提交,所以我不想硬重置到 ORIG_HEAD。【参考方案4】:

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

假设你想要恢复到的toolwork分支的状态已经被推送origin,你可以简单地做

git fetch origin
git reset --hard origin/toolwork

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

【讨论】:

【参考方案5】:

对我有用的只是

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)
$

【讨论】:

【参考方案6】:

第 1 步:

git log

git reset --hard <hash>, 
  

哈希类似于0928817nsbn78867hs3g5666

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

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

第 2 步:

git reset --hard 0928817nsbn78867hs3g5666

【讨论】:

【参考方案7】:

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

git merge --abort

它会简单地撤消意外拉动...

【讨论】:

以上是关于Git拉入错误的分支的主要内容,如果未能解决你的问题,请参考以下文章

git切换分支导致代码丢失找回(git reflog找回错误的重置)

如何重命名本地git和GitHub中拼写错误的分支[重复]

使用 Git 在错误的分支上修改了代码怎么办?

错误记录Git 使用报错 ( git branch -a 仍能查询到已经删除的远程分支 )

错误记录Git 使用报错 ( git branch -a 仍能查询到已经删除的远程分支 )

如何使用git移动历史commit(当你提交到错误的 Git 分支时该怎么办)