Git pull rebase - 什么是变基础

时间:2014-11-05 23:08:08

标签: git

我仍然不知道git pull --rebase究竟发生了什么。我理解变基的概念,我在我自己的本地未发布的分支中使用它,从来没有在我的分支已经在远程发布。我听说过使用遥控器进行转换的危险,并且看着git pull --rebase,我不太清楚它是如何安全的,或者这样做是不安全的。

比如说我正在MyBranch分支上工作,并且已经将它推送到远程,以便它存储在除我自己的本地机器之外的其他地方(并且可能其他人将合并我的更改以保持开发同步)。 / p>

a--b--c--d--g--h (master, origin/master)
      \
       e--f--i (MyBranch, origin/MyBranch)

说我做一些本地开发

a--b--c--d--g--h (master, origin/master)
      \
       e--f--i (origin/MyBranch)--j--k--l (MyBranch)

说别人用已经进入主人的开发更新MyBranch。

 a--b--c--d--g--h (master, origin/master)
       \         \
        e--f--i---m( origin/MyBranch)
               \
                j--k--l(MyBranch)

如果我通过拉动git pull --rebase进行更新,我的树怎么样?它是否只会重写j,k,l(我当地的那些)的历史并将其置于m之上,还是会重写已经在远程分支上的其他历史记录?

rebase起点究竟是什么,重播是什么?

此外,如果将origin / MyBranch合并到其他上游分支中,例如“develop”,那么我的rebase的含义是什么?

a--b--c--d--g--h (master, origin/master) --n --o --p (origin/develop)
      \         \                                 /
       e--f--i---m( origin/MyBranch)--------------
              \
               j--k--l(MyBranch)

2 个答案:

答案 0 :(得分:2)

评论,git pull --rebase是:

  • git fetch :此处您的远程跟踪分支origin/MyBranch已更新)

    a--b--c--d--g--h (master, origin/master)
           \         \
            e--f--i---m( origin/MyBranch)
                   \
                    j--k--l(MyBranch)
    
  • git rebase :您在原点/ MyBranch

    之上重新定义MyBranch
    a--b--c--d--g--h (master, origin/master)
           \         \
            e--f--i---m( origin/MyBranch)
                       \
                        j'--k'--l'(MyBranch)
    

答案 1 :(得分:1)

我在本地工作中一直使用rebase。我遇到的最糟糕的问题是我合并错了。使用 git reflog 我恢复了上一次提交并再次重新设置,直到我做对了。

如果你觉得必须这样做的话,有些情况可以让人想到不要变硬或谨慎。

  1. 回购广告由不止一个人使用,但不是"祝福"回购。无论何时共享回购,改变历史几乎总是坏的。话虽如此,如果每个人都同意,推动他们当前的工作,你重新调整,他们重置他们的HEAD(以及其他类似的策略)它可以没有心痛。
  2. 两个分支具有不同但相似的代码库(fork,如macosx / freebsd)。在这种情况下,重新确定osx几乎肯定是个坏主意。
  3. 自分歧以来,你已经完成了数千次提交。使用 git reflog 来解决您的错误时,了解 git 的旧提交缓存是有限的,这一点非常重要。如果有足够的本地提交,则一个rebase可能会让你无法恢复到你的pre-rebase提交。
  4. 最后一点让我咬了一口气。我也倾向于使用 git rebase -i 。我有大约200次提交,并且正在仔细重新排序,分组和压缩提交,目标是降低到10次提交。

    一个星期左右后,我意识到有一个问题,并希望与旧的东西进行比较。我尝试了reflog,但最老的提交是在我的变基础中。我很幸运,找到了我制作的克隆,但在那之后我学会了对rebase更加小心。