Git pull 从远程仓库获取和下载内容

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


git pull 是如何工作的

git pull 命令首先运行 git fetch 从指定的远程仓库下载内容。 然后执行 git merge 以合并远程内容引用并进入新的本地合并提交。 为了更好地演示拉取和合并过程,让我们考虑以下示例。 假设我们有一个带有主分支和远程源的仓库。

git pull 主分支和远程源的仓库
git pull 主分支和远程源的仓库

在这种情况下, git pull 将从本地和远程 main 分支产生分歧的点下载所有更改。 在这个例子中,那个点是 E。 git pull 将获取不同的远程提交,即 A-B-C。 然后,拉取过程将创建一个新的本地合并提交,其中包含新的分歧远程提交的内容。

git pull 拉取合并远程分支
git pull 拉取合并远程分支

在上图中,我们可以看到新的提交 H。这个提交是一个新的合并提交,包含远程 A-B-C 提交的内容,并有一个组合日志消息。 这个例子是几个 git pull 合并策略之一。 可以将 --rebase 选项传递给 git pull 以使用 rebase 合并策略而不是合并提交。 下一个示例将介绍 rebase 拉取的工作原理。 假设我们处于第一个图表的起点,并且我们已经执行了 git pull --rebase

git pull rebase拉取原理
git pull rebase拉取原理

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


git pull 常见选项

git pull <remote>

获取当前分支的指定远程分支并立即将其合并到本地分支中。 这与 git fetch <remote> 后再执行 git merge origin/<current-branch> 相同。

git pull --no-commit <remote>

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

git pull --rebase <remote>

与上一个 pull 相同,单不是使用 git merge 将远程分支与本地分支合并,而是使用 git rebase。

git pull --verbose

显示在拉取期间的下载的内容和合并的详细信息。


git pull 讨论

git pull 是许多声称负责“同步”远程内容的命令之一。 git remote 命令用于指定同步命令将在哪些远程端点上运行。 git push 命令用于将内容上传到远程仓库。

我们可以将 git pull 视为 Git 版本的 svn update。 这是一种将本地仓库与上游更改同步的简单方法。 下图解释了拉取过程的每个步骤。

git pull 拉取过程
git pull 拉取过程

现在开始认为你的仓库已同步,但是 git fetch 显示自上次检查以来,main 的原始版本已经取得了进展。 然后 git merge 立即将远程 main 合并到本地。


通过 Rebase 拉取

--rebase 选项可用于通过防止不必要的合并提交来确保线性历史记录。 许多开发人员更喜欢 rebase 而不是 merge,因为这就像在说,“我想把我的更改放在其他人所做的之上。” 从这个意义上说,使用带有 --rebase 选项的 git pull 更像是 svn update,而不是普通的 git pull。

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

git config --global branch.autosetuprebase always

运行该命令后,所有git pull命令都将使用 git rebase 而不是 git merge。


git pull 示例

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

$ git checkout jiyik
$ git pull origin jiyik

git pull 获取远程jiyik分支内容

本例首先执行 checkout(签出)并切换到分支。接下来,执行git pull。这将隐式地从中拉下 jiyik 分支。下载完成后,它将启动git merge。

git pull 使用 rebase 而不是 merge

以下示例演示了如何使用 rebase 与中央仓库库的主分支同步:

git checkout master
git pull --rebase origin

git pull rebase 拉取过程

这只是将你的本地更改移动到其他人已经贡献的顶部。

查看笔记