我正在使用git-svn。我试着做一个git svn rebase。一切都破了。我在reflog中找到了旧的repo状态,并试图以最安全的方式进行。现在我的回购看起来像这样:
更新:我在rebase之前进行了合并
... -- A (origin/branchA) -- B -- C -- D (BranchA,HEAD)
/
/
... -- E (origin/trunk,Trunk) -- ...
我做了以下
branch BranchA-Fix origin/branchA
回购看起来像这样
... -- A (origin/branchA,BranchA-Fix) -- B -- C -- D (BranchA,HEAD)
_____________/
/
-- E (origin/trunk,Trunk) -- ...
然后我尝试将我的工作移到一边,这样我就不会有任何冲突试图做一个git svn rebase
git rebase BranchA-Fix
首先,倒带头重播你的工作......应用: 其脚本次要更新使用索引信息重建基础树...
...
合并...自动合并硬件/ d3_script.ii CONFLICT(内容):合并 硬件冲突/ d3_script.ii无法合并更改。 修补程序在0001处失败其脚本次要更新修补程序的副本 失败的原因在于:
/cygdrive/SOME_DIRECTORY/.git/rebase-apply/patch解决此问题后,请运行“git rebase --continue”。如果 你更喜欢跳过这个补丁,而是运行“git rebase --skip”。至 检查原始分支并停止变基,运行“git rebase --abort”。
发生什么事了?为什么在地球上重新定位直接祖先会导致任何类型的合并冲突?如何在不导致合并错误的情况下继续使用svn更新?
答案 0 :(得分:0)
这种冲突非常令人期待,代表了混合合并和重组的众所周知的问题。 git-svn特别严重。
基本上你要求git重播BranchA-Fix
所有提交给你当前HEAD(BranchA
)而不是BranchA-Fix
的提交。这有效地意味着整个行李箱从一开始就形成了其余部分。
您可以通过git log HEAD --not BranchA-Fix
直观地看到这一点,或者对您的案例更具说明性 - 尝试以交互模式重复您的rebase:git rebase --interactive BranchA-Fix
一般来说,对于具有双向同步的git-svn,强烈建议避免合并并完全切换到rebase工作流程。理由 - git svn dcommit
的变形性质。
你当前情况的解决方案取决于分支关系的细节,保持历史(非压缩提交)的git-only分支的必要性和rebase分支的能力(你的情况中的最后一个似乎是没问题)。
答案 1 :(得分:0)
除了避免完全合并之外,另一种解决方案是使用混合重置而不是重新设置基准。
基本上,而不是运行:
git rebase BranchA-Fix
您可以改为:
git reset BranchA-Fix
[... stage changes for B...]
git commit -m "B"
[... stage changes for C and E...]
git commit -m "E"
[... stage changes for D...]
git commit -m "D"
...或者,更有效的是,如果您打算将其压榨:
git reset BranchA-Fix
git commit -am "MyNewMessage"