## 參考資料:
* [git reset官方API](https://git-scm.com/docs/git-reset)
## 實踐總結:
* git reset 和 git revert 的區別:
> 1. git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
> 2. 在回滾這一操作上看,效果差不多。但是在日后繼續merge以前的老版本時有區別。因為git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時,導致這部分改變不會再次出現,但是git reset是直接把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
> 3. git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
* 此處應該有圖:
* 
* 
* git reset 的3種方式:
* 1.git reset -–mixed:此為默認方式,不帶任何參數的git reset,即是這種方式;它回退到某個版本,只保留源碼,回退commit和index信息;
* 假設提交節點為A-B-C-D(且A-B-C-D均提交到遠程分支了), 從D回退到A則B、C提交的代碼會出現在**工作區**, 另外本地分支也會落后遠程分支兩個節點(`git pull`指令更新代碼會顯示本地工作區改動跟遠程代碼會有沖突, 先執行`git add -A`在執行`git pull`也能將代碼與遠程分支一致);
* 圖解(HEAD為**本地倉庫**、INDEX為**暫存區**、WORKING為**工作區**):

* 2.git reset –-soft:回退到某個版本,只回退了commit的信息,不恢復index信息。如果還要提交,直接commit即可;
* 假設提交節點為A-B-C-D(且A-B-C-D均提交到遠程分支了), 從D回退到A則B、C提交的代碼會出現在**工作區**跟**暫存區**,另外本地分支也會落后遠程分支兩個節點(`git pull`指令更新代碼會將代碼與遠程分支一致);
* 圖解(HEAD為**本地倉庫**、INDEX為**暫存區**、WORKING為**工作區**):

* 3.git reset –-hard:徹底回退到某個版本,本地的源碼也會變為上一個版本的內容;(最常用)
* 假設提交節點為A-B-C-D(且A-B-C-D均提交到遠程分支了), 從D回退到A則B、C提交的代碼會消失掉,另外本地分支也會落后遠程分支兩個節點(`git pull`指令更新代碼會將代碼與遠程分支一致);
* 圖解(HEAD為**本地倉庫**、INDEX為**暫存區**、WORKING為**工作區**):

## 實踐場景:
* 場景:代碼已 commit 到本地倉庫,需要處理掉該commit, 且讓改動 的文件出現在 **工作區** 指令: `git reset --mixed origin/master` ;
* PS: 如想讓改動的文件出現在暫存區,指令:`git reset --soft origin/master`;
* PS2: 如想讓改動的文件完全消失(慎操作), 指令:`git reset --hard origin/master`;
* 場景2: 代碼本想提交到B分支, 不小心操作, 將代碼提交到A分支了,還沒提交到A遠程分支的情況下怎么遷移代碼到B分支?
* `git checkout A` 切換到A分支,如果當前已在A分支忽略此指令;
* `git log` 查看A分支提交記錄, 拷貝上次的提交ID(d362816);
* `git reset --soft d362816` d362816 為 commitId;
* `git stash save "暫存改動代碼"` 將代碼放在**工作現場**;
* `git checkout B` 切換到B分支;
* `git stash pop` 將改動代碼從**工作現場**取出;
* `git add -A` + `git commit -m "提交改動"` 將改動代碼提交到B分支;
## git reset 常用指令:
* git reset HEAD a.txt
* 將**本地倉庫**的 a.txt 覆蓋**暫存區的**a.txt(注意本地工作區間的a.txt不會變化);
* git reset HEAD .
* 將**本地倉庫**的所有文件(當前目錄以及子目錄)覆蓋**暫存區的**所有文件(注意本地工作區間的文件不會變化);
* git reset --hard HEAD^
* 本地工作區間代碼回到上一次版本;
* git reset --hard HEAD^^
* 本地工作區間代碼回到上上次版本;
* git reset --hard HEAD~10
* 本地區間代碼回到前10個的版本;
* git reset --hard d362816
* 本地區間代碼回退到指定版本(d362816 為commit id, 可通過[git log](https://github.com/wteam-xq/testGit/blob/master/learn_log/git_clone.md) 查到)
* git reset --hard origin/master
* 本地工作區間代碼回退到遠程版本(master為分支名).
## 相關指令:
* [git checkout](http://www.hmoore.net/wteamxq/git_rank/276599) 切換分支、切換文件指令: 我也可以回退代碼哦。
* [git log](http://www.hmoore.net/wteamxq/git_rank/276601) 查看commit日志指令: `git reset`好基友!