初始化仓库后 会自动为我们创建master分支,我们也可以自己创建分支,每一个分支都有自己的一套工作区,暂存区,仓库区。
问题情景1
此时正在dev分支上开发新的功能,如果线上产生了一个bug,使用stash存储下在dev开发到一半的功能,然后切换到master分支上新建一个修复bug的分支 fix_bug,在fix_bug分支上修复好bug后再合并到master分支上,此时再切换回dev分支上继续开发功能,开发完成后将dev分支合并到master分支上,此时岂不是产生了冲突?
是的,会产生冲突,如果dev上开发的功能和fix_bug修复bug对同一个文件都进行了操作,此时git不知道该保留哪一个,那么便会产生冲突,需要我们手动保留内容。那可不可以在dev上恢复stash之前,先将master分支合并到dev上呢?
我们首先新建一个dev分支,可以使用git checkout -b dev
git checkout -b dev 用于创建并切换到名为 “dev” 的新分支。
git checkout:这是一个用于在 Git 中切换分支或恢复文件的命令。
-b:这是 git checkout 命令的一个选项,用于创建并切换到一个新的分支。
dev:这是指定的分支名称,即你希望创建的新分支的名称。
修改1.txt文件 添加一行“开发新功能”,此时线上运行遇到了bug,我们首先使用git的stash贮存功能,git stash
git stash可以让我们暂时将修改的1.txt中的内容存储起来,这样切换到其他分支不会受到影响
git stash 命令用于将当前工作目录中的更改暂存(存储)起来,以便你可以在切换到其他分支或应用其他更改时保留这些更改。
执行 git stash 命令后,Git 会做以下操作:
将暂存区和工作目录中的未提交更改保存为一个 stash。
清空暂存区,使其与最新的提交一致。
这样,你就可以切换到其他分支或进行其他操作,而不会受到未提交的更改的影响。
如果你想给 stash 添加一个描述信息,可以使用 -m 参数,例如:
git stash save -m “My stash description”
要查看已保存的 stash 列表,可以使用 git stash list 命令。
要恢复(应用)最新的 stash 并将其从 stash 列表中删除,可以使用 git stash pop 命令:
git stash pop
如果你只想恢复(应用)最新的 stash,但不删除它,可以使用 git stash apply 命令:
git stash apply
如果你有多个 stash,并且想根据标识符选择恢复特定的 stash,可以使用 git stash apply 或 git stash pop 命令,后面跟上对应的 stash 标识符。
需要注意的是,stash 是按照存储的顺序进行堆叠的,你可以根据需要应用或删除特定的 stash。
我们使用git checkout main
,重新切换到main分支,使用git checkout -b fix_bug
新建并切换到fix_bug,在该分支上修复线上的bug,我们在1.txt内容中新增一行"修复bug",bug修复完成后,使用git commit -am "修复bug"
提交到fix_bug分支上的仓库区。
git commit -am “修复bug” 这个命令的效果相当于以下两个步骤的组合:
git add . # 将所有已被 Git 跟踪的文件的更改添加到暂存区
git commit -m “修复bug” #创建一个新的提交记录并指定提交消息
-a:这是 git commit 命令的一个选项,表示自动将所有已经被 Git 跟踪的文件的更改都加入到提交中。这样你就不需要使用 git add 命令来将修改的文件添加到暂存区。
请注意,-a 选项只会将已经被 Git 跟踪的文件的更改添加到提交中,如果有新添加的文件或未被跟踪的文件,你仍然需要使用 git add 命令将它们添加到暂存区。
然后我们重新切换到main分支,然后合并fix_bug分支,使用git merge fix_bug
此时修改好bug,我们切换回dev分支进行新功能的开发。我们首先将修复好bug的main分支合并到dev分支中,
然后使用git stash pop
重新恢复我们刚刚开发的功能
此时发生了冲突,在1.txt中文件显示如下,需要我们去手动修改
修改后1.txt如图
使用git add 1.txt
指令将修改后的文件标记为已解决冲突的状态,再次提交
git commit -m "合并冲突,开发新功能"
切换到main分支并合并
然后我们也可以删除掉fix_bug分支了,使用git branch -d fix_bug
指令
此时我们bug修复了,然后新功能开发完成后也合并到了main版本,可以等待上线了。在这个过程中,我们在dev分支恢复贮存的时候产生了冲突,需要我们进行手动保留。即git不知道该保留哪个内容时(在本文中是“开发新功能”和“修复bug”),会发生冲突,需要我们决定和手动修改保留。