2014-12-28 48 views
2

我很新使用Git。Git - 回到以前的提交,現在想寫在前面的提交

我正在處理一個存儲庫,我試圖重構代碼並失敗,所以我最終返回了主分支上的1次提交,而是在之前的位置工作。我現在已經做出了我想要保留的更改,並且不想與未來的提交合並。提前提交也已經存在於遠程存儲庫中。

什麼是解決方案,不會干擾我的本地和遠程存儲庫上的提交,同時保持我所做的更改和不合並?

這是一個澄清git日誌。 HEAD,主承諾是我只是試圖做的,但不會讓我。起源/主是一個是分支的末端,並在Github上(我認爲)

* bb1d222 (HEAD, master) 
| * 832e8af (origin/master) 
|/ 
* 3293d35 
+0

使用git -push命令和git -add 命令 –

+0

@fadfad只要是明確的:不承諾'832e8af'對應到你重構代碼失敗的嘗試?此外,您是否是回購的唯一貢獻者? – Jubobs

+0

@Jubobs是和是。 – fadfad

回答

1

根據您的問題和後續的評論,我的理解是,你的回購的(近期的)歷史如下所示,

* bb1d222 (HEAD, master) 
| * 832e8af (origin/master) 
|/ 
* 3293d35 

這裏提交832e8af在重構的對應於你的失敗嘗試碼。

根據該

  1. 你是唯一的貢獻者的GitHub庫的假設;
  2. 其他人從未克隆過GitHub存儲庫(有a way to find out,無論是這種情況);和
  3. ,你會很高興假裝承諾832e8af永遠存在,你想在下列情況下降落

    * bb1d222 (HEAD, master, origin/master) 
    | 
    * 3293d35 
    

然後(只有這樣),你可以簡單地做一個力推

git push --force origin master 

要知道,一個力推被普遍認爲是,像crossing the streams。確保這真的是你想要做的;這樣的操作很難扭轉,並有可能導致你的貢獻者(如果有的話)。

在大多數情況下,最好是恢復有問題的提交(使用git revert),因爲這與強制推送相反,不會刪除歷史記錄,也不需要非快速推送。

0

您有幾種選擇:

  1. 您可以創建一個separate local branch and commit your changes to that local branch only。我更喜歡這種方法,因爲這樣您的更改就可以安全地保存到該分支中(除非您的機器死亡或您刪除了分支)。

  2. 使用git stash保存更改(您的差異可以這麼說)。

+0

最好,我希望它留在發生問題的主分支上。 – fadfad

+0

我不確定我瞭解你的情況。主分支的遠程版本位於提交3處。您的本地版本的master分支位於commit 2,並且您希望將新的更改保存在提交2的master分支的本地版本中?你想完全放棄遠程主分支上的提交3嗎?如果*不*您將需要解決合併衝突。 – Aiias

1

1)在您的本地主設備上,執行git reset HEAD~1,然後執行git stash。這會將您在bb1d222中所做的更改存入存儲中。

2)硬重置您的本地master分支原產/主(git reset --hard origin/master

3)在主,執行git revert 832e8af,這將引入一個新的承諾,將取消你在832e8af所做的更改。

4)git stash pop您在bb1d222中對主設備進行的更改並提交它們。

這些步驟會產生這種承諾圖形,並不會改寫歷史

* (Commit introducing changes in bb1d222) | * (Commit reverting changes made in 832e8af | * 832e8af | * 3293d35