从git中提取特定的提交/文件

时间:2012-01-19 06:04:21

标签: git version-control

我已经在我的git存储库中进行了两次提交并将它们推送到我的git服务器

两次提交

  • 在第一个提交文件A中提交
  • 在第二个提交文件B中提交

现在在另一个开发服务器上我想从git服务器中只提取第一个提交或FILE A.怎么做?

2 个答案:

答案 0 :(得分:19)

首先,在您的开发服务器上,您需要从git服务器获取提交列表,如下所示:

git fetch origin master (or whatever branch you need)

然后有几个选项可以达到你想要的效果:

Cherry选择第一次提交 - 这只是从另一个分支/ repo中“提取”所选提交并将其应用到当前的本地分支。它可能非常有用,但应谨慎使用(见下文)。

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

在这种特殊情况下,你可以做到

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

或者,拉出所有内容,然后对您想要的提交进行硬重置(在本例中是HEAD之前的那个)。硬重置有效地将您的本地分支回溯到所选的提交,将所有文件的状态更改为当时的状态(因此在这种情况下,文件B将被删除,或者返回到之前的状态提交,取决于它以前是否存在)。

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

我更喜欢第二种选择,因为如果你不小心它,樱桃采摘会产生一些影响。我相信它会为提交创建一个新的哈希,所以挑选出来的提交和原始提交并不相同。我担心我现在没有时间阅读并准确确认存在哪些缺陷,但如果您决定使用它,我强烈建议您自行调查。

编辑 - 另一种解决方案(假设这是一个实时服务器,并且文件B在任何时候都不能出现在服务器上)是执行以下操作:

git fetch origin master
git checkout FETCH_HEAD^

这将从repo中获取所有提交,然后在获取内容的HEAD之前检查您的本地repo到提交。这里唯一的缺点是你将处于“超级头”状态,并且必须在本地创建一个新的分支,但这不是一个大问题。

答案 1 :(得分:0)

这没有多大意义 - 如果您提交文件,无论如何都要在回购邮件中提供这些文件。

也许这就是你想要的

git checkout -- FileAOnly

git checkout origin/master -- FileAonly