1. 程式人生 > >git checkout 對工作目錄的影響 —— Git 學習筆記 21

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. 對於每一個在分支1但是不在分支2的檔案,Git 會刪除它們;
  2. 對於每一個在分支2但是不在分支1中的檔案,Git 會建立它們(用合適的內容);
  3. 對於每一個既在分支1又在分支2的檔案,如果版本不同,那麼 Git 會更新工作區的檔案,使之和分支2的版本匹配。

上面的每一步都有可能破壞你當前的工作區(工作區和暫存區對於每個分支是共用的)。

對於1,刪除一個檔案,如果這個檔案在工作區的版本和它在分支1的版本是一致的,那麼刪除它就是安全的;如果你修改了它,還沒有提交,那麼刪除就是不安全的;

對於2,建立一個檔案,如果工作區還不存在這個檔案,那就是安全的;如果工作區已經有這個檔案,但是內容是“錯”的,那麼就不安全;

對於3,如果這個檔案已經提交,那麼就是安全的;如果被修改了,且沒有提交,那麼就不安全;

注意:用命令git checkout -b <newbranch>建立並切換到一個新分支總是“安全”的:沒有檔案被建立,也沒有檔案被刪除,也沒有檔案被更新,索引也沒有任何改變。

但是用git checkout -b <newbranch> <start_point>就不一樣了。Git 會應用上述的安全檢查規則。




參考資料