我有一個Rails應用程序,我在20次提交之前進行了一些遷移,然後最終不需要創建表。我把這些變化推到github上,所以模式和遷移都在我的git歷史中,但沒有人克隆或使用我的分支。我想知道是否有一種方法可以讓git恢復到該提交,並且只是刪除了提交的遷移方面?Git恢復大型提交的某些部分
回答
你首先必須「恢復」的承諾,你不想要的,不是再次推到GitHub上去除從你的在線歷史記錄。
讓我們看看如何:
STEP 1
要恢復一些承諾,您可以運行在以下任一方式git rebase
。
一)如果你知道的的SHA1承諾要恢復到(注意是「^」結尾):
git rebase -i SHA1^
,或者
b)如果你知道這是20提交前:
git rebase -i HEAD~21
這樣做,Git會打開vim。
STEP2
現在,你會看到你犯了short SHA-1
和提交信息的列表。 刪除所有不需要的部分(空白行和註釋 - 以「#」開頭 - 將被忽略),每行dd
或d20d
如果要從當前行開始刪除20行。保存並退出(使用:wq
)。 Git將刪除您剛刪除的所有提交。
重要:如果保存的文件爲空或只有空白行和/或註釋,Git會中止操作。
STEP 3
更新您的GitHub庫這些變化。要做到這一點,你必須強制推:
git push --force origin/master
我假設你跟蹤的GitHub庫爲原點,你就在你的主分支上工作。 否則將其替換爲您的配置。
END 您從本地和GitHub中刪除了這些不需要的提交。
我會跑衍合
git rebase -i <commit>^
然後更改pick
到edit
這裏有一個解決方案: 像史蒂芬說,互動變基是一個好去。
$ 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
- 1. git恢復到某個提交
- 2. 恢復git提交
- 3. Git:恢復舊的提交
- 4. git恢復已提交的提交
- 5. 恢復(沒有分支)git提交
- 6. Git恢復本地提交
- 7. GIT:恢復上次提交?
- 8. 使用git恢復提交的一部分
- 9. 恢復SVN中的一部分提交
- 10. 如何恢復部分提交?
- 11. Git重複以前提交的部分
- 12. 恢復git中的多次提交
- 13. Git - 恢復丟失的提交
- 14. 恢復git中的一系列提交
- 15. 恢復Git中的幾個提交
- 16. 在Git中,如何恢復提交之前恢復的分級文件?
- 17. git:從提交恢復文件
- 18. 恢復Git倉庫/提交等
- 19. 如何恢復本地提交git
- 20. Git + Intellij - 如何恢復本地提交?
- 21. 如何恢復從git提交更改?
- 22. Git如何恢復舊提交
- 23. 從多個git rebases恢復「舊提交」
- 24. Git合併主無需恢復提交
- 25. 恢復丟失遠程git提交
- 26. 如何恢復初始git提交?
- 27. 如何在git中恢復提交?
- 28. Git恢復合併提交,丟失了一些文件
- 29. 恢復到最後一次提交的git的分支
- 30. Git根據它恢復一個其他提交的提交
謝謝,你知道編輯特定提交的語法嗎? – BC00
@ BC00我不明白這個問題。在您改變選擇編輯之後,它將允許您編輯並重新提交。 –
如何更改選擇編輯 – BC00