git-pull——重基
开始情况(无未推送的更改,git-pull——重基,git,git-rebase,Git,Git Rebase,开始情况(无未推送的更改,表示当前分支): 在git fetch之后,日志结构通常如下所示 o E [origin/master] | o C' | o B' | o D | | o C [>master] | | | o B |/ o A | ... 现在,git-rebase-origin/master经常产生冲突。如果master=origin/master,那么git-pull-rebase是否更智能,只需使用git-reset使master也指向E,如果master最初是ori
表示当前分支):
在git fetch
之后,日志结构通常如下所示
o E [origin/master]
|
o C'
|
o B'
|
o D
|
| o C [>master]
| |
| o B
|/
o A
|
...
现在,git-rebase-origin/master
经常产生冲突。如果master
=origin/master
,那么git-pull-rebase
是否更智能,只需使用git-reset
使master
也指向E
,如果master
最初是origin/master
,git-pull-rebase
与以下操作类似:
git fetch
git rebase
因此,在您的情况下,它将像这样离开存储库:
o C [> master]
|
o B
|
o E [origin/master]
|
o C'
|
o B'
|
o D
|
o A
|
...
请注意,您拥有的两个提交与在提交E上重新创建的原始提交不同。您可以使用rebase而不是merge进行拉取-这是我的团队的工作方式,它工作得非常好 从“”: 由于git中的分支合并是通过合并提交记录的,因此 被认为是有意义的,例如,指示特征 已合并到发布分支。然而,在日常生活中 多个团队成员经常同步单个分支的工作流 timeline被常规git上不必要的微合并所污染 拉。重定基可确保始终重新应用提交,以便 历史是线性的 您可以将某些分支配置为在不使用 --重设基准标志:
#使主控台上的“git pull”始终使用rebase
$git config branch.master.rebase true
您还可以设置一个全局选项来设置
每个新跟踪分支的最后一个属性:
#为每个跟踪分支设置重基
$git config--global branch.autosetuprebase始终
git-pull--rebase
与git-fetch不一样;git rebase
。不幸的是,git pull
手册页对差异的理解相当模糊:
--rebase
Rebase the current branch on top of the upstream branch
after fetching. If there is a remote-tracking branch
corresponding to the upstream branch and the upstream branch
was rebased since last fetched, the rebase uses that
information to avoid rebasing non-local changes.
事实证明,这种差异并不涉及原始海报猜测的git reset——事实上它涉及到reflog(看看你以前是否没有遇到过这个术语)
有关git pull--rebase中额外魔力的完整故事,请参见以下答案:
看起来您将B
与B'
和C
与C'
混合在一起了。不幸的是,在实践中,如果B
和C
已经是origin/master
的一部分(由于之前的樱桃采摘或重新基址),git pull--rebase
与git fetch不同;git rebase
-请参阅。最后一句话令人费解。
--rebase
Rebase the current branch on top of the upstream branch
after fetching. If there is a remote-tracking branch
corresponding to the upstream branch and the upstream branch
was rebased since last fetched, the rebase uses that
information to avoid rebasing non-local changes.