2014-04-28 44 views
0

我有一個Rails應用程序,我在20次提交之前進行了一些遷移,然後最終不需要創建表。我把這些變化推到github上,所以模式和遷移都在我的git歷史中,但沒有人克隆或使用我的分支。我想知道是否有一種方法可以讓git恢復到該提交,並且只是刪除了提交的遷移方面?Git恢復大型提交的某些部分

回答

3

你首先必須「恢復」的承諾,你不想要的,不是再次推到GitHub上去除從你的在線歷史記錄。

讓我們看看如何:

STEP 1

要恢復一些承諾,您可以運行在以下任一方式git rebase

一)如果你知道的的SHA1承諾要恢復到(注意是「^」結尾):

git rebase -i SHA1^ 

,或者

b)如果你知道這是20提交前:

git rebase -i HEAD~21 

這樣做,Git會打開vim。

STEP2

現在,你會看到你犯了short SHA-1和提交信息的列表。 刪除所有不需要的部分(空白行和註釋 - 以「#」開頭 - 將被忽略),每行ddd20d如果要從當前行開始刪除20行。保存並退出(使用:wq)。 Git將刪除您剛刪除的所有提交。

重要:如果保存的文件爲空或只有空白行和/或註釋,Git會中止操作。

STEP 3

更新您的GitHub庫這些變化。要做到這一點,你必須強制推:

git push --force origin/master 

我假設你跟蹤的GitHub庫爲原點,你就在你的主分支上工作。 否則將其替換爲您的配置。

END 您從本地和GitHub中刪除了這些不需要的提交。

0

我會跑衍合

git rebase -i <commit>^ 

然後更改pickedit

+0

謝謝,你知道編輯特定提交的語法嗎? – BC00

+0

@ BC00我不明白這個問題。在您改變選擇編輯之後,它將允許您編輯並重新提交。 –

+0

如何更改選擇編輯 – BC00

0

這裏有一個解決方案: 像史蒂芬說,互動變基是一個好去。

$ git rebase -i [the_commit_preceding_your_problematic_commit]

啓動此命令後,系統會提示您與中,你會看到所有提交從問題開始提交(頂部)的菜單編輯器。 每個提交前都有pick關鍵字。

要編輯提交,您必須替換選擇編輯e。 保存並離開編輯器時,在標有edit的提交中,您將處於分離的HEAD狀態。 (就好像你的時間旅行直到提交那天) 現在你必須重置提交。

$ git reset HEAD^

即你走慢一步。你會看到所有在你的交錯區域提交的文件,但還沒有在索引中。現在

$ git status

你可以刪除你想要的文件,添加另外一個和承諾。 你的提交將會像你想要的一樣。

Remenber你仍然處於分離HEAD狀態。爲了讓Git一切OK,你必須鍵入:

$ git rebase --continue

和Git帶你回真正的最後一次提交您所做。 但是,你重寫了你的git分支的所有歷史記錄。

爲了推動您的修改,您必須指定push命令的--force選項。

注意:雖然墊底,如果出現錯誤,做一個:

$ git rebase --abort