【问题标题】:Git - is it pull or rebase when working on branches with other peopleGit - 与其他人在分支上工作时是拉还是变基
【发布时间】:2008-09-18 20:33:27
【问题描述】:

因此,如果我使用的是远程(跟踪)分支,并且我想获得最新的分支,我仍然不清楚我应该使用 git pull 还是 git rebase。我以为我读过 git rebase 与其他用户一起在分支上工作时,当他们拉动或变基时,它可能会把他们搞砸。真的吗?我们都应该使用git pull吗?

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    Git pull 是 2 个命令的组合

    • git fetch(将您的本地存储库与远程的最新内容同步)
    • git merge(将远程分支中的更改(如果有)合并到本地跟踪分支中)

    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。

    嗯,用语言来解释有点困难......希望这有点道理:-)

    反正我自己的工作流程是这样的:

    • 'git pull' 来自远程的新更改
    • 切换到我的分支
    • 'git rebase master' 在我的提交历史中带来 master 的新变化
    • 切换回master
    • 'git merge mybranch',仅当 master 中的所有内容也在 mybranch 中时才会快进(从而避免公共分支上的提交重新排序问题)
    • 'git 推送'

    最后一句话。我强烈建议在差异很小的情况下使用 rebase(例如,人们在处理不同的文件或至少在不同的行上工作)。它有我试图在上面解释的问题,但它使历史更加清晰。

    一旦可能存在重大冲突(例如,同事重命名了一堆文件中的某些内容),我强烈建议合并。在这种情况下,系统会要求您解决冲突,然后提交解决方案。从好的方面来说,当存在冲突时,合并更容易解决。不利的一面是,如果很多人一直在合并,您的历史可能会变得难以追踪:-)

    祝你好运!

    【讨论】:

    • 在我看来你应该说:'git merge mybranch',只有当 master 中的所有内容也在 mybranch 中时才会快进(从而避免提交重新排序公共分支上的问题)
    • 'git rebase mybranch' 绝对应该读作 'git merge mybranch'。
    【解决方案2】:

    Git rebase 是对历史的重写。您永远不应该在“公共”分支(即您与他人共享的分支)上执行此操作。如果有人克隆了您的分支,然后您重新设置了该分支的基础——那么他们就不能再从您的分支中拉取/合并更改——他们将不得不丢弃旧的分支并重新拉取。

    packaging software with git 上的这篇文章非常值得一读。它更多的是关于管理软件发行版,但它非常技术性并且讨论了如何使用/管理/共享分支。他们谈论什么时候变基,什么时候拉动,以及每种方法的各种后果。

    简而言之,它们都有自己的位置,但您需要真正了解差异。

    【讨论】:

    • 这是真的吗,@Pat?在 pull --rebase 的情况下,您不只是将本地提交重新排序到您从中提取的内容之上吗?由于这些是本地提交,尚未发布,他们将如何破坏在我 pull --rebase'ed 之后试图拉动的人?
    • 问题是如果其他人从分支中拉出然后你重新设置基准。如果我从A 拉到local 然后变基local,而其他人从A 拉,那很好。如果我从A 拉,别人从local 拉,然后我rebase local 是不好的。
    • 简而言之,不要对其他存储库中的任何提交进行变基。
    【解决方案3】:

    git pull 如果您的提交不在远程分支中,则进行合并。 git rebase 重写任何现有的提交,您必须相对于远程分支的尖端。它们的相似之处在于它们都可能导致冲突,但我认为使用git rebase 如果可以允许更顺畅的协作。在 rebase 操作期间,您可以优化您的提交,使它们看起来像是新应用到远程分支的最新版本。合并可能更适合具有更多历史的分支上的较长开发周期。

    像 git 中的大多数其他东西一样,有很多重叠的功能来适应不同的工作方式。

    【讨论】:

      【解决方案4】:

      Branching and mergingrebasing 上查看优秀的 Gitcast。

      【讨论】:

        【解决方案5】:

        如果您想在不影响远程分支且不更改本地副本的情况下拉取源代码,最好使用 git pull。

        我相信如果你有一个工作分支你已经进行了更改,使用 git rebase 将该分支的基础更改为最新的远程主控,你将保留所有分支更改,但是分支现在将分支从主位置,而不是之前的分支位置。

        【讨论】:

          猜你喜欢
          • 2022-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 2016-10-14
          • 1970-01-01
          • 2019-10-27
          • 2019-01-11
          • 2016-09-20
          相关资源
          最近更新 更多