简介
分支是一个cormit对象链,一条工作记录线,一条时间线
在除了第一次提交之外的每一次提交,对应的节点中都有一个parent属性,指向上一次的提交节点的commitId
最初的那一次提交,没有父节点,所以其对应的parent属性的值是null
# 查看所有的分支
git branch
# 开辟一个新的分支
git branch <new_branch>
# 切换到新分支
# git checkoout <new_branch>
# new_branch 为 - 表示上一个分支
git switch <new_branch>
# 创建新分支,并切换到新分支
# git checkout -b <new_branch>
git switch -c <new_branch>
# 删除branch
# 如果branch存在没有被合并到其它分支中的内容 就需要使用-D
# 不能删除当前分支
git branch -d <branch>
# 将other_branch中的修改合并到当前分支
git merge <other_branch>
# 查看当前分支的最近一次的提交记录
git branch -v
冲突合并
假设存在master和dev两个分支
master分支
index.js
console.log('Hello World')
commit list
commit 28593a6739d00d218d3e37a7488a2b8ee46d3461 (HEAD -> master)
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:33:05 2023 +0800
add Hello World
commit 5cb929f01c235b3ca3e7c640428887647ebfcfbe
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:32:28 2023 +0800
inital commit
dev分支
index.js
console.log('Hello Git')
commit list
commit 8fadf3a15015ba81dc5e88f048dd617865d81826 (HEAD -> dev)
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:33:41 2023 +0800
add Hello Git
# 从5cb929f01c 这个commit节点 开始 新建了一个名为dev的分支
commit 5cb929f01c235b3ca3e7c640428887647ebfcfbe (master)
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:32:28 2023 +0800
inital commit
此时切换到master并将dev分支的修改合并会master分支
因为此时master和dev分支都对index.js的第一行进行了修改
所以此时会发生冲突,因为git并不知道是以master的为主,还是dev的为主,还是两者都要
git git:(master) git merge dev
Auto-merging index.js
CONFLICT (content): Merge conflict in index.js
Automatic merge failed; fix conflicts and then commit the result.
index.js
<<<<<<< HEAD // 表示后边的代码是当前分支,也就是master分支中的内容
console.log('Hello World')
======= // 表示后边的代码是dev分支中的修改
console.log('Hello Git')
>>>>>>> dev
修复完冲突后,需要重新执行git add 和 git commit操作
以便于告诉git,当前的分支合并冲突已经修复完成
ps: 此时git commit 会存在默认的commit message 不需要手动填写
此时在来查看master分支的日志记录
# 这是一个新的commit id
# 这条commit中的内容就是我们对于冲突合并的修复内容
commit 173d08055201b74a04387c4224226aadf51d4160 (HEAD -> master)
Merge: 28593a6 8fadf3a
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:39:52 2023 +0800
Merge branch 'dev'
commit 8fadf3a15015ba81dc5e88f048dd617865d81826 (dev) # 这是dev分支合并进来的修改
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:33:41 2023 +0800
add Hello Git
commit 28593a6739d00d218d3e37a7488a2b8ee46d3461 # 这是合并分支前master所指向的节点
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:33:05 2023 +0800
add Hello World
commit 5cb929f01c235b3ca3e7c640428887647ebfcfbe
Author: klaus <klauswang.2018@gmail.com>
Date: Fri Jan 27 20:32:28 2023 +0800
inital commit
fast-forward
在上述状态中,如果需要将dev分支合并为main分支
main分支所需要做的操作就是将main分支向前移动一个节点,也就是移动到C2节点
这种只需要简单移动分支指针就可以完成分支合并的方式,就被称之为快进(fast-forward)
在fast-forward情况下:
- 保持分支历史简单且线性,使其变得更容易理解
- 合并速度更快,因为不需要创建新提交
但是fast-forward也有自己的缺点
如果我们在合并分支的时候,不希望使用fast-forward模式,我们可以在merge命令后边加上参数--no-ff
git merge dev --no-ff