你拉错树枝了

我和另一个开发人员一直在合并我们的工作,并将其推送到一个称为 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

那时,在分支工具工作中出现了一大堆新东西,我不知道如何除掉它,除非删除我的工作空间并从回购中重新克隆。

有什么办法能在撤离前把这个交给州政府吗?

46437 次浏览

You can use git log to find the SHA-1 of the revision you want to be at the head of your toolwork branch, then use git reset --hard <SHA1> to revert your working copy to that revision.

Back everything up first! And re-read the man page for git reset to make sure it's doing what you want.

EDIT: Oh yes, ORIG_HEAD should contain the right SHA-1. But check first.

git reset --hard ORIG_HEAD

From the git reset man page (if you just did the pull):

Undo a merge or 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. Try to update from the upstream resulted in a lot of conflicts; you were not ready to spend a lot of time merging right now, so you decide to do that later.
  2. "pull" has not made merge commit, so "git reset --hard" which is a synonym for "git reset --hard HEAD" clears the mess from the index file and the working tree.
  3. Merge a topic branch into the current branch, which resulted in a fast-forward.
  4. But you decided that the topic branch is not ready for public consumption yet.
    "pull" or "merge" always leaves the original tip of the current branch in ORIG_HEAD, so resetting hard to it brings your index file and the working tree back to that state, and resets the tip of the branch to that commit.

See ABC0 and ORIG_HEAD for more.

Reset the master branch:

git reset --hard origin/master

I did a similar thing recently, and used a simpler solution based on this answer.

Assuming that the state of the toolwork branch that you want to revert to has been pushed to origin, you can simply do

git fetch origin
git reset --hard origin/toolwork

In my case, the value of ORIG_HEAD had been overwritten by another merge on a different branch, and doing this I didn't have to worry about searching for the correct commit in the log.

What worked for me is simply

git reset --hard

I did this from the local repository with the unfortunate merge/pull:

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

You can abort that merge using below command

git merge --abort

It will simply undo the accidental pull...

Step 1:

git log


git reset --hard <hash>,
  

The hash is something like 0928817nsbn78867hs3g5666

Example: if you git log, you will get:

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

Step 2:

git reset --hard 0928817nsbn78867hs3g5666