我知道有些人git pull --rebase
默认使用,有些人坚持不使用它.我相信我理解合并和变基之间的区别,但我试图把它放在上下文中git pull
.它只是不想看到很多合并提交消息,还是有其他问题?
sco*_*ode 707
我想提供一个关于"git pull --rebase"实际意味着什么的不同观点,因为它似乎有时会迷失.
如果您曾经使用过Subversion(或CVS),您可能会习惯"svn update"的行为.如果您有提交更改并且提交失败,因为已在上游进行了更改,则您将"svn update".Subversion通过将上游更改与您的上游进行合并来进行,可能会导致冲突.
Subversion刚刚做了什么,基本上是"拉动 - 基础".将本地更改重新制定为相对于较新版本的行为是其"重新定位"部分.如果你在失败的提交尝试之前完成了"svn diff",并且之后将得到的diff与"svn diff"的输出进行比较,那么两个差异之间的差异就是变基操作所做的.
在这种情况下,Git和Subversion之间的主要区别在于,在Subversion中,"您的"更改仅作为工作副本中的非提交更改存在,而在Git中,您在本地实际提交.换句话说,在Git中你已经分享了历史; 你的历史和上游历史有分歧,但你有一个共同的祖先.
在我看来,在正常情况下让你的本地分支只是反映上游分支并对其进行持续开发,正确的做法总是"--rebase",因为这是你在语义上实际做的事情.你和其他人正在破坏分支的预期线性历史.事实上,其他人在您尝试推动之前碰巧略微推动是无关紧要的,并且对于每次这样的事故导致合并的历史事件而言似乎适得其反.
如果你真的觉得无论出于什么原因需要某个分支,那么我认为这是一个不同的问题.但除非您有特定且积极的愿望以合并的形式表示您的更改,否则默认行为应该是"git pull --rebase".
请考虑需要观察和了解项目历史的其他人.您是否希望历史上散布着数以百计的合并,或者您是否只想要选择少数合并来代表有意的分歧开发工作的真正合并?
P S*_*ved 546
你应该用git pull --rebase
什么时候
确实 - 为什么不呢?它更清楚,并且不会对您的提交强加逻辑分组.
好吧,我想它需要一些澄清.在Git中,您可能知道,我们鼓励您进行分支和合并.您拉动更改的本地分支和远程分支实际上是不同的分支,并且git pull
是关于它们的合并.这是合理的,因为你不经常推动并且通常在它们构成完整特征之前累积一些变化.
然而,有时 - 无论出于什么原因 - 你认为如果这两个 - 远程和本地 - 是一个分支实际上会更好.就像在SVN中一样.它在这里git pull --rebase
发挥作用.您不再合并 - 您实际上在远程分支上提交.这就是它的实际意义.
无论是否危险,问题在于你是否将本地和远程分支视为一个不可分割的东西.有时它是合理的(当你的变化很小时,或者如果你处于强劲发展的开始阶段,当小的提交带来重要的变化时).有时它不是(当你通常创建另一个分支,但你懒得这样做).但这是一个不同的问题.
Cod*_*oll 184
也许最好的解释方法是举个例子:
git checkout master && git pull
.师父已经是最新的.git checkout master && git pull
.师父已经是最新的.git merge topic-branch-A
git merge topic-branch-B
git push origin master
在爱丽丝面前做git push origin master
,因为它不是快进合并而被拒绝.git pull --rebase origin master
git push origin master
,并且每个人都很高兴他们在将来查看日志时不必阅读无用的合并提交.请注意,要合并的特定分支与示例无关.在这个例子中,Master可以很容易地成为发布分支或dev分支.关键点在于Alice和Bob同时将其本地分支合并到共享远程分支.
kro*_*old 143
我认为你应该git pull --rebase
在与同一分支上的其他人合作时使用.你正在工作→提交→工作→提交周期,当你决定推动你的工作时,你的推动被拒绝,因为在同一个分支上有并行工作.在这一点上,我总是做一个pull --rebase
.我不使用squash(以展平提交),但我重新设置以避免额外的合并提交.
随着您的Git知识的增加,您发现自己在历史上看起来比我使用的任何其他版本控制系统更多.如果你有大量的小合并提交,很容易失去你历史上正在发生的大局的焦点.
这实际上是我唯一一次进行变基(*),而我的工作流程的其余部分都是基于合并的.但只要你最常见的提交者这样做,历史最终会看起来好多了.
(*)在教授Git课程的同时,我让一名学生逮捕了我,因为在某些情况下我也主张改变特色分支.并且他已经阅读了这个答案;)这种变基也是可能的,但它总是必须根据预先安排/商定的系统,因此不应该"始终"应用.那时我通常都不做pull --rebase
,这就是问题所在;)
Dus*_*tin 48
我不认为有任何理由不使用pull --rebase
- 我特意为Git添加了代码以允许我的git pull
命令总是反对上游提交.
查看历史记录时,知道何时处理该功能的人/ gal停止同步是非常有趣的.当他/她这样做时,它对于那个人/ gal可能是有用的,但这reflog
就是为了什么.这只会为其他人增加噪音.
小智 31
只记得:
因此,选择您想要处理分支的方式.
你最好知道merge和rebase之间的区别:)
我认为这归结为个人偏好.
你想在推动改变之前隐藏你的愚蠢错误吗?如果是这样,那就git pull --rebase
完美了.它允许您稍后将提交压缩到几个(或一个)提交.如果您在(未按下的)历史记录中进行了合并,那么稍后进行合并就不那么容易了git rebase
.
我个人不介意发布我所有的愚蠢错误,所以我倾向于合并而不是rebase.
git pull --rebase
可能隐藏合作者的历史改写git push --force
。我建议git pull --rebase
仅在您知道在其他人之前忘记推送您的提交之前使用。
如果您什么也没做,但是您的工作空间不干净,就git stash
在之前git pull
。这样,您将不会默默地重写您的历史记录(这可能会默默地删除您的某些工作)。
一个实践案例是您使用 Bitbucket PR 时。我们通过下面的案例来理解一下:
有公关开放。
然后,您决定通过 BitBucket GUI 使用最新的 Master 分支对 PR 远程分支进行变基。此操作将更改您的 PR 的提交 ID。
因为您已经使用 GUI 重新建立了远程分支的基础。首先,您必须将 PC 上的本地分支与远程分支同步。
在这种情况下git pull --rebase
就像魔术一样。
当git pull --rebase
您的本地分支和远程分支具有相同的历史记录和相同的提交 ID 后。
现在,如果您向 PR 分支添加新的提交/更改。
您可以很好地将新提交推送到远程分支/BitBucket PR,而无需使用强制或任何其他方式。