撤消git pull从新git存储库上的远程分支到git pull之前的状态

时间:2013-07-16 16:52:46

标签: git

简而言之:

新git存储库上从远程分支中提取代码后,我可以将代码重置为某个状态git pull吗?

长篇故事:

我有两个包含脚本的文件夹,一个文件夹代表另一个文件夹中的另一个文件版本。要应用版本控制,我首先在github中创建一个git存储库,其文件夹与其他文件夹相比具有较少的版本,并创建两个具有相同内容的分支来表示这两个文件夹。

要将具有最新修订的文件夹同步到远程分支,请在该文件夹中执行以下操作:

git init
git remote add origin [GITHUB_REPO]
git pull origin [BRANCH_NAME]:[BRANCH_NAME]
git add .
git commit -m "Latest revision."

之前我已经多次测试了工作流程,似乎没有什么不对,直到我稍后才意识到git add .我运行git status并且没有显示任何修改,它只显示新的未跟踪文件,这很奇怪。

我需要在执行git pull之前撤消到一个状态,因为我意识到我的某些文件被远程覆盖了,但是因为pull是第一个动作,并且之前没有提交,我无法在pull之前重置为任何内容。

这是git reflog show

的结果
edbfd0d HEAD@{0}: commit: Import code from development environment.
da39602 HEAD@{1}: checkout: moving from master to development

我所做的是:

git reset HEAD@{1}

这并没有解决问题,它只撤消上一次提交,而git pull的覆盖文件仍然没有回来。如果有帮助,服务器上的git版本是1.7.1,而我的本地机器上的版本是1.8.2.1。难怪他们的行为不同。

-

经过进一步研究,我发现服务器中git pull的行为与本地开发机器不同。似乎在服务器git pull中自动合并,而在我的本地开发中告诉我有些文件可能会在合并时被覆盖。

这会导致服务器中的文件自动使用git pull上较少修订版本的现有文件与未跟踪文件,而在我的本地开发中,我可以添加修改后的文件并使用更新版本。

2 个答案:

答案 0 :(得分:4)

有两种可能的情况,具体取决于git pull的作用。如果git pull的合并阶段导致快进合并,则在git pull之后立即执行此操作:

git reset --hard HEAD@{1}

这会将HEAD和分支指针重置回运行git pull之前的位置。如果您从git pull开始做了其他事情,则可能需要运行git reflog HEAD并确定您真正要重置的条目。

如果git pull创建了新的合并提交,或者因为无法快进,或者因为请求执行非快进合并,则上述命令仍然有效。但是,在这种情况下,您还可以使用以下命令重置回当前提交的第一个父级:

git reset --hard HEAD^1

但是,如果您之间已经完成了其他工作,则可能需要检查您的reflog,并使用第一个命令而不是1 ...

答案 1 :(得分:1)

  

我在该文件夹中执行以下操作:

git init
git remote add origin [GITHUB_REPO]
git pull origin [BRANCH_NAME]:[BRANCH_NAME

实际上,这不是一个好主意。使用git的一个重要规则是你应该永远不要使用“脏”工作树执行复杂的操作(即使用未签入的文件)。

在这种情况下,您在包含文件的目录中创建了一个repo,但没有提交文件。因此git不知道这些文件,因此git status将它们显示为“未跟踪”。现在git pull将自动尝试合并,并且与脏树合并是有问题的。 git尝试不覆盖任何数据,但如果合并没有按照您的意愿结束,则没有简单的方法来撤消某些更改,因为旧版本的文件未提交。

因此,更好的方法是首先在目录中执行init / remote add / pull(或者只是克隆远程仓库):

git clone [GITHUBREPO]
git checkout BRANCH_NAME # note: This will create a local branch from the remote

它为您提供了远程分支的干净副本。然后复制具有最新版本的文件夹中的文件,以创建分支的预期新状态:

rm oldfiles; cp -a ../folder2/* . # or similar

然后你提交了所有这些:

git add .
git commit -m "Files from folder2"

此时你再次拥有一棵干净的工作树。现在,您可以与其他分支合并,或推送您的更改,或合并更多分支,而不必担心丢失数据。如果出现问题,您可以随时返回旧提交。

注意:

  

问题是我的文件被远程分支覆盖,而我   我拉之前无法撤消到一个状态,因为这是第一个动作

这通常不会发生。如果git pull导致与本地未提交文件冲突(如您的情况),则git pull应中止并出现错误。像这样:

error: Untracked working tree file 'myFile' would be overwritten by merge.

如果没有,那么git可能会被配置为忽略这些冲突(我相信这是可能的,但不是默认的)。无论如何,如果你从不与一个肮脏的工作树合并,那应该不是问题。