83

Myself and one other developer had been merging and pushing our work to a non-master branch called toolwork. That way, we didn't impact the rest of the team. My topic branch was called DPM-93 and my git workflow was this.

# 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

That was mostly working fine until I accidently issued these git commands

git checkout toolwork
git pull origin master

At that point, a bunch of new stuff showed up in branch toolwork and I'm not sure how to get rid of it short of deleting my workspace and re-cloning from the repo.

Is there any way to back this out to the state before the pull?

4

7 回答 7

117
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. 但是您决定主题分支尚未准备好供公众使用。
    “拉”或“合并”总是将当前分支的原始尖端留在 中ORIG_HEAD,因此很难重置它会使您的索引文件和工作树恢复到该状态,并将分支的尖端重置为该提交。

查看HEADORIG_HEAD了解更多信息。

于 2010-10-22T16:31:55.857 回答
90

重置主分支:

git reset --hard origin/master
于 2011-09-22T22:53:08.770 回答
11

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

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

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

于 2010-10-22T16:29:57.560 回答
7

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

假设toolwork您要恢复到的分支的状态已被推送到origin,您可以简单地执行

git fetch origin
git reset --hard origin/toolwork

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

于 2015-11-23T02:49:40.273 回答
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)
$
于 2018-05-16T14:04:07.810 回答
1

步骤1:

git log

git reset --hard <hash>, 
  

哈希类似于0928817nsbn78867hs3g5666

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

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

第2步:

git reset --hard 0928817nsbn78867hs3g5666

于 2021-04-15T13:53:04.753 回答
0

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

git merge --abort

它只会撤消意外拉动...

于 2020-03-25T12:25:17.103 回答