Git拉取到错误的分支

88

我和另外一位开发者一直在将我们的工作合并并推送到一个名为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

在那时,分支“toolwork”中出现了许多新内容,除了删除我的工作空间并从存储库重新克隆之外,我不确定如何摆脱它们。

有没有办法回退到拉取之前的状态?

7个回答

126
git reset --hard ORIG_HEAD 

来自git reset手册(如果您刚刚进行了pull):

撤消合并或拉取操作。

$ 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 不仅会改变工作树和索引,还会移除有向无环图中父节点指针。 - unutbu

100

重置主分支(master branch):

git reset --hard origin/master

11
不确定是否因为“正确”答案已有两年历史,但在尝试了其他建议都没用的情况下,以下方法适用于我。 - Levi Rosol
5
这解决了我的问题,即我错误地提交到了错误的分支。 - HorseloverFat
2
对我有用。谢谢。 - Glen

11

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

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

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


一开始没看到你的回答。git reset 是正确的(尽管你提到它有点危险)。+1 - VonC
更喜欢这个答案,因为您更明确地指出要还原到哪个提交。在我的情况下,这非常有用,因为我在意外拉取错误分支之前进行了一些本地提交,所以我不想对ORIG_HEAD执行硬重置。 - Joseph Humfrey

7

我最近也做了类似的事情,采用了一个基于这个答案更简单的解决方案。

假设你想回滚到的toolwork分支的状态已经被推送到了origin,那么你只需要执行以下操作:

git fetch origin
git reset --hard origin/toolwork

在我的情况下,ORIG_HEAD 的值已经被另一个不同分支上的合并覆盖了,操作时我不必担心在日志中搜索正确的提交。


2

对我有效的方法很简单:

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

2

步骤一:

git log

git reset --hard <hash>, 
  

哈希值类似于 0928817nsbn78867hs3g5666

例如:如果你执行 git log 命令,你会得到:

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

第二步:
使用命令git reset --hard 0928817nsbn78867hs3g5666

0

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

git merge --abort

它将简单地撤消意外的拉动...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接