为什么“我们的”和“他们的”的意思与git-svn相反

我使用git-svn和我注意到,当我必须修复一个合并冲突执行git svn rebase后,–ours和–theirs选项的含义,例如。 git checkout是颠倒的。也就是说,如果有一个冲突,我想保留来自SVN服务器的版本,并抛弃我在本地做的更改,我必须使用我们的,当我希望它是他们的。

这是为什么?

例:

mkdir test
cd test
svnadmin create svnrepo
svn co file://$PWD/svnrepo svnwc
cd svnwc
echo foo > test.txt
svn add test.txt
svn ci -m 'svn commit 1'
cd ..
git svn clone file://$PWD/svnrepo gitwc
cd svnwc
echo bar > test.txt 
svn ci -m 'svn commit 2'
cd ..
cd gitwc
echo baz > test.txt 
git commit -a -m 'git commit 1'
git svn rebase

git checkout --ours test.txt
cat test.txt 
# shows "bar" but I expect "baz"

git checkout --theirs test.txt
cat test.txt 
# shows "baz" but I expect "bar"
这似乎与rebase做的一致。

> git svn rebase将从当前HEAD的SVN父对象获取修订版本,并对当前HEAD的当前(未提交到SVN)工作进行修订。
> git rebase不提:
注意,rebase合并通过从< upstream>之上的工作分支重放每个提交来工作,科。
因此,当发生合并冲突时:

>报告为我们的一方是从< upstream>开始的那么远的refased系列,
>和他们是工作分支。
换句话说,边被交换。

git rebase replays each commit from the working branch on top of the <upstream> branch.

如果您协调两个定义:

>来自SVN的提交是在其上重放本地Git提交的提交。它们是“so-far rebased系列”的一部分,并被引用为“我们的”(在你的情况下,test.txt文件带有bar内容)
>工作分支(包含Git提交未知的SVN,在您的情况下,test.txt文件与baz内容)是“他们的”,每个这些本地Git提交正在重放。

换句话说,SVN是否:

>“上游”分支(其上面重放任何东西,并且是到目前为止的重组提交的一部分)“是”我们的“。
>正在重放的(工作分支)是“他们的”。

mnemonic tip by CommaToast

whatever HEAD’s pointing to is “ours”

(和第一件事git rebase上游它检查上游分支,其上你想改变:HEAD指上游 – 我们现在。)

混乱可能来自工作分支在经典git merge中的作用。
合并时:

>“工作分支”是包含什么是“到目前为止合并”,并被认为是“我们的”,
>而另一个提交代表什么是 – 不重放,但 – 合并在工作分支的顶部,并被认为是“他们的”。

正如git rebase man page所提到的,在rebase期间的合并意味着边被交换。

另一种说同样的方法是考虑:

>我们在签出的分支上是“我们的”,
>我们(和正在被合并或重放)是什么’他们的’。

合并时:

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做的第一件事是检出上游分支! (重放当前提交的顶部)

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

git rebase上游将首先将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

使用git svn rebase的唯一额外步骤是首先在代表SVN提交的Git远程分支上执行svn“fetch”。
你最初:

x--x--x--x--x(*) <- current branch B, "ours" for now.
    \                                   
     \
      \--y--y--y <- SVN tracking branch, "theirs for now"

,您首先使用来自SVN的新提交更新SVN跟踪分支

x--x--x--x--x(*) <- current branch B, still "ours", not for long
    \                                   
     \
      \--y--y--y--y'--y' <- SVN tracking branch updated

,然后将当前分支切换到SVN侧(其变为“我们的”)

x--x--x--x--x <- for "B", now "their" during the rebase
    \                                   
     \
      \--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B: 
                               now "ours" (this is "what we now have")

,然后重放您正在处理的提交(但是在rebase期间现在是“他们的”),

x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
    \
     \
      \--y--y--y--y'--y'--x'--x'--x'(*) <-  branch B with HEAD updated ("ours")
                      ^
                      |
        upstream SVN tracking branch
http://stackoverflow.com/questions/2959443/why-is-the-meaning-of-ours-and-theirs-reversed-with-git-svn

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么“我们的”和“他们的”的意思与git-svn相反