git checkout 對工作目錄的影響

參考鏈接:https://blog.csdn.net/longintchar/article/details/84146935

本文要討論的是:當我們用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但是不在分支1中的文件,Git 會創建它們(用合適的內容);
對於每一個既在分支1又在分支2的文件,如果版本不同,那麼 Git 會更新工作區的文件,使之和分支2的版本匹配。

上面的每一步都有可能破壞你當前的工作區(工作區和暫存區對於每個分支是共用的)。
對於1,刪除一個文件,如果這個文件在工作區的版本和它在分支1的版本是一致的,那麼刪除它就是安全的;如果你修改了它,還沒有提交,那麼刪除就是不安全的;
對於2,創建一個文件,如果工作區還不存在這個文件,那就是安全的;如果工作區已經有這個文件,但是內容是“錯”的,那麼就不安全;
對於3,如果這個文件已經提交,那麼就是安全的;如果被修改了,且沒有提交,那麼就不安全;
注意:用命令git checkout -b <newbranch>創建並切換到一個新分支總是“安全”的:沒有文件被創建,也沒有文件被刪除,也沒有文件被更新,索引也沒有任何改變。
但是用git checkout -b <newbranch> <start_point>就不一樣了。Git 會應用上述的安全檢查規則。

 

 

注意:這時如果修改/delete/add了newbranch分支中的文件

1.沒有commit,然後git checkout oldbranch,此時會切換成功,並且會oldbranch文件中的相關文件會改變成newbranch中的文件內容。

2.commit後,然後git checkout oldbranch,此時會切換成功,並且會oldbranch文件中的相關文件會改變成oldbranch中的文件內容(表現和‘1’一樣)。但是,後面再更改文件,不commit/stash再切換到b1,就會提示error(此時會進行安全檢查)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章