星期日, 10月 09, 2011

git還原 - revert, reset, checkout


  • 回復至最近一次commit(所有檔案)
    $ git reset --hard HEAD
  • 還原修改過的單一檔案
    有以下不同的方法
    //以下從staging取出
    $ git checkout hello.txt    //1
    $ git checkout -- hello.txt //2
    $ git checkout -f hello.txt //3
    
    //以下從HEAD最新版取出
    $ git checkout HEAD hello.txt //4
    

    ex. 假設HEAD的hello.txt 如果為hello
    $ echo 'hi' > hello.txt  //這時三者皆相同
    $ git add . //放到staging,這時1,2,3取到staging(hi),4取到hello
    
    感謝Charlie Lee的訂正,本以為-f也會取到hello
    話說不知道當初為何要看-f參數,這參數是用在"強制換"branch時,不理會當下修改的檔案,跟"還原"檔案沒什麼關係 XD
    可能當初還不太懂,看著人家寫就照抄
  • Staging(git add)後,要退回unstage
    $ git reset HEAD file
  • 回復特定版本
    雖說是回復,但其實是將指定的版本新增為最新的commit
    $ git revert commit_name
    不過通常回復到舊版本,是要繼續往下開發
    所以勢必得再一次commit
    所以如果只是要回復且不要commit 可以加 -n or --no-commit
    $ git revert -n commit_name
    如果要修改的話 得commit或放棄,否則沒辦法回復
    • fatal: Commit 137ea95 is a merge but no -m option was given.
      因為該commit為merge(兩個branches合併,所以得指定要回復的branch (-m or --mainline option) 搭配數字 1 or 2 指定第幾個commit
  • 從commit裡,指定checkout檔案
    格式:git checkout SHA /file/to/path
    $ git checkout 35216 controller/ui.php
  • 從branch裡,指定checkout檔案
    格式:git checkout <branch_name> <paths> #會在相同的資料夾找
    格式:git checkout <branch_name> -- <paths>
    $ git checkout branch_b test.php  //從branch_b取出test.php
  • 改變最後一次的 Commit的訊息
    git commit --amend (改git log的內容)
References

2 則留言:

Unknown 提到...

$ git checkout hello.txt
$ git checkout -- hello.txt
$ git checkout -f hello.txt
以上三種從staging取出

$ git checkout HEAD hello.txt
這個會從最後版本取出

git version 1.8.3.msysgit.0
我的git版本

fishjerky 提到...

不確定是否版本不同而不一樣
上次確實遇到有版本不同的問題~
我就先註記一下