问题场景
修改本地代码使用 git 先提交后拉取的时候远程分支不允许的问题
- 修改本地代码时,远程分支存在其他新提交
- 先执行了
git commit -m 'xxx update'
- 然后再执行
git pull
拉取远程分支代码,出现如下提示
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
问题解释
出现这种问题表明您的存储库中存在分歧的分支,这意味着不同的分支对同一份代码进行了不同的更改,Git 在尝试拉取更改时不知道如何协调它们。
为了协调这些分歧的分支,您需要在继续拉取操作之前选择提示消息中提供的选项之一。以下是各个选项及其含义:
-
合并(Merge):此选项将不同分支的更改合并到当前分支的新提交中。您可以通过运行以下命令启用此选项:
arduinoCopy code git config pull.rebase false
-
变基(Rebase):此选项将一个分支的更改应用到另一个分支之上。它实际上是将分歧的提交移到当前分支的顶端。您可以通过运行以下命令启用此选项:
arduinoCopy code git config pull.rebase true
-
仅快进(Fast-forward only):此选项允许 Git 仅在可能的情况下执行快进合并。如果由于分歧的分支而无法执行快进合并,则 Git 将不会自动合并更改,并需要手动干预。您可以通过运行以下命令启用此选项:
arduinoCopy code git config pull.ff only
选择最适合您工作流程和项目要求的选项。一旦您做出选择,就可以像往常一样继续进行拉取操作。
请记住,您可以使用 --global
标志以及 git config
来为所有存储库设置默认偏好,或者您可以通过在命令行中传递 --rebase
、--no-rebase
或 --ff-only
来覆盖已配置的默认设置。
rebase false true区别
git config pull.rebase false
和 git config pull.rebase true
是用来配置 Git 在执行 git pull
命令时如何处理分支合并的方式,具体区别如下:
- git config pull.rebase false:
- 当您设置此选项时,Git 会使用合并(merge)策略来整合远程分支的变更到您的本地分支。
- 这意味着,执行
git pull
后,Git 会尝试将远程分支的更改合并到您当前的分支上,并且可能会生成一个新的合并提交,以整合两个分支的更改。
- git config pull.rebase true:
- 当您设置此选项时,Git 会使用变基(rebase)策略来整合远程分支的变更到您的本地分支。
- 这意味着,执行
git pull
后,Git 会尝试将您当前分支的提交应用到远程分支的最新提交之后,从而使您的提交历史线条更为线性。 - 使用变基策略通常会产生一个更为整洁的提交历史,因为它不会生成额外的合并提交。
综上所述,git config pull.rebase false
将使用合并策略,而 git config pull.rebase true
将使用变基策略。您可以根据您的项目需求和个人偏好来选择合适的方式。
pull.ff only 作用和场景
git config pull.ff only
是用来配置 Git 在执行 git pull
命令时限制合并方式的选项。它的作用和适用场景如下:
作用:
- 限制了
git pull
命令只能执行快进合并(fast-forward merge)。 - 如果远程分支的最新提交是当前分支的祖先,那么执行
git pull
时会自动进行快进合并,从而保持提交历史的线性。
适用场景:
- 当您确定在执行
git pull
时不希望生成额外的合并提交时,可以使用此选项。 - 在确保在远程分支的变更不会导致冲突的情况下,可以启用此选项来保持提交历史的整洁和线性。
总的来说,git config pull.ff only
适用于那些希望保持提交历史线性,并且愿意放弃使用合并策略的场景,通常在团队中遵循一致的提交历史规范时会使用此选项。
查看 git config pull 配置
要查看 Git 配置中 pull
相关的设置,您可以使用以下命令:
git config --get pull.rebase
git config --global --get pull.rebase
这将显示 pull.rebase
的当前配置。如果该配置未设置,则不会有输出。
如果您想要查看所有与 pull
相关的配置,可以使用以下命令:
git config --get-regexp pull
这将列出所有以 pull
开头的配置项及其对应的值。
git config pull 设置成合并策略
要将 Git 的 pull 设置成合并策略,您可以执行以下命令:
# 单个配置
git config pull.rebase false# 全局配置
git config --global pull.rebase false
这将配置 Git 使用合并策略而非变基策略。这意味着在执行 git pull
命令时,Git 将会采用合并方式将远程分支的变更合并到本地分支。