从Git中获取特定的提交/文件

12

我已经在我的git仓库中提交了两次更新,并将它们推送到了git服务器上。

这两次提交分别包含:

  • 第一次提交是提交了文件A
  • 第二次提交是提交了文件B

现在,在另一台开发服务器上,我想要只拉取第一个提交或者文件A,请问应该如何操作?


1
创建一个新分支,该分支具有第一个提交但不包括第二个提交,并检出该分支。 - Thong Kuah
@ThongKuah 谢谢,但这不是一个好方法吗?还有其他方法吗? - Dau
2个回答

21

首先,在您的开发服务器上,您需要像这样从git服务器获取提交列表:

git fetch origin master (or whatever branch you need)

那么有几个选项可以实现你想要的:

挑选第一个提交 - 这只是从另一个分支/仓库中“摘取”所选择的提交,并将其应用于您当前的本地分支。它非常有用,但应谨慎使用(请参见下文)。

git cherry-pick  <hash-of-commit-you-want>

在这种特定情况下,你可以这样做:

git cherry-pick FETCH_HEAD^ (gets commit before the HEAD of what's been fetched)

或者,拉取所有内容然后强制重置到你想要的提交(在这种情况下是HEAD之前的提交)。强制重置实际上将你的本地分支倒回到所选提交时的状态,将所有文件的状态更改为当时的状态(因此在这种情况下,File B要么被删除,要么回到之前的状态,具体取决于它之前是否存在)。

git pull
git reset --hard HEAD^ (or git reset --hard <hash-of-commit-you-want>)

我更喜欢第二个选项,因为精选可能会产生一些连锁反应,如果您对其不小心处理的话。我相信它会为提交创建一个新的哈希,因此挑选的提交和原始提交并不相同。很抱歉我现在没有时间阅读并确认问题出在哪里,但如果您决定使用它,我强烈建议您自己进行调查。

编辑-另一个解决方案(考虑到这是一台实时服务器且File B在任何时候都不可出现在服务器上)是执行以下操作:

git fetch origin master
git checkout FETCH_HEAD^

这将从仓库中获取所有提交记录,然后检出您本地仓库到刚才获取的HEAD之前的提交记录。唯一的缺点是您会处于“分离头”状态,并且需要在本地创建一个新分支,但这不是大问题。


谢谢你的回答,我认为你的第一个选项对我来说是正确的,当我提出问题时,我也在考虑选择第二个选项,但没有选择,因为我认为那是错误的方法。顺便让我检查一下。 - Dau
我心中的疑惑是,如果我们“获取原始主分支”,那么它会立即对代码产生影响,而这是我要拉取的实时服务器。因此,文件B也会在服务器上出现一段时间吗? - Dau
但我如何“挑选”不在服务器上的提交,我必须将其拉到服务器上;因此,我将问题标题中的提取提高到特定提交。 - Dau
git fetch origin master && git cherry-pick FETCH_HEAD^ 就可以了 - 不过有关 cherry-pick 创建新提交的警告仍然适用。 - Will Pragnell
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/6888/discussion-between-will-pragnell-and-dau - Will Pragnell
显示剩余3条评论

1

这个并没有太多意义 - 如果你已经提交了文件,那么它们已经在你的仓库里了。

也许这是你想要的

git checkout -- FileAOnly

或者

git checkout origin/master -- FileAonly

1
checkout 命令用于从本地系统中检索旧提交中的文件。但我的问题是如何从 Git 服务器上拉取特定的提交/文件。 - Dau
编辑后的答案 (+2个字符) - Adrian Cornish
可以在checkout命令中使用origin/master吗? - Dau
1
@Dau:Git 没有“旧提交”的概念。它只有代表该点所有文件的提交。人们通常将分支的末端称为“新的”或“当前的”,而将其他所有提交称为“旧的”,但这只是人类的意义。 - Arafangion
@Arafangion 我知道这个,但是我问题的解决方案是拉取特定的提交吗? - Dau

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