我已经在我的git仓库中提交了两次更新,并将它们推送到了git服务器上。
这两次提交分别包含:
- 第一次提交是提交了文件A
- 第二次提交是提交了文件B
现在,在另一台开发服务器上,我想要只拉取第一个提交或者文件A,请问应该如何操作?
我已经在我的git仓库中提交了两次更新,并将它们推送到了git服务器上。
这两次提交分别包含:
现在,在另一台开发服务器上,我想要只拉取第一个提交或者文件A,请问应该如何操作?
首先,在您的开发服务器上,您需要像这样从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之前的提交记录。唯一的缺点是您会处于“分离头”状态,并且需要在本地创建一个新分支,但这不是大问题。
这个并没有太多意义 - 如果你已经提交了文件,那么它们已经在你的仓库里了。
也许这是你想要的
git checkout -- FileAOnly
或者
git checkout origin/master -- FileAonly