天天看點

【Git學習】切換分支的思考

引言:

一般我們都是在develop分支開發,然後合并到master分支,但是今天上次合并到master之後,忘了切回develop,于是當天的工作都是在master分支的做的?那麼問題來了,我如何把今天的工作轉換到develop分支呢?當然最笨的辦法是記住修改了哪些檔案,然後一個個複制,切換到develop覆寫。那麼能不能直接切換到develop分支呢?

我們知道有時候切換分支的時候,如果有檔案改動沒有送出,git就會阻止我們切換分支,因為它怕我們切換分支後,辛辛苦苦做的工作丢失了。于是它會友好的禁止我們

Please, commit your changes or stash them before you can switch branches

但有的時候,即使我們在目前分支改動了檔案,卻可以切換分支,卻沒有出現上面的禁止提示。這是因為什麼呢?我的猜測是:

如果目前分支當對于要切換的目标分支,所有檔案都是相同或者部分檔案僅相差一個版本(檔案在目前分支的版本比目标分支的版本高一個版本),有點繞,這裡應該有更好的解釋。

情景一:

【Git學習】切換分支的思考

如上圖所示,紅色代表檔案變動了,但沒有送出到本地倉庫,綠色代表倉庫穩定的版本。目前A分支中有個檔案a.txt目前是V1版本,而分支B除了a.txt檔案,其他檔案内容都和分支A相同,那麼分支B此時能切換到分支A嗎?

情景二:

【Git學習】切換分支的思考

那如果分支B的a.txt檔案已經處于V3版本,而分支A的a.txt處于V1版本,那麼分支B能切換到分支A嗎?

實驗驗證

先初始化一個倉庫

git init

然後建立一個檔案

a.txt

,内容為

111111

,然後git add ,git commit送出。

【Git學習】切換分支的思考

然後建立并切換到develop分支,

git checkout -b develop

然後更新

a.txt

内容為

222222

,這就相當于上面的情景1,

【Git學習】切換分支的思考

可以看到切換成功了,同理我們再切換到develop分支,并且送出更改的内容。然後再更改檔案

a.txt

的内容為

333333

,此時對應上面的情景2。

【Git學習】切換分支的思考

此時再次切換master就會發現失敗了,因為

a.txt

檔案在兩個分支的最新送出裡相差兩個版本。這樣就切換失敗了。

那麼如果能夠保留目前的更改又能夠回到master分支上呢?

可以試用git reset指令使目前分支的版本回退到目标分支的版本。

git reset --soft HEAD^  #回退到上一個版本
           

該指令詳見我另一篇文章

思考

那麼回到最初抛出的問題,如果我不小心master分支做了更改,如果變換到develop分支上。

  • 如果master的上一次送出和develop的最新送出相同,那麼就可以直接切換到develop分支上。
  • 如果master版本較高,就需要回退到develop的版本,然後切換分支。
  • 如果develop目前的版本較高,那麼master就沒有辦法切換到develop了,那就隻能拷貝檔案了。