git commit –c head –a --amend
-c表示複用指定送出的送出留言,這個例子中是head,實際上可以指定其他有效的送出名稱。
如果參數是小寫的-c,就會打開預先設定好的編輯器,以便在已有的送出留言基礎上編輯修改。
增補送出隻能針對最後一個送出,如果想更正好幾個送出之前的某個錯誤,則須使用git revert這個指令。
反轉已經送出的改動,使用git revert指令,此指令通過在版本庫中建立一個“反向的”新送出來抵消原來送出的改動。
通常git會立即送出反轉結果,但是也可以通過參數-n告訴git先不要送出,這用于反轉多個送出非常有用,運作多個git revert –n指令,git會暫存所有的變更,然後做一次性送出。
做反轉操作的時候必須提供送出名稱,反轉總是按照從新到舊點的倒序來操作的,即最後的送出最先反轉,這樣可以避免一些不必要的沖突。
指令git reset可以在複位版本庫後,暫存工作目錄樹中因複位産生的與版本庫的差異,以便送出。
git reset --soft 該指令撤消上一個commit,但保留add的檔案,使得git暫存所有的因複位帶來的差異,但不送出它。
之後,使用者可以修改這些内容再送出,或者幹脆扔掉這些内容。
選項--hard要小心使用,該選項會從版本庫和工作目錄樹中同時删除送出,--hard就好像版本庫中的删除鍵,并且不可恢複。
git reset是以送出名稱作為參數的,預設值是head,可以用^和~作為送出名稱的修飾符來指定某個版本。
head^是指把版本庫複位到目前head之前的那個節點上,把head這個版本的修改扔到工作目錄樹中,
540ecb7~3是指要複位到540ecb7之前的三個節點上,即把該送出和之前的兩個送出(共三個送出)扔到工作目錄樹中。
git reset --hard head^ 強制複位前一個送出。
git reset head可以用來清除已經add到緩存區但是不想進一步送出的内容。
另一種方式是用git rm --cached,選項--cached表明是清除緩存區,然後不動工作目錄樹。
注意git checkout filename将會删除該檔案中所有沒有暫存和送出的改動,這個操作是不可逆的。
先使用git log 檢視 commit日志
1
2
3
4
5
6
7
8
<code>commit </code><code>422bc088a7d6c5429f1d0760d008d86c505f4abe</code>
<code>author: test <[email protected]></code>
<code>date: tue sep </code><code>4</code> <code>18</code><code>:</code><code>19</code><code>:</code><code>23</code> <code>2015</code> <code>+</code><code>0800</code>
<code>注釋</code><code>-</code><code>本次為錯誤送出</code>
<code>commit </code><code>8da0fd772c3acabd6e21e85287bdcfcfe8e74c85</code>
<code>merge: </code><code>461ac36</code> <code>0283074</code>
<code>date: tue sep </code><code>4</code> <code>18</code><code>:</code><code>16</code><code>:</code><code>09</code> <code>2015</code> <code>+</code><code>0800</code>
找到需要回退的那次commit的 哈希值,使用下面的指令進行回退:
git reset --hard commit_id
注意--hard可以把已經add的檔案也删掉,謹慎使用。