2017-07-12 34 views
0

我的方案有:我之前做了一个git svn dcommit - 如何修复我的回购?

  • 我的本地机器的git回购
  • 在GitHub上的远程
  • 一个SVN服务器的局域网

的SVN服务器上仍然是规范的,但保持与GitHub回购相当。其他用户只使用SVN,而我是唯一的git + SVN用户(这简化了事情)。

当我在其他计算机上工作时(例如,我的笔记本电脑,在家,在国外时),我使用git,并使用Gi​​tHub回购推/拉我的提交。直到我在办公室时,我的提交才会被放入SVN。

当我在办公室我我会做一个git pull带来-在从GitHub任何新的提交,然后做git svn dcommit,随后git push -f回到GitHub上,因此新SVN标注的承诺成为佳能在GitHub和匹配SVN完美。

但是,今天我的办公室计算机上有一些悬而未决的提交 - 但我也有非提交的提交 - 我不知道如何解决它。

上午9:00今天上午,在运行任何命令anyhere之前,我的回购协议是这样的:

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,这些提交还没有到SVN的dcommit'd。

今天早上我犯了一个错误,我立即在本地计算机上运行git svn dcommit,没有先运行git pull。运行git svn dcommit造成回购进入这种状态:

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的我的电脑上提交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注释的提交实际上是不可变的)。

我想我想要做的就是重新设置父级GF'等忽略EF,然后运行git svn dcommit,然后做一个git push -f回到GitHub上。

...问题是,我不知道如何重置G - 我正在查看类似cherrypick的命令,但这似乎不是我所追求的,而GitKraken不会让我rebase(它不是一个菜单任何在remote-master分支中的任何选项)。

回答

0

你可以使用命令行吗?

git rebase F I --onto master 

I.e.从(不包括)F到(包括)I到主人的承诺。

0

有多种方式应该没问题。

git cherry-pick master..remote-master 

意志樱桃采摘是在remote-master所有提交但不是在masterEF介绍了同样的变化E'F',该提交将是空的,你可以跳过它们。
当然,你可以也直接做

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