git rebase,跟踪“本地”和“远程”

在做git rebase时,在解决冲突时,我经常很难弄清楚'local'和'remote'发生了什么。 我有时会产生这样的印象:他们从一个承诺转到另一个承诺。

这可能(绝对),因为我还没有正确理解。

当重组时,谁是'本地'和谁是'偏远'?

(我使用P4Merge来解决冲突)


TL; DR;

总结(如Benubird评论),当:

git checkout A
git rebase   B    # rebase A on top of B
  • localB (rebase ),
  • remoteA
  • 和:

    git checkout A
    git merge    B    # merge B into A
    
  • localA (合并
  • remoteB
  • rebase切换ours (rebase开始前的当前分支)和theirstheirs想要rebase顶部的分支)。


    kutschkem指出, 在GUI mergetool上下文中

  • 本地引用部分重新发布的提交 :“ ours ”(上游分支)
  • 远程指的是传入的变化 :“ theirs ” - 当前分支之前的变形。
  • 请参阅本答复最后部分的插图。


    反转时,反转

    这种混淆可能与ourstheirs在反弹过程中的倒置有关。
    (相关摘录)

    git rebase手册页:

    请注意,通过在<upstream>分支顶部重播来自工作分支的每个提交,合并索引合并工作。

    因此,发生合并冲突时:

  • 报道为“ ours ”的一面是迄今为止重新发布的系列文章,从<upstream>
  • ' theirs '是工作分支。 换句话说,双方交换。

  • 说明倒置

    在合并

    x--x--x--x--x(*) <- current branch B ('*'=HEAD)
        
         
          --y--y--y <- other branch to merge
    

    ,我们不改变当前分支'B',所以我们仍然在做我们正在做的事(我们从另一个分支合并)

    x--x--x--x--x---------o(*)  MERGE, still on branch B
               ^        /
              ours     /
                      /
           --y--y--y--/  
                   ^
                  their
    

    在rebase上:

    但是在一个rebase上 ,我们转换方,因为rebase做的第一件事是检查上游分支! (重播当前的提交)

    x--x--x--x--x(*) <- current branch B
        
         
          --y--y--y <- upstream branch
    

    git rebase upstreamgit rebase upstream会首先将B的HEAD更改为上游分支HEAD (因此与之前的“当前”工作分支相比,“我们”和“他们的”开关)。

    x--x--x--x--x <- former "current" branch, new "theirs"
        
         
          --y--y--y(*) <- upstream branch with B reset on it,  
                           new "ours", to replay x's on it
    

    ,然后rebase会在新的'我们的'B分支上重播'他们'的提交:

    x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
        
         
          --y--y--y--x'--x'--x'(*) <-  branch B with HEAD updated ("ours")
                   ^
                   |
            upstream branch
    

    注意:“上游”概念是从中读取数据或添加/创建新数据的参考数据集(全部回购或像这里的分支,可以是本地分支)。


    ' local '和' remote '与' mine '和' theirs '

    Pandawood在评论中补充道:

    对我而言,问题仍然存在,这是“本地”,谁是“远程”(因为在git中重新绑定时不会使用“我们”和“他们的”这些术语,这些术语似乎使答案更加混乱) 。

    GUI git mergetool

    kutschkem补充道,正确如此:

    在解决冲突时,git会说这样的话:

    local: modified file and remote: modified file. 
    

    我很确定这个问题是针对当地和偏远地区的定义。 那时,从我的经验来看,我认为:

  • 本地引用部分重新发布的提交 :“ ours ”(上游分支)
  • 远程指的是传入的变化 :“ theirs ” - 当前分支之前的变形。
  • git mergetool确实提到了“本地”和“远程”

    Merging:
    f.txt
    
    Normal merge conflict for 'f.txt':
      {local}: modified file
      {remote}: modified file
    Hit return to start merge resolution tool (kdiff3):
    

    例如,KDiff3会显示合并分辨率,如下所示:

    kdiff3

    并且融合也会显示它:

    梅尔德差异

    VimDiff相同,它显示:

    用git mergetool -t gvimdiff调用Vimdiff作为mergetool。 最新版本的Git使用以下窗口布局调用Vimdiff:

    +--------------------------------+
    | LOCAL  |     BASE     | REMOTE |
    +--------------------------------+
    |             MERGED             |
    +--------------------------------+
    
  • LOCAL
    包含当前分支上文件内容的临时文件。
  • BASE
    包含合并的公共基础的临时文件。
  • REMOTE
    包含要合并的文件内容的临时文件。
  • MERGED
    包含冲突标记的文件。
  • Git已经执行了尽可能多的自动冲突解决方案,并且此文件的状态是LOCALREMOTE的组合,其中包含任何Git无法解析的冲突标记。
    mergetool应将解析结果写入此文件。


    底线

    git rebase

  • LOCAL =你在基础重建基础
  • REMOTE =你在上面提交的提交
  • 混帐合并

  • LOCAL =你正在合并的原始分支
  • REMOTE =你正在合并的其他分支
  • 换句话说, LOCAL总是原创的,而REMOTE总是那些之前没有提交过的人,因为他们被合并或重组在上面

    证明给我看!

    当然。 不要听我的话! 这是一个简单的实验,你可以自己看看。

    首先,确保你已经正确配置了git mergetool。 (如果你没有,那么你可能不会读这个问题。)然后找到一个工作目录。

    设置您的存储库:

    md LocalRemoteTest
    cd LocalRemoteTest
    

    创建一个初始提交(使用空文件):

    git init
    notepad file.txt  (use the text editor of your choice)
      (save the file as an empty file)
    git add -A
    git commit -m "Initial commit."
    

    在不是主控的分支上创建提交:

    git checkout -b notmaster
    notepad file.txt
      (add the text: notmaster)
      (save and exit)
    git commit -a -m "Add notmaster text."
    

    在主分支上创建一个提交:

    git checkout master
    notepad file.txt
      (add the text: master)
      (save and exit)
    git commit -a -m "Add master text."
    
    gitk --all
    

    此时你的仓库应该是这样的:

    现在进行rebase测试:

    git checkout notmaster
    git rebase master
      (you'll get a conflict message)
    git mergetool
      LOCAL: master
      REMOTE: notmaster
    

    现在是合并测试。 关闭您的mergetool而不保存任何更改,然后取消rebase:

    git rebase --abort
    

    然后:

    git checkout master
    git merge notmaster
    git mergetool
      LOCAL: master
      REMOTE: notmaster
    git reset --hard  (cancels the merge)
    

    您的结果应该与顶部显示的结果相同。


    我没有完全确定您的问题,但我认为下图解决了您的问题。 (Rebase:远程仓库--->工作区)

    http://assets.osteele.com/images/2008/git-transport.png

    来源:我的Git工作流程

    链接地址: http://www.djcxy.com/p/41677.html

    上一篇: git rebase, keeping track of 'local' and 'remote'

    下一篇: How to prevent vim from creating (and leaving) temporary files?