如何撤销与当前项目无关的项目的git pull操作?

3

我刚刚做了一件傻事。在我的fooclient项目中,我做了以下操作:

git remote add official https://github.com/fooserver
git pull official master

换句话说,我将一个完全不同的代码库(服务器而非客户端)拉入我的工作目录。毫不奇怪,几乎没有合并冲突(毕竟文件名完全不同)。同样不足为奇的是,Git完全没有警告我这些仓库没有共同的祖先。
在这种特殊情况下,我可以通过以下方式恢复:
cp file-i-worked-on.js ~
git reset --hard HEAD # to discard broken merge conflicts
git checkout a12345 # where a12345 is the latest head of fooclient that I had checked out
cp ~/file-i-worked-on.js .

但是更一般的策略会是什么呢?
4个回答

4

这将把您重置为主分支的上一个状态:

git reset --hard HEAD@{1}

这是可能的,因为有reflog。运行git reflog将显示reflog,并允许您验证您是否正在重置到正确的状态。

啊 - 这听起来像是正确的答案。因此,HEAD@{...} 可以让您跟踪指向 HEAD 的更改。因此,您的命令可以翻译为“在我们搞砸之前,您知道 HEAD 指向了什么?让我们回到那里......” - 听起来像是一个非常有用的工具。 - Steve Bennett
@SteveBennett 是的!它非常有用,因为它使得撤销一个意外命令比试图回溯你所做的更容易。不幸的是,这不是Git的一个很出名的功能。 - Andrew Marshall

0

在删除不需要的远程分支(git remote rm ...)后,只需使用git reset --hard命令将当前分支重置到想要的位置。

git reset --hard origin/master

如果你之前在 master 分支,这会将你的 master 重置为与你的远程 origin 的 master 分支相同。就这样!

只想提醒一下,这假设您没有任何未推送的本地提交。 - Andrew Marshall

0
git stash
git reset --hard HEAD^
git stash apply

Git stash 会不会也把那些半合并的文件藏起来? - Steve Bennett
@SteveBennett:是的,你说得对,我没有看到合并冲突仍然存在的部分。 - wintersolutions

0

从现在开始

git fetch

在gitk或git log或其他任何地方检查您得到的内容。现在将您得到的内容合并或变基到想要去的位置。


2
你是说你从来不用 git pull 吗? - Steve Bennett
正确。我曾经使用过,但现在不再使用了。 - Adam Dymitruk

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