2017-07-12 59 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

相關問題