2013年9月29日 星期日

Git 初學 3 - reset

用 git 好像避免不了,有時會把檔案弄亂。以前用 SVN 時好像只能重新 checkout。(也有可能有我不知道的方法?)但強大的 git 應該有辦法不需要這麼做,雖然它重新 clone 也很快。

最後我就找到了這篇:
Git 版本控制:利用 git reset 恢復檔案、暫存狀態、commit 訊息


原文寫的蠻清楚的,下面簡單整理一下。

reset 通常會用在幾個狀況:

  1. 取消已經暫存的檔案
  2. 恢復 Commit,重新提交 Commit
  3. 強制恢復到上一版本

一、取消已經暫存的檔案

如果在 add 時不小心把不想 commit 的檔案加入了,我們用 git status 應該會看到類似的畫面

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   Makefile
#       modified:   user/easy_setup/easysetup.h
#
其實畫面中就有提示  (use "git reset HEAD <file>..." to unstage) ,可以用 reset 來將某個檔案 unstage。
所以我們使用
git reset HEAD user/easy_setup/easysetup.h
之後會看到 『user/easy_setup/easysetup.h: locally modified』此訊息,這時候在用 git status 看狀態

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   Makefile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   user/easy_setup/easysetup.h
#
就會發現 user/easy_setup/easysetup.h 已經變成 unstage 了。

二、恢復 Commit,重新提交 Commit

假如今天您修改了檔案,並且已經執行了 git commit -m “first commit”,發現訊息寫錯想要修改,可以透過 reset 方式來做,請先用 git log 方式查看訊息.
git log --stat
commit c13eb41110a38ef7145bb8815560641697800659
Author: appleboy <appleboy.tw at gmail.com>
Date:   Fri Aug 20 20:02:55 2010 +0800
    first commit
 Makefile                    |   10 ++-
 user/easy_setup/easysetup.h |  157 ++++++++++++++++++++-----------------------
 2 files changed, 79 insertions(+), 88 deletions(-)
第一種
git reset --soft HEAD^
下完此指令,檔案狀態會回到 "Changes to be committed"
說明可以參考:man page: git reset

第二種
git commit -a -c ORIG_HEAD
git 會跳出剛剛的 first commit 讓您來修改,或者是自己用 git commit -m “XXXXXXX” 這樣也可以。說明:man page: git commit


三、強制恢復到上一版本

上面是介紹恢復 commit 訊息,之前修改過的檔案還會存在,底下會使用 reset hard 的方式恢復到上一版本,上一版本跟此版本之間所修改的檔案,將不會存檔,git reset 參數之一 –hard
git reset --hard HEAD~3
這指令意思是說,最後三個版本 (HEAD, HEAD^, and HEAD~2) 都不是您想要修改的,你也不想給其他人看見這三個版本資訊,中間的版本將會失去,使用時請小心。

沒有留言:

張貼留言