2

简而言之:

在从新的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未跟踪文件的现有文件上的修订较少的版本,而在我的本地开发中,我可以添加修改后的文件并使用更新的版本。

4

2 回答 2

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 以外的数字...

于 2013-07-16T19:35:53.123 回答
1

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

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

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

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

所以更好的方法是首先在一个目录中进行初始化/远程添加/拉取(或者只是克隆远程仓库):

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 被配置为忽略这些冲突(我相信这是可能的,尽管不是默认设置)。无论如何,如果您从不与脏工作树合并,那应该不是问题。

于 2013-07-17T11:10:37.220 回答