Git command之回退篇
欲練回退 必先了解:HEAD、index、WorkingCopy
HEAD: 對應local repository,指當前所在的分支版本頂端的別名,也就是最新的一次commit. git commit 之后與HEAD一致
index: 對應staging area,指git add 之后放入該區域
WorkingCopy: 對應working directory,指當前文件包括修改等操作所在區域,沒有 git add 和 git commit 操作
git reset HEAD --file (回退單個文件版本)
可與git checkout --file(撤銷單個文件修改)配合
git reset HEAD --file:【回退版本】回退暫存區里的某個文件,還原為HEAD commit里該文件的狀態,撤銷從上一次commit之后所有的操作。或者說是從HEAD commit里重新拉到暫存區覆蓋當前的(被add亂掉的)文件。但是working copy里沒有任何變化。此時如果想丟掉working copy里的修改,執行git checkout --file.
git checkout --file:【撤銷修改】是以最新的存儲時間節點(add和commit)為參照,覆蓋工作區對應文件file:
①如果上次commit之后沒有將任何修改add到暫存區,則HEAD和暫存區是一致的,執行命令后也會將工作區同化為一致,看起來像是從HEAD版本庫重拉了一遍到工作區。
②但如果上次commit之后往暫存區add了修改,那么工作區只能跟暫存區一致了,也就是從暫存區拉下來覆蓋到工作區。
git reset --hard HEAD
影響同下面介紹的<git reset --hard 目標版本號>,只是HEAD位置看起來沒有變化。小技巧:上個版本用HEAD或者HEAD~1,上上個版本HEAD^或者HEAD2,上100個版本HEAD100
git reset --hard 目標版本號
版本號指:commit生成的hash碼,可用 git log 命令查看
該命令修改HEAD的位置,即將HEAD指向的位置改變為之前存在的某個版本,最后需要用 git push -f 強推到遠端
--hard參數將會blow out everything.它將重置HEAD返回到另外一個commit,重置index以便反映HEAD的變化,並且重置working copy也使得其完全匹配起來。
這是一個比較危險的動作,具有破壞性,數據因此可能會丟失!如果真是發生了數據丟失又希望找回來,那么只有使用:[git reflog](http://blog.csdn.net/ibingow/article/details/7541402)命令了。
git reset --soft 目標版本號
--soft參數Git重置HEAD到另外一個commit,HEAD位置改變,但index,working copy都不會做任何變化,所有的在original HEAD和你重置到的那個commit之間的所有變更集都放在stage(index)區域中。
git reset --mixed 目標版本號
--mixed是reset的默認參數,也就是當你不指定任何參數時的參數。它將重置HEAD到另外一個commit,並且重置index以便和HEAD相匹配,但working copy不會被更改。所有該branch上從original HEAD(commit)到你重置到的那個commit之間的所有變更(未git add的操作)將作為local modifications保存在working area中,你可以接着coding,之后再進行git add, git commit.
總結:--hard --mixed(default) --soft 分別覆蓋3個、2個、1個位置的代碼,--mixed(默認的參數)只會保留working copy里的代碼
git revert -n 目標版本號
- 與git reset不同的是,復制了一個目標版本(某個想要回退到的歷史版本)加在當前分支的最前端。而git reset是HEAD指針跳到目標版本,但將跳過的版本丟棄掉了。(git log已經看不到,但git rflog還是可以看到的)
- use 'git commit -m "the name of the new release" ' to commit
- use 'git push' to push
git commit --amend
- 改寫commit,包括改寫提交的文件和追加文件到提交中。
- 還可以對這種改寫回退,用git reflog得到相應的版本號,然后git reset --soft HEAD@{xxx}