2012-04-09 64 views
6

我正在修改別人的(非git)代碼。我下載了原版,接着進行了修改,然後跳下了槍,並將修改後的版本作爲我的第一次提交。這是一個錯誤,我應該添加原始的下載代碼作爲我的第一次提交。(又一個)修改git歷史添加一個第一次提交

然後雪上加霜,我加入了原來的代碼作爲了我的第一個編輯的一個分支。在換句話說,它現在是一個很大的混亂:(

簡單來說,我有什麼模樣下方的藍色曲線C5是實際的原代碼,C1,C2,C6是我的逐步修改(C4是多餘的)。我寧願有綠色是我的歷史。

enter image description here

任何想法如何修改歷史記錄以完成此操作?

感謝許多,

狡猾

+0

我在C6以後開始切斷,但是任何未來的提交當然都應該按照原樣進行。 – sly 2012-04-09 23:49:23

+0

我在想,如果將每個提交恢復到它自己的文件夾,並且從頭開始用'init',然後以正確的順序複製每個版本和'commit',它是否會更清晰。這不是一個git解決方案,但它是一種解決方法,實際上可能會更快。 – 2012-04-09 23:52:50

+2

非常感謝Randolph。然而,我對git解決方案非常感興趣,以便了解它。 (也有一個在線 - 但未分享 - 鏡像,我想推動和完成) – sly 2012-04-09 23:53:42

回答

9

我在命令行完全做到了這一點,但我打算從SourceTree插入屏幕截圖來說明這是怎麼回事。

首先得到承諾從C5 ID(50da9c3)提交,並把在剪貼板或TextEdit或某事的前7或8位 - 你會需要它後來

確認一下,這是我們的初始狀態:

enter image description here

下面是步驟來得到你想要的:

創建一個新的無根分支開始動工建設承諾關閉指定基數

git symbolic-ref HEAD refs/heads/base 

現在從混帳刪除所有文件和目錄

git rm --cached -r . 

現在所有的文件都是「未跟蹤」從本地工作目錄中刪除

git clean -d --force 

現在創建什麼也沒有提交在其中(這將是其他所有內容的構建)。

git commit --allow-empty -m'Initial Commit' 

你的樹應該是現在這個樣子:

enter image description here

現在櫻桃挑C5提交(你對剪貼板什麼)

git cherry-pick 50da9c3 

enter image description here

現在將主分支重新根據基地分支

git rebase --onto base --root master 

enter image description here

現在你可以刪除基地和C4-C5分支

git branch -d base 

enter image description here

git branch -D c4-c5branch 

enter image description here

請記住'初始提交'是一個沒有文件的空提交,所以不要被愚弄。 C5提交實際上是第一個基於內容的提交。

+1

這是非常有用的。謝謝! – sly 2012-04-12 20:01:55

+0

很高興能夠幫助。 – 2012-04-12 21:11:41

+1

另外謝謝! – Benoit 2012-05-14 12:36:52