Close

git pull

git pull 命令用于从远程存储库获取和下载内容,并立即更新本地存储库以匹配该内容。在基于 Git 的协作工作流程中,将远程上游变更合并到本地存储库中是一项常见任务。git pull 命令实际上是另外两个命令的组合,即执行 git fetch 之后再执行 git merge。在操作的第一阶段,git pull 将执行 git fetch,范围限定为 HEAD 所指向的本地分支。内容下载完成后,git pull 将进入合并工作流程。将创建一个新的合并提交,并更新 HEAD 以指向新提交。


git push 用法


工作原理

git pull 命令首先运行 git fetch,它会从指定的远程存储库下载内容。然后执行 git merge,将远程内容引用和头合并到一个新的本地合并提交中。为了更好地演示拉取和合并流程,让我们考虑以下示例。假设我们有一个包含主分支和远程来源的存储库。

在这种情况下,git pull 将从本地和主分支分歧的点下载所有变更。在这个例子中,这点是 E。git pull 会获取分歧的远程提交,它们是 A-B-C。然后,拉取流程将创建一个新的本地合并提交,其中包含新的分歧远程提交的内容。

控制台窗口
相关资料

高级 Git 日志

Bitbucket 徽标
查看解决方案

了解 Bitbucket Cloud 的 Git

在上图中,我们可以看到新提交 H。此提交是一个新的合并提交,包含远程 A-B-C 提交的内容以及一条合并的日志消息。这个例子是为数不多的 git pull 合并策略之一。可以将 --rebase 选项传递给 git pull,以使用变基合并策略而不是合并提交。下个示例将演示变基拉取是如何工作的。假设我们正处于第一张图的起点,并且我们已经执行了 git pull --rebase

中央 git 存储库到本地 git 存储库

在这张图中,我们现在可以看到 rebase pull 不会创建新的 H 提交。相反,rebase 复制了远程提交 A--B--C 并重写了本地提交 E--F--G,使其出现在本地原始/主提交历史记录中。

常用选项


git pull <remote>

获取当前分支的指定远程副本,并立即将其合并到本地副本中。这与后面是 git merge origin/<current-branch>git fetch <remote> 一样。

git pull --no-commit <remote>

与默认调用类似,获取远程内容但不创建新的合并提交。

git pull --rebase <remote>

与之前的拉取相同,不要使用 git merge 将远程分支与本地分支集成在一起,而是使用 git rebase

git pull --verbose

在拉取过程中提供详细输出,显示正在下载的内容和合并的详细信息。

Git 拉取讨论


您可以把 git pull 看作是 Git 的 svn update 版本。这是将本地存储库与上游变更同步的简便方法。下图解释了拉取流程的每个步骤。

git pull

您一开始以为您的存储库是同步的,但随后 git fetch 发现 origin 的 main 版本自您上次检查以来已经有了进步。然后 git merge 立即将远程主服务器集成到本地主服务器中。

Git 拉取和同步


git pull 是声称负责‘同步’远程内容的众多命令之一。git remote 命令用于指定同步命令将在哪些远程端点上运行。git push 命令用于将内容上川到远程存储库。

git fetch 命令可能与 git pull 混淆。它们都用于下载远程内容。可以在 git pullgit fetch 之间进行重要的安全区分。git fetch 可以被认为是"安全的"选择,而 git pull 被认为是不安全的。git fetch 将下载远程内容而不更改本地存储库的状态。或者,git pull 会下载远程内容并立即尝试变更本地状态以匹配该内容。这可能会无意中导致本地存储库进入冲突状态。

通过变基拉取


--rebase 选项可用于通过阻止不必要的合并提交来确保线性历史记录。许多开发人员更喜欢变基而不是合并,因为使用它就像是“我要把我的变更放在其他所有人的工作成果之上”。从这个角度讲,使用带有 --rebase 标记的 git pull 更像是 svn update,而不是简单的 git pull

实际上,使用 --rebase 拉取是一个非常常见的工作流程,因此有一个专门的配置选项:

git config --global branch.autosetuprebase always

运行该命令后,所有 git pull 命令都将通过 git rebase 而不是 git merge 进行集成。

Git 拉取示例


以下示例演示了如何在常见场景中使用 git pull

默认行为

git pull

执行 git pull 的默认调用等同于 git fetch origin HEADgit merge HEAD,其中 HEAD 是指向当前分支的引用。

远程存储库上的 Git 拉取

git checkout new_feature
git pull <remote repo>

此示例首先执行签出操作并切换到 分支。之后,在传递 的情况下执行 git pull。这将暗中从 中拉取出 newfeature 分支。下载完成后,它将启动 git merge

Git 拉取变基而不是合并

以下示例演示了如何使用变基与中央存储库的主分支同步:

git checkout main
git pull --rebase origin

这只会将您的本地变更置于其他人已经贡献的内容之上。


分享此文章

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

人们通过满是工具的墙进行协作

Bitbucket 博客

Devops 示意图

DevOps 学习路径

与 Atlassian 专家一起进行 Den 功能演示

Bitbucket Cloud 与 Atlassian Open DevOps 如何协同工作

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up