我知道有些人默认使用git pull -rebase,而另一些人坚持从不使用它。我相信我理解合并和重基之间的区别,但我试图把它放在git pull的上下文中。只是不想看到大量的合并提交消息,还是还有其他问题?


当前回答

你应该使用git pull -rebase when

您的更改不值得一个单独的分支

的确——那为什么不呢?它更清晰,并且没有对提交进行逻辑分组。


好吧,我想需要澄清一下。在Git中,您可能知道,鼓励您进行分支和合并。你的本地分支和远程分支,实际上是不同的分支,git pull是关于合并它们。这是合理的,因为你不经常推送,而且通常在它们构成一个完整的功能之前会积累一些更改。

然而,有时——不管出于什么原因——您认为如果这两个分支(远程和本地)是一个分支实际上会更好。就像在SVN中。这就是git pull -rebase发挥作用的地方。你不再合并——你实际上是在远程分支上提交。这才是它真正的意义所在。

是否危险的问题是你是否把本地分支和远程分支视为一个不可分割的东西。有时这是合理的(当您的更改很小时,或者如果您处于健壮开发的开始阶段,当通过小型提交带来重要的更改时)。有时不是(当您通常创建另一个分支,但您太懒了)。但这是另一个问题。

其他回答

我不认为有任何理由不使用pull——rebase——我专门为Git添加了代码,以允许我的Git pull命令始终针对上游提交进行rebase。

当我们回顾历史的时候,我们总是不愿意知道那些致力于某一功能的人何时停止了工作。当他/她在做这件事的时候,它可能对男人/女孩有用,但这就是reflog的目的。这只是给其他人增加了噪音。

我认为这可以归结为个人喜好。

您想要在推动更改之前隐藏您的愚蠢错误吗?如果是这样,git拉-rebase是完美的。它允许您稍后将提交压缩为几个(或一个)提交。如果你在你的(未推送的)历史中有合并,那么以后做git rebase就不那么容易了。

我个人并不介意公布我所有的愚蠢错误,所以我倾向于合并而不是重新建立数据库。

只需记住:

Pull = fetch + merge Pull—rebase = fetch + rebase

因此,选择您想要处理分支的方式。

你最好知道merge和rebase的区别:)

一个实践案例是当你与Bitbucket PR合作时。 让我们用下面的例子来理解它:

这里有公共关系部门。

然后你决定通过BitBucket GUI用最新的Master分支重新构建PR远程分支。这个操作将改变你的PR的提交id。

因为您已经使用GUI重新创建了远程分支。首先,你必须同步你电脑上的本地分支和远程分支。

在这种情况下,git pull -rebase就像魔法一样有效。

在git pull -rebase之后,你的本地分支和远程分支具有相同的历史和相同的提交id。

那么现在,如果您向PR分支添加一个新的提交/更改。

你可以很好地推送一个新的提交,而不需要使用强制或任何东西到远程分支/BitBucket PR。

这个场景描述了这样一种情况:由于原始代码被更改,您无法推送提交。科迪的解释很容易理解。我画了一个图表来描述这个场景,希望对大家有所帮助。如果我错了,请指正。