git pull命令: --强制,--rebase选项,获取差异,解决冲突
这篇文章涵盖了关于git pull
命令的最常见的问题。
我们将介绍基本概念和用法,--force
选项,--rebase
选项,以及如何解决冲突。
1. 了解git pull
git pull
命令将远程版本库的修改应用到本地版本库。
这分两步完成。git pull
命令在内部使用git fetch
命令,从远程版本库中获取修改并缓存、
git merge command 将这些修改合并到本地仓库。
如果远程仓库的提交刚好在前面,使用快进策略就可以轻松完成拉取。 然而,正如git merge post所指出的,在合并阶段可能会出现冲突,这时会给开发者解决冲突的机会。 可选的是,你可以使用rebase策略来代替合并。
这很容易使用。当你从一个远程仓库的特定分支拉取修改时,你指定远程名称和分支名称。
$ git pull origin main
如果你不按下面的方式写远程仓库名称和分支名称,可能会产生意想不到的后果,这取决于你当前的工作分支和你的设置。 只要有可能,就把远程仓库名称和分支名称放在一起使用,如上面的命令所示。
$ git pull
现在让我们看看在每种情况下运行`git pull'的结果。
1.1 快进策略
在git pull
中,快进策略意味着远程分支比本地分支的最后一次提交提前了几个提交。
例如,如果本地分支有 commit A <- commit B
,而远程分支有 commit A <- commit B <- commit C
,那么git pull
只会从远程分支提取 commit C
并追加到本地分支。
到本地分支。
在这种情况下,不需要合并,所以合并过程不会被打断,也不需要单独创建一个合并提交。让我们来看看这个操作。
从输出结果可以看出,我们使用了fast-forward策略,git pull
过程自动完成。
1.2. 当你需要解决合并冲突时
如果远程分支和本地分支之间有冲突的行,git pull
会暂停,特别是合并过程。例如,如果远程分支和本地分支做出了不同修改的新提交。
在这种情况下,只有git fetch会被执行,我们需要完成合并阶段。我们已经在git merge一文中学习了如何解决合并冲突,所以让我们马上看看执行的结果。
你可以从日志中看到,在拉动过程中出现了一个合并冲突,我们解决了这个问题,然后提交了。
2. 与git fetch的区别
正如上面简单提到的,git pull
命令包括git fetch
命令。
git fetch
命令获取并保存当前分支所追踪的远程分支的所有信息。
远程分支的名称格式通常为origin/main
,可以用git branch -r
命令查看,正如我们在git branch post中看到的。
使用下面的命令
$ git fetch [remote-name]
执行的结果是
看一下输出结果,你可以看到上面git pull
输出中显示的一些信息是来自fetch
命令。
由于我们输入了fetch
命令,我们也可以像这样获得远程分支的历史记录
3. --force选项
可与git pull
命令一起使用的--force
选项,实际上是git fetch
命令的一个选项。
它用于远程分支和本地分支的历史不匹配的情况,例如由于提交删除。
在这种情况下,git fetch
将被拒绝,但--force
选项将强制当前远程分支的提交历史被本地跟踪分支覆盖。
然而,这个选项并不适用于合并阶段,所以即使你强制获取,如果它与当前分支冲突,你也需要手动解决合并的冲突。
使用以下命令
$ git fetch --force [remote-name]
或
$ git pull --force [remote-name] [branch-name]
4. --rebase选项
git pull
命令默认以合并策略工作。
--rebase
选项告诉git fetch
执行一个git rebase命令而不是合并。
合并和rebase的区别总结在这里。
使用 rebase 的拉动将远程分支的提交附加到远程和本地分支的共同祖先,并将本地分支的提交附加到该最后的提交。 这个过程会改变提交历史,所以应该谨慎使用。
要使用它,请发出以下命令
$ git pull --rebase <remote-name> <branch-name>
5. git pull 其他选项
5.1. --不提交选项
$ git pull --no-commit
当你想再次检查git pull
的结果或增加一些操作时,可以使用该选项。
该选项将在提交前停止git pull
进程。这时你可以添加任何你想要的新操作,然后手动提交,完成拉取命令。
5.2. --ff-only选项
$ git pull --ff-only
这个选项强制拉取只在快进的情况下完成,否则拉取会被丢弃。有了这个选项,你可以保证你的本地分支不会被修改,哪怕是意外的,而只有远程分支会被完全复制。
5.3. -深度选项
git pull --深度 [depth-number]
这个选项在许多其他命令中也可以找到,它允许你只拉出你想要的提交数量。如果你不需要某个远程分支的全部提交历史,这可以节省开销、磁盘空间等。
5.4. --Prune选项
$ git pull --prune
该选项用于清理追踪当前不存在于远程仓库中的本地分支。如果你确信远程仓库是真理的来源,你可以使用这个选项来保持本地的Git环境的清洁。
5.5. --autostash选项
$ git pull --autostash
这个选项会自动将你目前正在做的改动藏起来,或者说暂时保存起来,然后继续拉取。在拉取完成后,被存储的修改会自动回来。如果你需要在提交之前拉取,这将是非常有用的。
6. 最后的想法
git pull
命令是同步远程和本地存储库的最重要的命令之一。
在使用git pull
命令时,最简单的方法之一是始终把拉取看作是一个取数,而把合并或重定位看作是两个独立的步骤。
关于git merge
命令的更详细的解释,见此帖。
