仅拉取一个提交的 Git pull

15

实际上,Git存储库和本地文件完全相同。

但是另一个网站距离最新的5个提交很远,所以我有一段时间没有拉取过,并且我也不想这样做。

所以现在我想对我的本地文件进行一些更改,然后将其推送到Git存储库的一个新提交中,然后只能拉取该单个提交而不是所有其他提交...我可以做到这一点吗?

我甚至不想删除那些提交,只是希望能够拉取1个提交,希望你能帮帮我。


2
这就是为什么你不应该在主分支上进行开发。 - brettwhiteman
1
你可以创建一个补丁,或将提交推送到一个新分支并从那里挑选。 - Tim
这是在谷歌搜索您的问题标题后的第一个结果:https://dev59.com/jU3Sa4cB1Zd3GeqPuE93。你看到了吗? - U r s u s
3个回答

17

git pull 实际上是 git fetch(将远程提交下载到追踪分支)和 git merge(将你的 HEAD,即当前提交与刚刚下载的提交合并)的缩写。

你可以通过解耦这两个步骤来获得期望的灵活性:

  • 首先运行 git fetch,然后检查你刚刚下载的历史记录(如果你在 master 分支上工作,则 git fetch 应该已经在 origin/master 分支中下载了远程提交,你可以使用 git log origin/master 来检查)。

  • 然后,使用 git merge <commit> 合并你想要的提交。注意: git merge 将获取所有在 <commit> 和其祖先中的更改,因此如果 <commit> 是最旧的未合并提交,则此方法适用。如果你没有任何未推送的提交,这将“快进”,即不会创建一个新的提交,而只是将 HEAD 推到该提交。如果你对 git merge 不满意,还有其他选项,如 git rebasegit cherry-pick 等。


12
假设您的远程名称为origin,分支名称为master,运行以下命令:git fetch && git merge $(git rev-list master..origin/master | tail -n1)。这将执行以下操作:
  1. 运行git fetch以更新 origin/master
  2. 获取从masterorigin/master之后的提交哈希列表(git rev-list),并获取最后一行(tail),即第一个新提交
  3. 将上一步的结果传递给git merge

6
如果您想要拉取一个提交,您可以简单地“重置”到该提交。
git reset --hard <commit>

你可以基于该提交新建一个名为 foo 的分支,并只拉取该分支至你的新环境。这样做有助于保持代码库的完整性,因为你可以继续在原始分支上工作而不必考虑影响到新站点。
git checkout -b foo

这是一种简写形式

git branch foo
git checkout foo

你可以将该分支拉到任何机器上,使用以下命令:
git clone -b *foo* http//dude@:bitbucket.org

或类似的东西

git clone -b *foo* ssh://git@bitbucket.org/path/to/repo.git

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