拉出之前我做了一个git svn dcommit - 如何修复我的回购?

时间:2017-07-12 22:26:18

标签: git svn git-svn

我的方案有:

  • 我的本地机器git repo
  • GitHub上的遥控器
  • LAN上的SVN服务器

SVN服务器仍然是规范的,但与GitHub存储库保持一致。其他用户专门使用SVN,我是唯一的git + SVN用户(简化了事情)。

当我在其他计算机上工作时(例如我的笔记本电脑,家里,国外)我使用git并使用Gi​​tHub仓库推送/提取我的提交。在我办公室工作之前,我的提交不会进入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

说明:我有两个提交,EF在我当地的计算机仓库中,之前是从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'

请注意,EF现在是E'F',因为它们已被git svn修改为SVN注释提交(因此它有一个不同的提交哈希,即使它代表相同的代码库状态)。我的原始EF在GitHub中保持不变。

我的计算机无论如何都在后台运行git fetch所以我现在让我的计算机上的GitHub提交EI,而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',因此请忽略EF,然后运行git svn dcommit,然后执行{ {1}}回到GitHub。

...问题是,我不知道如何重新表达git push -f - 我正在查看像G这样的命令,但这似乎不是什么我之后,GitKraken不会让我cherrypick(它不是rebase分支中任何内容的菜单选项。

2 个答案:

答案 0 :(得分:0)

您可以使用命令行吗?

git rebase F I --onto master

即。 rebase从F之后(不包括)F提交到(包括)我到主人。

答案 1 :(得分:0)

有多种方法应该没问题。

git cherry-pick master..remote-master

将挑选remote-master但不在master以及EF中的所有提交,并引入与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生成干净的历史记录。