我們知道,在使用 Git 的時候,應該要正確使用它的分支(Branch)功能。不同的功能使用不同的分支開發,最后合並進入主分支。但有時候會出現這樣一種情況——我代碼都已經寫完了,才發現我寫錯分支了。這個時候,怎么把我的修改遷移到目標分支上,並且不修改現在正在使用的分支?
我們用一個簡單的例子來說明這種情況。
首先創建一個文件夾:test_git,並且在里面創建一個1.txt 文件,這個文件的內容如下:
11111
22222
33333
44444
aaaaa
bbbbb
ccccc
接下來,我執行命令git init
,把當前文件夾作為一個git 源,並把1.txt 提交到源里面,讓 git 進行管理。
現在,我基於當前分支,創建一個dev分支。並對新分支里面的1.txt 文件進行修改:
git checkout -b dev
vim 1.txt
修改 dev 分支下的 1.txt文件:
11111
22222
33333
44444
xxxx
yyyy
zzzz
然后再在dev分支上增加這一改動
git add 1.txt
git commit -m 'change 1.txt'
好了,現在准備工作做完了。我現在有兩個分支master和dev。每個分支里面都有一個叫做1.txt的文件。並且這兩個1.txt文件的內容前半截相同,后半截不同。
大家可以看到,我現在在 dev 分支上。這個時候,我想修改 master 分支上面的1.txt。但是我忘記切換分支了。於是直接修改了dev 分支上的1.txt,這個時候,如果我直接使用命令git checkout master試圖切換分支,git 會報錯,沒有辦法切過去。
這個時候解決辦法有兩種:
1. 復制粘貼法
很多人可能會這樣做:打開一個記事本,把1.txt 里面修改的內容記錄下來。然后使用命令git checkout 1.txt
恢復1.txt 到修改之前的內容。然后切換到 master 分支。再根據記事本里面記錄的修改內容,把代碼粘貼到1.txt 文件中。如果只有1個文件修改那還好。但是在軟件開發中,可能你修改了很多個文件。所以這種方法會變得非常笨拙。
2. git stash
但實際上,git 早就預料到了你有這個需求,所以它已經有了應對方案。
這里我們需要用到 git stash
命令,簡單理解的話該命令就是把你當前所有的修改都緩存起來,什么時候想把這些緩存調出來,只要執行git stash pop
命令就可以了。
具體來說,你只需要按順序執行如下三條命令:
git stash
git checkout master
git stash pop
上述命令的意思是
- 我們先把 dev 分支上的所有修改先緩存起來
- 切換到 master 分支
- 將緩存 pop 出來,自然就是在master分支上做改動了
現在,我們打開1.txt 文件你會看到,剛才的修改已經自動應用到了master 分支的1.txt 上面了。
git stash會把當前修改的內容緩存起來,並恢復當前工作區到你修改之前的狀態。然后切換回 master 分支,執行命令git stash pop,把剛才的修改應用到 master 分支的1.txt 文件中。如果不出現沖突,那么它會自動修改1.txt 文件。如果出現了沖突,那么需要你打開1.txt 文件以后,手動解除沖突。
可以看到,使用git stash命令,比你單獨手動記錄修改的內容,切換分支再重新改一遍要方便很多。