用Git重新定基

用Git重新定基,git,rebase,git-rebase,git-pull,Git,Rebase,Git Rebase,Git Pull,我已经看过很多关于如何使用Git重新设置基址的文章,这是有意义的……或者至少我认为是有意义的。然而,我正在努力解决以下问题 对于此场景,我们有以下分支: 硕士(本地) 来源/主要 杰吉斯(当地) 起源/杰吉斯 好的,现在让我们假设origin/master领先1个commit。因此,我从文章中得知,我正在工作的开发团队将在杰吉斯分支上做以下工作: $ git add ... $ git commit ... $ git status (ensure everything is up-to-d

我已经看过很多关于如何使用Git重新设置基址的文章,这是有意义的……或者至少我认为是有意义的。然而,我正在努力解决以下问题

对于此场景,我们有以下分支:

  • 硕士(本地)
  • 来源/主要
  • 杰吉斯(当地)
  • 起源/杰吉斯
好的,现在让我们假设origin/master领先1个commit。因此,我从文章中得知,我正在工作的开发团队将在杰吉斯分支上做以下工作:

$ git add ...
$ git commit ...
$ git status (ensure everything is up-to-date locally)
$ git pull (again, check and ensure that everything is ready to go)
$ git pull --rebase origin master
$ git push (defaulting to origin/jheigs)
  • 当rebase运行正常时,我遇到的是origin/jheigs和local jheigs的头提交不匹配(鉴于上述rebase),因此有时我可能不得不先拉后推,这可能会导致冲突。我感到困惑的是……我是否应该使用:

    $ git push --force origin jheigs (?)
    
  • 第二个问题……现在,让我们假设我已经推过了,jheigs已经用origin/master正确地重新设置了基址。不存在冲突,我的jheigs和origin/jheigs现在比master提前1次提交。好的,一天过去了,我需要做更多的改变。所以我对jheigs和add/commit进行了这些更改。但是,“源站/主站”没有其他更新。基本上,我仍然领先于origin/master 1次提交(很快将是2次)。我是否仍然遵循上述相同的流程?或者我只是添加/提交并推送到origin/jheigs,而不重定基址,因为我已经领先origin/master了

  • 很抱歉,这太长了,但我想我已经弄明白了,它并不像我想象的那么平滑。我想在重定基址时要小心,所以非常感谢您的帮助

    好吧,首先,我会(并且确实)完全或大部分避免使用
    git-pull
    :这是为了方便,但结果是不方便。它只运行
    git fetch
    ,然后执行第二个git命令,该命令将影响您签出的任何分支。有时我不想或不需要取回;其他时候,我想在执行影响当前分支的任何第二个命令之前,先看看fetch运行时发生了什么

    正如您可能已经读到的,
    git-rebase
    实际上是关于复制(一些)提交的。您的存储库中有一些提交集合,而现在,无论出于何种原因,一些提交已失去光泽,您希望进行更新、更好、更漂亮、更闪亮的提交

    使所有这些都有意义的方法是绘制提交图。请记住,不同的存储库中有多个克隆,它们大多包含相同的提交集,但所涉及的提交集并不完全相同

    绘制您自己的存储库的提交 你可以让Git帮你做这件事:
    Git log--all--decoration--oneline--graph
    ,或者Git log(和狗一起)。不过,一开始用手做是很好的锻炼。另外,当你用手做的时候,你可以水平地画出来,这会更有意义

    请记住,由其唯一哈希ID标识的每个提交都是只读的。每个提交都指向其父提交。分支名称(如
    master
    jheigs
    )或远程跟踪名称(如
    origin/master
    origin/jheigs
    )指向(记录)提示提交的哈希ID,Git从这些提示向后工作:

    ...--C--D--E   <-- master
             \
              F--G   <-- jheigs (HEAD)
    
    F
    复制到
    F'
    后,现在可以将
    G
    复制到新的和改进的
    G'

                 F'-G'   [new and improved!]
                /
    ...--C--D--E   <-- master
             \
              F--G   <-- jheigs (HEAD)
    
                 F'-G'  <-- jheigs (HEAD)
                /
    ...--C--D--E   <-- master
             \
              F--G   [abandoned]
    
                   F'-G'  <-- jheigs (HEAD), origin/jheigs
                  /
                 H   <-- origin/master
                /
    ...--C--D--E   <-- master
    
    昨天如此光鲜亮丽的陈旧、乏味的
    F
    G
    提交现在都是垃圾,取而代之的是光鲜亮丽的新
    F'
    G'
    。这是因为您的分支名称
    jheigs
    现在指向新复制提交的最后一个


    1此复制是通过git cherry pick进行的。根据您使用的rebase命令的不同,它实际上可能是通过
    git cherry pick
    完成的


    还涉及到另一个存储库:
    fetch
    push
    上面的图表是针对您的存储库的,但这里还涉及第二个存储库。它们有自己的分支名称和提交。您拥有的提交以及它们也拥有的提交共享提交哈希ID。你可能有一些承诺,但他们没有;他们可能有一些承诺,而你没有

    如果您认为他们可能有您没有的提交,那么应该运行
    git-fetch
    git-fetch-origin
    。这让你的Git调用他们的Git,在名称
    origin
    下列出的URL上。您的Git调用他们的Git,并让他们按照分支名称列出所有提交(通过哈希ID)

    如果他们有你没有的提交,你的Git现在会下载这些提交。您的Git也会更改它们的分支名称,例如
    master
    jheigs
    ,以便它们读取
    origin/master
    origin/jheigs
    。这些新名称不会干扰您的分支名称

    现在您已经有了所有的提交,再加上以前的所有提交,您的存储库可能看起来是这样的,让我们假设您还没有完成git rebase:

                 H   <-- origin/master
                /
    ...--C--D--E   <-- master
             \
              F--G   <-- jheigs (HEAD), origin/jheigs
    
    请注意,
    origin/*
    名称均未移动,您自己的
    master
    也未移动。但是,它们的
    jheigs
    ,您称之为
    origin/jheigs
    仍然记得提交
    G

    现在,您需要
    git push——强制jheigs
    ,告诉他们:抛弃提交
    F
    G
    ,以支持新的
    F'
    G'
    。一旦他们同意这样做,你的Git就会记住他们的
    j指向
    G'

                 F'-G'   [new and improved!]
                /
    ...--C--D--E   <-- master
             \
              F--G   <-- jheigs (HEAD)
    
                 F'-G'  <-- jheigs (HEAD)
                /
    ...--C--D--E   <-- master
             \
              F--G   [abandoned]
    
                   F'-G'  <-- jheigs (HEAD), origin/jheigs
                  /
                 H   <-- origin/master
                /
    ...--C--D--E   <-- master
    
    F'-G'首先,我会(并且会)完全避免
    git-pull
    ,或者主要避免:这是为了方便,但结果是不方便。它只运行
    git fetch
    ,然后执行第二个git命令,该命令将影响您签出的任何分支。有时候我不想