我的方案有:
SVN服务器仍然是规范的,但与GitHub存储库保持一致。其他用户专门使用SVN,我是唯一的git + SVN用户(简化了事情)。
当我在其他计算机上工作时(例如我的笔记本电脑,家里,国外)我使用git并使用GitHub仓库推送/提取我的提交。在我办公室工作之前,我的提交不会进入SVN。
当我在办公室时,我会做一个git pull
从GitHub引入任何新的提交,然后执行git svn dcommit
,然后再git push -f
返回到GitHub所以新的SVN注释提交成为GitHub上的正典并完美匹配SVN。
然而,今天我的办公室计算机上有一些待处理的提交 - 但我也有非提交提交 - 而且我不知道如何修复它。
今天上午9点,在任何命令运行之前,我的回购看起来像这样:
o = Normal Git commit, lacking SVN annotation
* = SVN-annotated Git commit
GitHub
*---*---*---*---o---o---o---o---o
A B C D E F G H I
Local computer git repo
*---*---*---*---o---o
A B C D E F
SVN
*---*---*---*
A B C D
说明:我有两个提交,E
和F
在我当地的计算机仓库中,之前是从GitHub提取的,这些提交还没有dcommit
' d到SVN。
今天早上我犯了一个错误,因为我没有先运行git svn dcommit
,而是立即在我的本地计算机上运行git pull
。运行git svn dcommit
导致repos进入此状态:
GitHub
*---*---*---*---o---o---o---o---o
A B C D E F G H I
Local computer git repo
*---*---*---*---*---*
A B C D E' F'
SVN
*---*---*---*---*---*
A B C D E' F'
请注意,E
和F
现在是E'
和F'
,因为它们已被git svn
修改为SVN注释提交(因此它有一个不同的提交哈希,即使它代表相同的代码库状态)。我的原始E
和F
在GitHub中保持不变。
我的计算机无论如何都在后台运行git fetch
所以我现在让我的计算机上的GitHub提交E
到I
,而GitKraken则告诉我现在我是如何做到的。提交D
之后发生分歧的侧枝:
Local computer git repo:
*---*---*---*---*---* (master)
A B C D E' F'
\
\-o---o---o---o---o (remote-master)
E F G H I
我该如何解决这个问题? (因为Git-SVN注释提交实际上是不可变的)。
我认为我想做的是在G
之后重新F'
,因此请忽略E
和F
,然后运行git svn dcommit
,然后执行{ {1}}回到GitHub。
...问题是,我不知道如何重新表达git push -f
- 我正在查看像G
这样的命令,但这似乎不是什么我之后,GitKraken不会让我cherrypick
(它不是rebase
分支中任何内容的菜单选项。
答案 0 :(得分:0)
您可以使用命令行吗?
git rebase F I --onto master
即。 rebase从F之后(不包括)F提交到(包括)我到主人。
答案 1 :(得分:0)
有多种方法应该没问题。
git cherry-pick master..remote-master
将挑选remote-master
但不在master
以及E
和F
中的所有提交,并引入与E'
和{F'
相同的更改{1}},提交将为空,您可以跳过它们
你当然也可以直接做
git cherry-pick F..remote-master
git rebase master remote-master
也应该有效。它会尝试将remote-master
但不在master
中的所有提交应用到master
。由于更改已在该分支中,因此应自动跳过不更改任何内容E'
和F'
的提交。
或者你也可以做
git rebase --onto master F remote-master
git pull --rebase
也应该像git rebase master remote-master
一样工作。
由于您总是需要重写的线性历史记录来干净地与SVN存储库对话,您应该更改配置,以便pull
自动执行rebase
而不是merge
。然后,当您同时在多个框上提交时,您也可以轻松地为dcommit
生成干净的历史记录。