新建分支
首先,我们假设你正在你的项目上工作,并且在 master 分支上已经有了一些提交。
为了解决问题,想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令
$ git checkout -b iss53
Switched to a new branch "iss53"
它是下面两条命令的简写
$ git branch iss53
$ git checkout iss53
创建一个新分支指针
在 iss53 分支上修改东西并提交,该分支就会不断的向前推进,因为已经 checkout 到该分支 (也就是说,HEAD 指针指向了 iss53 分支)
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
紧急插入一个问题待修复
突然紧急插入一个问题需要修复,它可以不用和 iss53 分支混在一起。
操作步骤:
git status 检查 iss53 分支下的工作区和暂存区是否有没提交的修改,不然会阻止 git 切换分支;
切换至 master 分支;
再新建一个 hotfix 分支并切换到它上,进行修复问题工作;
$ git checkout master
Switched to branch 'master'
这个时候,Git 会让工作目录的内容会和 master 分支上最后一次提交时的内容保持一致,它会自动添加、删除、修改工作目录的文件
为了修复问题,新建一个分支在上面工作直到问题修复成功
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)
合并修复问题的分支到 master 分支上
问题修复成功后,可以将 hotfix 分支合并回 master 分支来部署到线上
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
什么是 fast-forward?
待合并的分支 hotfix 所指向的提交 C4 是你所在的提交 C2 的直接后继, 因此 Git 会直接将指针向前移动
换句话说,当试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的冲突
现在,最新的修改已经在 master 分支所指向的提交快照中,可以提交发布修复了
删除 hotfix 分支,回到 iss53 分支继续工作
问题解决后,删除临时分支,因为不再需要它,而且 master 分支也指向同一个位置了
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
回到 iss53 分支继续工作,继续提交
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
注意:
在 hotfix 分支上所做的工作并没有包含到 iss53 分支
中如果你需要拉取 hotfix 所做的修改,可以使用 git merge master 命令将 master 分支合并入 iss53 分支,或者也可以等到 iss53 分支完成其使命,再将其合并回 master 分支
分支 iss53 合并
iss53 分支上工作已完成,回到 master 分支合并 iss53 的东西
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
Merge made by the ‘recursive’ strategy. 通过递归策略合并
因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作;
出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并;
合并提交
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它,它的特别之处在于他有不止一个父提交
既然修改已经合并进来了,就不再需要 iss53 分支了
$ git branch -d iss53
遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们;
假设对 iss53 分支修改的内容和 hotfix 分支的修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突;
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
注意:
此时 Git 做了合并,但是没有自动地创建一个新的合并提交;
Git 会暂停下来,要手动解决合并产生的冲突;
使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件;
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来
冲突标识
Git 会在有冲突的文件中加入标准的冲突解决标记,可以快速定位并解决冲突
<<<<<<< HEAD:index.html
<div id="footer">contact : [email protected]</div>
=======
<div id="footer">
please contact us at [email protected]
</div>
>>>>>>> iss53:index.html
图形化工具解决冲突
如果你想使用图形化工具来解决冲突,你可以运行 git mergetool,该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突:
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
通过 git status 查看合并后的状态
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
通过 git commit 提交合并后的内容
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
只有敢于追逐梦想,才能让生命绽放出最美的色彩;只有奋力拼搏,才能书写属于自己的辉煌篇章。无畏困难,不停前行,每一步都是向成功迈进的关键,坚持奋斗,终将收获辉煌的人生。
只有拼尽全力,才能超越极限;只有不放弃,才能追逐梦想;只有坚持奋斗,才能创造辉煌。相信自己,勇往直前,未来的成功属于你!
只有不断超越自我,才能追寻梦想的脚步;只有坚持不懈,才能创造辉煌的人生;只有拼尽全力,才能攀登人生的巅峰。奋斗吧,勇敢的灵魂,你一定会绽放光芒!