2016-05-11 39 views
1

我有2個提交(本地)和我的歷史是:一個 - B再回到持續軟復位後提交和修改

  • 在提交A,文件myfile_v1.txt
  • 在提交B中,有多個其他文件。
  • 在我的工作目錄,我更新的文件先用小校正提交:myfile_v2.txt

我想修改提交A和更換新形式的文件,以在推動任何事情之前都有清晰的歷史

我這樣做:

  • reset --soft上一個
  • addmyfile_v2.txt
  • commit --amend

現在我可以看到我犯中有修正文件,但我無法弄清楚如何在我以前的HEAD中返回,也不知道如果沒有再次提交B,這是可能的。

任何想法?

回答

1

提交散列包含此提交的完整歷史記錄。所以如果你改變歷史,歷史不再屬於那個提交,但是提交必須被重新創建。

有很多方法可以做到這一點。在你的情況下,你可以只是cherry-pickB,一切都很好。

我如何做到這一點是一個互動的重組(rebase -i)。要麼首先進行交互式重新分配,將A節更改爲edit,然後進行提交修改並繼續重新分配。或者,也可以先在B之上創建一個新提交,然後使用rebase -i重新排序,然後使用squashfixup進行第二次提交。甚至使用自動修復或自動壁球。

+0

謝謝!我不知道「櫻桃挑選」的命令,非常有用!我下次試試你的其他解決方案。 – Ellda

1

您不能修改以前的提交。每個提交都是唯一的。

你可以做的是用新的提交重新創建歷史記錄。使用命令git-rebase

我明白,你是在現在這個點:

Pre_A - A - B 
     \ 
     A1 

你已經失去了你「B」提交。要恢復提交使用git-reflog

git reflog 

你會看到分支HEAD的最新位置。其中之一是B承諾。記下行首的哈希。例如:

git reflog 
    a123b Ammend Commit of Previous A that generates A1 commit 
    b234c git reset soft to A Commit 
    c345d B Commit 
    b234c A Commit ##Look that the HASH is the same that the git-reset## 

一旦您擁有B提交的HASH,創建一個分支來恢復提交。

git branch tmpBranch c345d 

在這一點上,你需要的是把這個承諾在「A1」,而不是在「A」是新的歷史。你得到這個使用git-rebase

我假設你在你的主分支工作。

git checkout tmpBranch 
git rebase --onto master tmpBranch~1 tmpBranch 

這重新創建一個歷史提交落後tmpBranch的承諾,直到tmpBranch承諾(在你的情況下,只有一個承諾,在B犯)在主(即點至A1提交)。

+0

這是一個很長的路要走。 Upvoted推薦使用reflog,並指向一個臨時分支的提交通常是一個有用的技巧,所以這對恢復大量的提交會更好。儘管只有一次提交,簡單的櫻桃選擇會更容易。 – torek

+0

我用櫻桃挑選解決了它,但感謝您提供有用的信息! – Ellda

+0

你說得對。這種情況比我的櫻桃挑選解決方案更簡單。我專注於'git-reflog'部分,因爲我明白它已經「丟失」了B提交。 – blashser