2014-10-29 98 views
1

我一直試圖刪除2個額外的提交開始我的回購 - 但是當我認爲我成功了,我推到github上的空回購和網絡圖顯示沒有變化。Git rebase刪除額外的初始提交

它是怎麼發生的:我的朋友推了一個初始提交 - 一個10兆圖書館。我告訴他我們會重新開始,所以我沒有拉,我做了一個新的初始提交和推動。我告訴他刪除他的git文件夾,但他只刪除文件夾中的所有文件,不包括.git文件夾。當他拉下來時,他做出了合併承諾,而且我沒有注意到一段時間。

現在我們的git的歷史的開始是這樣的:

enter image description here

藍色位是我的第二初始提交。當他合併時,他用我的承諾簡單地覆蓋了一切。在這一點上,我嘗試回到我在一個新分支中的初始提交,並確保我不「選擇」他的初始提交,但是當我推入一個空的回購時,他的額外初始提交再次出現。我也嘗試回到最初的提交標籤爲2,並且從標籤爲4的跳轉(跳過另一個初始提交1和合並提交3)開始,每次提交(櫻桃選擇)。由於1和3都在rebase結束後仍然被推到一個空的repo,所以這兩者都不起作用。有沒有辦法刪除1和3?因爲3簡單地拋棄了所有的1,我認爲它應該能夠。

我所用的底墊的命令是

git checkout -b tmpfix

git rebase --root -i

git branch -b tmpfix <sha1>

git cherry-pick <sha1>

回答

0

我找到了自己的解決方案。單調乏味,但值得回購的98%減少。我會盡量使這個儘可能清楚 - AFAIK這隻適用於從初始提交重寫整個git歷史記錄。

Messed up git history

  • 比方說,主要回購是在〜/回購
  • 創建〜/ newRepo一個新的回購協議(mkdir ~/newRepocd ~/newRepogit init
  • 主要回購的遠程加入newRepo(git remote add original [email protected]:...
  • 找到您想要開始的提交。由於我的初始提交是不正確的,我開始提交我想成爲我的初始提交(在我的映像中標記爲2,我認爲你可能必須從你的初始提交開始,如果你的初始提交有歷史記錄,必須壓扁它。)
  • 原來的遠程讀取到新的回購協議(git fetch original
  • 開始採摘櫻桃,從最初的承諾(git cherry-pick xxxxxxx單個提交或git cherry-pick xxxxxxx^..xxxxxxx的範圍內,包括端點)
  • 一旦你完成你的主分支,轉到任何來自主分支的分支
  • 找到其他分支分支的提交(其他分支和主分支之間的最後一個共享提交),散列會在cherry拾取後在newRepo中有所不同,所以double檢查它,否則你會在意外事故中收回整個舊的歷史記錄
  • 跳轉到提交使用git checkout xxxxxxx
  • 當你跳,git應該給你一個命令(git checkout -b branch-name)保存一個新的分支。確保與您所在分支完全匹配。
  • 現在開始再次櫻桃採摘,從第一個獨特的承諾分支

一旦你完成主機和所有連接的分支,一個力推應該重寫歷史。

我還沒有找到一種方法來保存它分支和合並的歷史記錄 - 它最終成爲我的一個連續行,但任何未合併的分支仍然會顯示爲這樣。