git-svn在git中合并后会发生dcommit吗?

时间:2008-10-10 07:38:52

标签: svn git merge branch git-svn

我尝试git-svn的动机是轻松融合和分支。然后我注意到男人git-svn(1)说:

  

不建议在您计划的分支上运行git-merge或git-pull   来自。 Subversion不代表任何合并   合理或有用的时尚;所以使用Subversion的用户看不到任何内容   合并你做的。此外,如果您从git合并或拉出   作为SVN分支的镜像的分支,dcommit可能会提交给   错误的分支。

这是否意味着我无法从svn / trunk(或分支)创建本地分支,破解,合并回svn / trunk,然后dcommit?我知道svn用户会看到同样的混乱,在svn pre 1.5.x中一直是合并,但是还有其他缺点吗?最后一句也让我担心。人们经常做这些事吗?

6 个答案:

答案 0 :(得分:173)

实际上,我在git merge上使用--no-ff选项找到了更好的方法。 我以前用过的所有这种壁球技术都不再需要了。

我的新工作流程现在如下:

  • 我有一个“master”分支,它是我提交的唯一分支,克隆SVN存储库(-s假设您在存储库trunk/中有一个标准的SVN布局, branches/tags/):

    git svn clone [-s] <svn-url>
    
  • 我在本地分支“work”工作(-b创建分支“work”)

    git checkout -b work
    
  • 在本地提交到“work”分支(-s以签署您的提交消息)。在续集中,我假设你做了3次本地提交

    ...
    (work)$> git commit -s -m "msg 1"
    ...
    (work)$> git commit -s -m "msg 2"
    ...
    (work)$> git commit -s -m "msg 3"
    

现在您想要提交到SVN服务器

  • [最终]存储您不希望在SVN服务器上看到的修改(通常您只是因为想要加速编译并专注于给定的功能而在主文件中注释了一些代码)< / p>

    (work)$> git stash
    
  • 使用SVN存储库重新绑定主分支(从SVN服务器更新)

    (work)$> git checkout master
    (master)$> git svn rebase
    
  • 返回工作分支并与主人

    重新绑定
    (master)$> git checkout work
    (work)$> git rebase master
    
  • 确保一切正常,例如:

    (work)$> git log --graph --oneline --decorate
    
  • 现在是时候使用这个精彩的--no-ff选项将所有三个提交从“工作”分支合并到“主”中

    (work)$> git checkout master
    (master)$> git merge --no-ff work
    
  • 您可以注意到日志的状态:

    (master)$> git log --graph --oneline --decorate
    * 56a779b (work, master) Merge branch 'work'
    |\  
    | * af6f7ae msg 3
    | * 8750643 msg 2
    | * 08464ae msg 1
    |/  
    * 21e20fa (git-svn) last svn commit
    
  • 现在你可能想要编辑(amend)你的SVN家伙的最后一次提交(否则他们只会看到一个提交消息“合并分支'工作'”

    (master)$> git commit --amend
    
  • 最后在SVN服务器上提交

    (master)$> git svn dcommit
    
  • 返回工作并最终恢复藏匿的文件:

    (master)$> git checkout work
    (work)$> git stash pop
    

答案 1 :(得分:49)

使用git-svn绝对可以创建本地分支。只要你自己只使用本地分支,而不是尝试使用git在上游svn分支之间进行合并,你应该没问题。

我有一个“master”分支,用于跟踪svn服务器。这是我唯一提出的分支。如果我正在做一些工作,我会创建一个主题分支并继续努力。当我想提交它时,我会执行以下操作:

  1. 将所有内容提交到主题分支
  2. git svn rebase (解决你的工作和svn之间的任何冲突)
  3. git checkout master
  4. git svn rebase (这使得下一步成为快进合并,请参阅下面的Aaron评论)
  5. git merge topic_branch
  6. 解决任何合并冲突(此时不应该有)
  7. git svn dcommit
  8. 我还有另一种情况需要维护一些本地更改(用于调试),这些更改永远不应该推送到svn。为此,我有上面的主分支,但也有一个叫做“工作”的分支,我通常在那里工作。主题分支是分支工作。当我想在那里提交工作时,我会检查master并使用cherry-pick来从我想要提交给svn的工作分支中选择提交。这是因为我想避免提交三个本地更改提交。然后,我从主分支中提交并重新安装所有内容。

    首先运行git svn dcommit -n以确保您准确提交您打算提交的内容是值得的。与git不同,在svn中重写历史很难!

    我觉得必须有一个更好的方法来合并主题分支上的更改,同时跳过那些本地更改提交而不是使用cherry-pick,所以如果有人有任何想法,他们将受到欢迎。

答案 2 :(得分:33)

答案 3 :(得分:8)

Greg Hewgill回答顶部并不安全!如果在两个“git svn rebase”之间的主干上出现任何新提交,则合并将不会快进。

可以通过对git-merge使用“--ff-only”标志来确保,但我通常不在分支中运行“git svn rebase”,只在其上运行“git rebase master”(假设它是只有当地的分支机构)。然后,“git merge thebranch”保证快进。

答案 4 :(得分:6)

在git中合并svn分支的一种安全方法是使用git merge --squash。这将创建一个提交并停止添加消息。

假设您有一个主题svn分支,称为svn-branch。

git svn fetch
git checkout remotes/trunk -b big-merge
git merge --squash svn-branch

此时你将svn-branch中的所有更改压缩成一个在索引中等待的提交

git commit

答案 5 :(得分:5)

将本地git分支重新引导到主git分支然后dcommit,这样看起来你按顺序完成了所有这些提交,所以svn人们可以像他们习惯的那样线性地看到它。假设您有一个名为topic的本地分支,您可以这样做

git rebase master topic

然后将通过主分支播放您的提交,准备好您提交