## 參考資料:
* [git checkout官方API](https://git-scm.com/docs/git-checkout)
* [git-修改撤銷-廖雪峰](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374831943254ee90db11b13d4ba9a73b9047f4fb968d000)
* [git checkout詳解](http://www.tuicool.com/articles/A3Mn6f)
## 實踐總結:
* `git checkout` 的使用可以很復雜(具體用法,請打開以上參考資料), 但日常生產中常用的有:
* 1.回退文件;(從暫存區、從本地倉庫)
* 2.切換分支(包括新建、切換);
## git checkout 常用指令:
* git checkout -- a.txt
* **暫存區** 中的 a.txt文件 覆蓋 工作區間的 a.txt,使用時注意路徑;
* git checkout -- .
* 將**暫存區**中的所有文件,覆蓋工作區間,當前的所有修改均會被覆蓋;(不存在 git checkout -- -A, git checkout -- *,其他類似指令參照 [git_add.md](https://github.com/wteam-xq/testGit/blob/master/learn_log/git_add.md) )
* git checkout head a.txt
* 將 **本地倉庫** 中的a.txt文件覆蓋 工作區間的 a.txt,使用時注意路徑;
* git checkout head .
* 將 **本地倉庫** 所有代碼覆蓋工作區間,當前的所有修改均會被覆蓋,謹慎使用;(不存在 git checkout head -A, git checkout head *,其他類似指令參照 [git_add.md](https://github.com/wteam-xq/testGit/blob/master/learn_log/git_add.md) )
* git checkout dev
* 切換到一個叫 “dev” 的分支;
* git checkout remotes/origin/master
* 將當前分支切換到遠程分支;
* git checkout -b dev
* 基于當前分支創建一個叫“dev”的分支,然后切換過去;如果創建的分支名已存在會報錯, 如參數換成`-B`則不會報錯, 因為會將原同名分支覆蓋掉(謹慎使用);
* git checkout -b newBranch origin newBranch
* 基于當前分支創建一名為`newBranch`的分支,并切換過去且關聯遠程同名分支;相當于`git checkout -b newBranch` + `git branch --set-upstream-to=origin/newBranch newBranch`
* git checkout --orphan dev
* 基于當前分支創建一個叫“dev”的分支,然后切換過去;假如你的某個分支上,積累了無數次的提交,你也懶得去打理,打印出的log也讓你無力吐槽,那么這個命令將是你的神器,它會基于當前所在分支新建一個赤裸裸的分支,沒有任何的提交歷史,但是當前分支的內容一一俱全。
* git checkout 0d1d7fc32
* 0d1d7fc32為commitId, 代碼處于 detached 狀態, 提交commit 會新生成一個分支(臨時分支);
* git checkout -b old-branch-name 0d1d7fc32
* 相當于 `git branch old-branch-name 0d1d7fc32` + `git checkout old-branch-name` 基于當時的commit恢復分支;(old-branch-name已被刪除,且0d1d7fc32為old-branch-name分支上的提交)
## 相關指令:
* [git reset](http://www.hmoore.net/wteamxq/git_rank/277266) 代碼撤銷(回退): 配合`git log`,我的回退實用性可以完爆`git checkout`;