Sam*_*nes 5 git version-control merge git-svn git-merge
我正在使用git-svn对我公司的Subversion存储库进行离线开发,Subversion存储库是项目的记录存储库.为了实现管理可见性,我需要在SVN中维护我的功能分支.有时我需要在分支的生命周期内多次将来自主干的更改合并到功能分支.由于我需要在SVN中保持分支最新,我必须合并; 一旦他们被推向SVN,我就无法重新提交.此外,git svn dcommit从合并提交中删除第二个父级.这意味着在第一次git merge将分支根标识为合并基础而不是最近的合并父级之后的合并.因此,它尝试重新合并已经合并的更改,这几乎可以保证令人讨厌的冲突.
当我合并SVN时,我手动指定基本修订:
svn merge -r 49262:49608 $svn/trunk
Run Code Online (Sandbox Code Playgroud)
有没有办法让git与手动指定的基本修订版合并?
请注意,我需要指定两个修订版本,包括基本版本和父版本.我有一个历史
trunk: A -- B -- C -- D -- H -- I
\ \
feature: E -- F -- G -- J -- K
Run Code Online (Sandbox Code Playgroud)
但git svn dcommit已删除G和之间的父关系D.我需要运行的合并I到K同一个基地D.简单地跑
$ git checkout feature
$ git merge trunk
Run Code Online (Sandbox Code Playgroud)
将尝试合并I到K基础B而不是D,重新应用C并D导致极端合并冲突.使用SVN,我会运行一个命令
$ svn switch $svn/feature
$ svn merge -r D:I $svn/trunk
Run Code Online (Sandbox Code Playgroud)
但git merge没有指定基本修订的选项D.我正在寻找类似的东西
$ git merge --base D trunk
Run Code Online (Sandbox Code Playgroud)
但这样的选择似乎并不存在.
(编辑:对于执行此操作的较低级别方法,请参阅以前的修订,但这种方法是最快的)
feature使用以正确的合并基础为父级的树进行随机数提交
git checkout `git commit-tree -p $D -m - feature^{tree}`
Run Code Online (Sandbox Code Playgroud)像往常一样将 trunk 合并到其中
git merge trunk --no-commit
git commit # the two-stepper gets the commit message someplace known
Run Code Online (Sandbox Code Playgroud)提交合并树作为新feature提示
git commit-tree -p feature -p trunk -F .git/COMMIT_EDITMSG HEAD^{tree} \
| xargs git checkout -B feature
Run Code Online (Sandbox Code Playgroud)