git svn workflow - 功能分支和合并

时间:2009-07-15 06:17:36

标签: git version-control git-svn

我现在正在使用git-svn以下工作流程

git clone <SVN TRUNK URL> #done once

随后我处理一个功能

git branch featureZ
git checkout featureZ
#make edits for featureZ
git commit

git checkout master
git svn rebase # fetch changes from server

git checkout featureZ #go back to branch
#git merge master 
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below)

#make edits for featureZ
git commit #featureZ completed

git checkout master
git merge featureZ #getting featureZ onto master. Prepare to send to SVN

git svn dcommit #push featureZ back to SVN

现在我将git合并到master上时会有一些注意事项,featureZ分支中的所有单独提交都会合并为一个对我来说没问题。

提交消息被替换为“与featureZ合并”。可以使用merge fmt msg修复此问题。

现在我的问题是 是否存在任何可能出现此问题的工作流程或需要注意的事项。我在git-svn manual中读到了在使用git svn时不应该进行合并。我在工作流程中所做的是他们所指的是什么?如果是这样会引起什么样的问题?有一件事是我不想做与SVN主线混淆的事情。

4 个答案:

答案 0 :(得分:26)

SVN无法处理非线性历史记录(它根本就没有它的符号)。所以你要做的是改造而不是合并,因为它保留了SVN的线性历史(这在git-svn手册页here中有说明。

详细说来,线性历史是微不足道的。它们沿直线(A到B到C到D)。虽然非线性历史可以从(A到B到C,B到D再到C + D到E - 换句话说,它们会发芽成分支)。

重新定位会为您提供线性历史记录。请记住,rebase应该从您的私人本地分支机构完成。例如,如果您有2个分支:主分支和实验分支。你会结账实验并最好用-i标志做'git rebase master'。反过来做可能会导致不良副作用。

然后你结账大师并合并来自实验分支的变化。你的历史应保持线性。

答案 1 :(得分:4)

您应该查看此合并选项:

git checkout master
git merge --squash featureZ

它会将分支上的所有提交压缩到主分支上的单个提交中。您将有机会编辑日志消息,该消息已初始化,并附有在分支上执行的操作的摘要。

它的缺点是不记录功能分支上的个别提交。此外,您应该只执行一次,而不是在分支上再做任何工作,因为它没有注册为正确的合并,并且任何后续合并都可能产生不希望的结果。

答案 2 :(得分:2)

假码-sam-rashid给出的答案是正确的。这不是一个答案,更多的是简化。

你可以从任何git分支svn rebase / dcommit。唯一使用 master 的方法是,如果您需要进行其他本地更改,则需要与 featureZ 中的更改进行合并。

git branch featureZ
git checkout featureZ
#bunch of changes
git commit
git svn rebase
# solve any conflicts
git svn dcommit

如果您想保持干净的主人,那么您可以git svn rebasegit merge featuresZ

答案 3 :(得分:0)

您可以使用SubGit代替git-svn。它是一个服务器端工具,可以自动同步Subversion和Git存储库。

您可以使用任何Git工作流程和任何可用的Git客户端,无需其他客户端工具。

考虑您的情况:

git branch featureZ
git checkout featureZ
# make edits for featureZ
git commit
git checkout master

您可以按以下步骤操作:

  1. 完全推送功能分支。

    git merge featureZ
    git push origin refs/heads/*
    
  2. 在master / trunk上重新启动功能分支。

    git rebase featureZ
    git push
    
  3. Squash从功能分支提交。

    git merge --squash featureZ
    git commit
    git push
    
  4. 只要您推送更改,SubGit挂钩就会将您的更改转换为Subversion版本。

    更多细节:

    • SubGit在很多方面都比git-svn更优越 - 更好的合并跟踪翻译,EOLs&amp; mime-type support等。
    • SubGit需要本地访问Subversion存储库(它使用自定义挂钩);
    • SubGit是一个商业产品,有一些免费选项(开源和学术项目,小团队)。