【发布时间】:2008-09-18 20:33:27
【问题描述】:
因此,如果我使用的是远程(跟踪)分支,并且我想获得最新的分支,我仍然不清楚我应该使用 git pull 还是 git rebase。我以为我读过 git rebase 与其他用户一起在分支上工作时,当他们拉动或变基时,它可能会把他们搞砸。真的吗?我们都应该使用git pull吗?
【问题讨论】:
标签: git version-control
因此,如果我使用的是远程(跟踪)分支,并且我想获得最新的分支,我仍然不清楚我应该使用 git pull 还是 git rebase。我以为我读过 git rebase 与其他用户一起在分支上工作时,当他们拉动或变基时,它可能会把他们搞砸。真的吗?我们都应该使用git pull吗?
【问题讨论】:
标签: git version-control
Git pull 是 2 个命令的组合
git rebase 只是粗略地等同于 git merge。它不会远程获取任何东西。事实上,它也没有进行适当的合并,它会在第二个分支的新提交之后重播您所在分支的提交。
它的目的主要是让你有一个更清晰的历史。在 gitk 过去的历史变得非常像意大利面条之前,不需要很多人进行多次合并。
最好的图形解释可以在前2个图形here中看到。但让我在这里用一个例子来解释一下。
我有 2 个分支:master 和 mybranch。站在 mybranch 上就可以跑了
git rebase master
在我最近提交到 mybranch 之前,我会在 master 中插入任何新内容。这是完美的,因为如果我现在在 master 中合并或 rebase mybranch 中的内容,我的新提交将在最近的提交之后线性添加。
如果我在“错误”的方向上变基,你提到的问题就会发生。如果我刚刚获得了最新的 master(有新的更改)并且从 master 我像这样重新设置基准(在同步我的分支之前):
git rebase mybranch
现在我刚刚做的是我在主人过去的某个地方插入了我的新更改。提交的主线已更改。由于 git 使用提交 id 的方式,刚刚通过我的新更改重放的所有提交(来自 master)都有新的 id。
嗯,用语言来解释有点困难......希望这有点道理:-)
反正我自己的工作流程是这样的:
最后一句话。我强烈建议在差异很小的情况下使用 rebase(例如,人们在处理不同的文件或至少在不同的行上工作)。它有我试图在上面解释的问题,但它使历史更加清晰。
一旦可能存在重大冲突(例如,同事重命名了一堆文件中的某些内容),我强烈建议合并。在这种情况下,系统会要求您解决冲突,然后提交解决方案。从好的方面来说,当存在冲突时,合并更容易解决。不利的一面是,如果很多人一直在合并,您的历史可能会变得难以追踪:-)
祝你好运!
【讨论】:
Git rebase 是对历史的重写。您永远不应该在“公共”分支(即您与他人共享的分支)上执行此操作。如果有人克隆了您的分支,然后您重新设置了该分支的基础——那么他们就不能再从您的分支中拉取/合并更改——他们将不得不丢弃旧的分支并重新拉取。
packaging software with git 上的这篇文章非常值得一读。它更多的是关于管理软件发行版,但它非常技术性并且讨论了如何使用/管理/共享分支。他们谈论什么时候变基,什么时候拉动,以及每种方法的各种后果。
简而言之,它们都有自己的位置,但您需要真正了解差异。
【讨论】:
pull --rebase'ed 之后试图拉动的人?
A 拉到local 然后变基local,而其他人从A 拉,那很好。如果我从A 拉,别人从local 拉,然后我rebase local 是不好的。
git pull 如果您的提交不在远程分支中,则进行合并。 git rebase 重写任何现有的提交,您必须相对于远程分支的尖端。它们的相似之处在于它们都可能导致冲突,但我认为使用git rebase 如果可以允许更顺畅的协作。在 rebase 操作期间,您可以优化您的提交,使它们看起来像是新应用到远程分支的最新版本。合并可能更适合具有更多历史的分支上的较长开发周期。
像 git 中的大多数其他东西一样,有很多重叠的功能来适应不同的工作方式。
【讨论】:
在 Branching and merging 和 rebasing 上查看优秀的 Gitcast。
【讨论】:
如果您想在不影响远程分支且不更改本地副本的情况下拉取源代码,最好使用 git pull。
我相信如果你有一个工作分支你已经进行了更改,使用 git rebase 将该分支的基础更改为最新的远程主控,你将保留所有分支更改,但是分支现在将分支从主位置,而不是之前的分支位置。
【讨论】: