代码之家  ›  专栏  ›  技术社区  ›  Zenon

git add的git svn问题--导致冲突的修补程序

  •  0
  • Zenon  · 技术社区  · 14 年前

    基本上,当我想在同一个文件中提交由 git add --patch <file> 操作时,git svn rebase稍后在使用时遇到第二个更改时抛出1-2个冲突 git add 第二次改变。

    所以我基本上是这样做的(我在master branch上,已经获取了svn存储库):

    git checkout -b feature
    ... make two unrelated changes to file test.txt...
    git add --patch test.txt
    ... add first change but ignore second one
    git commit -m "change1"
    git stash
    git checkout master
    git merge feature
    git svn rebase
    git svn dcommit
    git checkout feature
    git stash apply
    

    现在有两种方法,第一种有效:

    git add --patch test.txt
    ... select everything (which is the second change in this case)
    git commit -m "change 2"
    git checkout master
    git merge feature
    git svn rebase
    git svn dcommit
    

    有一个不起作用:

    git add test.txt #notice there's no --patch
    git commit -m "change 2"
    git checkout master
    git merge feature
    git svn rebase #yields a conflict
    

    为什么在使用 git add --patch 对于第二个更改,我可以毫无问题地提交到svn存储库,但是只使用 git添加 对于第二个变化,它会导致冲突吗?我对git还很陌生,所以这可能是一个愚蠢的问题,但在我看来,两个命令集的作用应该完全相同。

    1 回复  |  直到 14 年前
        1
  •  1
  •   knittl    14 年前

    为什么要为两次提交创建一个分支,然后再合并回来?我想这可能会带来问题,因为git中的合并与svn中的合并工作方式不同。

    # on master, no need to create a branch
    $ git add -p file
    $ git commit -m "first set of changes"
    $ git add file
    $ git commit -m "the remaining changes"
    # apply your commit on top of eventually new changes upstream
    $ git svn rebase
    # commit your 2 commits to svn
    $ git svn dcommit
    

    在svn中,分支只是一个目录(通常是主干目录)的副本,合并提交与普通提交没有区别(除了新的提交) svn:mergeinfo 属性(从svn 1.6开始)

    git中的提交是不同的,每个提交存储一个指向其父提交的链接。svn不需要这个,因为它可以简单地使用REV-1。因此,git中的合并提交有多个父级(合并分支和合并分支)

    我不知道如果您将git提交给svn会发生什么,但它可能只提交合并提交本身,而不提交历史记录(消息类似于“merged branch'bla'into'master”)。

    当你跑的时候 svn commit git svn dcommit 失败。

    它甚至在gitsvn文档中这样说:不要使用git合并分支并将它们提交给svn,这很可能会弄乱您的历史记录

    推荐给你打算去的分支机构 来自的数据提交。颠覆不存在 以任何合理或合理的方式代表合并 有用的时尚;所以用户使用 Subversion无法看到任何合并 你已经成功了。此外,如果你合并 或者从一个git分支 犯了错误。 git svn docs