忘记切换分支,不小心在其他分支上修改了很多代码,如何把这些修改拷贝到目标分支?
我们知道,在使用 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命令,比你单独手动记录修改的内容,切换分支再重新改一遍要方便很多。