git checkout 對工作目錄的影響 —— Git 學習筆記 21
git checkout 對工作目錄的影響
問題的提出
本文要討論的是:當我們用git checkout <branch_name>
命令切換分支時,如果有未提交的修改,會發生什麼?
如果當前工作區的狀態是“clean”,那麼切換到其他分支是很容易的。但是,如果有未提交的修改,也許就不能順利地切換過去,Git 會給出錯誤資訊。例如:
$ git branch
bug/pr-1
bug/pr-2
dev
* master
$ git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
NewStuff
Please, commit your changes or stash them before you can switch branches.
Aborting
Git 提示我們:要麼提交所有的修改,要麼用 stash 命名把這些修改儲藏起來。
讓人費解的是,Git 也不是每一次都這樣阻止我們切換分支。比如當我們基於活躍分支的最近一次提交建立一個新分支的時候,不管本地有沒有未提交的修改,我們都可以切換到新分支,這又是為何呢?
原理初探
假設你當前在分支 branch1, 你想切換到分支 branch2,於是你輸入命令
git checkout branch2
對於你的工作區來說,這條命令意味著什麼呢?
- 對於每一個在分支1但是不在分支2的檔案,Git 會刪除它們;
- 對於每一個在分支2但是不在分支1中的檔案,Git 會建立它們(用合適的內容);
- 對於每一個既在分支1又在分支2的檔案,如果版本不同,那麼 Git 會更新工作區的檔案,使之和分支2的版本匹配。
上面的每一步都有可能破壞你當前的工作區(工作區和暫存區對於每個分支是共用的)。
對於1,刪除一個檔案,如果這個檔案在工作區的版本和它在分支1的版本是一致的,那麼刪除它就是安全的;如果你修改了它,還沒有提交,那麼刪除就是不安全的;
對於2,建立一個檔案,如果工作區還不存在這個檔案,那就是安全的;如果工作區已經有這個檔案,但是內容是“錯”的,那麼就不安全;
對於3,如果這個檔案已經提交,那麼就是安全的;如果被修改了,且沒有提交,那麼就不安全;
注意:用命令git checkout -b <newbranch>
建立並切換到一個新分支總是“安全”的:沒有檔案被建立,也沒有檔案被刪除,也沒有檔案被更新,索引也沒有任何改變。
但是用git checkout -b <newbranch> <start_point>
就不一樣了。Git 會應用上述的安全檢查規則。
參考資料
相關文章
- git checkout 和 git reset 的區別 —— Git 學習筆記 09Git筆記
- git checkout 命令詳解—— Git 學習筆記 16Git筆記
- git 學習筆錄Git
- Git 的工作區、暫存區、版本庫—— Git 學習筆記 15Git筆記
- git學習筆記Git筆記
- Git 的特點—— Git 學習筆記 02Git筆記
- Pro Git 學習筆記Git筆記
- git學習筆記 1Git筆記
- git學習筆記1Git筆記
- git rebase(變基)—— Git 學習筆記 19Git筆記
- 取得 Git 倉庫 —— Git 學習筆記 04Git筆記
- Git對新增目錄的處理Git
- git checkout 命令Git
- Git和Maven的學習筆記GitMaven筆記
- 記錄每次更新到倉庫 —— Git 學習筆記 10Git筆記
- git status 命令總結 —— Git 學習筆記 06Git筆記
- git入門學習筆記Git筆記
- Git極簡學習筆記Git筆記
- Git 分支的建立與切換 —— Git 學習筆記 14Git筆記
- Git 的安裝與初次使用 —— Git 學習筆記 03Git筆記
- Myth 關於Git的學習筆記Git筆記
- git高階命令學習記錄Git
- Git學習記錄v1.0Git
- git cherry-pick 詳解 —— Git 學習筆記 18Git筆記
- git reset 命令詳解(一)—— Git 學習筆記 07Git筆記
- git reset 命令詳解(二)—— Git 學習筆記 08Git筆記
- 廖雪峰Git學習筆記1-Git簡介Git筆記
- Reset and Checkout Files in GitGit
- 20190228 學習筆記——廖雪峰 git筆記Git
- Git 簡單使用學習筆記Git筆記
- Spring學習筆記目錄Spring筆記
- Git 分支策略與submodule對分支策略的影響Git
- git checkout命令詳解Git
- git checkout 命令詳解Git
- 撤銷操作 —— Git 學習筆記 12Git筆記
- [Note] git清空.git目錄後,重新再git init & git remote的討論GitREM
- Git 學習記錄之演變歷史Git
- git 工作流程以及Git 工作區、暫存區和版本庫(筆記)Git筆記