我现在正在使用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主线混淆的事情。
答案 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 rebase
或git 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
您可以按以下步骤操作:
完全推送功能分支。
git merge featureZ
git push origin refs/heads/*
在master / trunk上重新启动功能分支。
git rebase featureZ
git push
Squash从功能分支提交。
git merge --squash featureZ
git commit
git push
只要您推送更改,SubGit挂钩就会将您的更改转换为Subversion版本。
更多细节: