2017-10-18 184 views
0

這是我的要求: 我有a -> b -> c (HEAD)。 我正在添加一個新的提交d。現在,它變成a -> b -> c -> d(HEAD)git恢復/存儲更改不失其歷史記錄

現在,我想恢復到c(即,撤消在d中所做的所有更改)並進行額外更改並形成e。樹應該看起來像a -> b-> c -> d -> e(HEAD)。注:我不能失去d的歷史。我必須回覆它並將新更改添加到e

更新: 我可以用一個更好的例子來解釋。假設我有a->b->c(HEAD),這裏c是主要或主要提交。 我試圖用腳本自動化。

第一步:我開始git checkout <SHA1 of c>,樹是這個樣子:a->b->c(DETACHED HEAD)

我真正的查詢就從這裏開始:

  1. 修改幾個文件(我不加任何新文件)並添加一個新的提交d。所以樹應該是這樣的:a->b->c->d(HEAD)
  2. 運行第一步修改其他文件(再次,我不添加任何新的文件)恢復在#1改變,並添加一個新的提交e。所以樹應該像這樣:a->b->c->d->e(HEAD)

注:提交d +新變化c這裏e =恢復。我不能盲目地使用git revert HEAD,因爲c被認爲是主要承諾。我想我可以使用git stashgit stash pop刪除舊的更改並插入新的更改。我可以做類似git checkout stash的事嗎?

簡而言之:我試圖模糊測試提交c爲50倍左右(即)提交,並恢復爲50倍

+0

那麼當你做'git恢復HEAD'時會發生什麼? – Makoto

+0

@Makoto:它('git revert HEAD ^')將'c'中的更改恢復爲新的提交。他希望'git恢復HEAD' –

+0

@ChrisDodd:公平點。我通常會把這些混在一起。在我的防守中,我並不經常使用「恢復」...... – Makoto

回答

0

什麼

首先承諾d所做的更改

$ git commit -d "Your message" 

然後在c上創建新分支並簽出類似於

$ git checkout -b e c 
+0

看起來像這樣會工作。但它會導致處理很多分支機構。我用一個例子更新了這個問題 – dinesh2707

+0

其他選項將是'git -stash'而不是提交它會注意到: - 這將創建一堆更改意味着它將保留歷史記錄,但不能直接在可以獲取的歷史記錄之間切換在歷史上一個一個'藏匿流行' – jitender

3

git revert命令完全按照您的描述進行描述 - 它會在當前分支的頂部創建一個新的變更,以逆轉某些以前的變更。在你的情況

git revert HEAD 

將上HEAD頂部創建一個新的變化(你e),其反轉什麼的HEADd

+0

這將創建一個提交,撤消變化。我需要在提交'e'中添加新的更改。也就是說,'e'有了新的改變+回覆的代碼 – dinesh2707

+0

如果你需要添加更改提交,使用'git commit --amend'。如果您需要將最後兩個提交合併成一個提交,請使用'git rebase -i HEAD〜2' –

0

改變。如果你想要把更多的更改復歸承諾以及,use -n flag in revert command

git revert -n HEAD 

這將恢復在HEAD的變化,但不會創建一個提交,這樣你就可以讓你的其他更改,當你完成提交。

相關問題