分支 branch( 非常重要 )
概念: 分支是由多个commit链条按照一定的顺序组成的链 / 一条工作记录线
commit 一个版本(每个版本都唯一的sha1)
注意:
1.git仓库初始化了就有master分支 ,master是主分支(默认分支)
2.每一个分支必须基于一个commit
有关分支的命令:
创建分支
git branch 分支名
切换分支
git checkout 分支名
删除分支
git branch -d 分支名
查看分支
git branch
/*
* master *代表你当前所在的分支
dev
*/
创建并切换分支
git checkout -b 分支名
合并两个分支
git merge 分支名
查看分支当前版本
git branch -av
实验:不能删除分支的情况(重点)
1. 不能删除当前分支
2. 如果分支包含‘未合并’的内容 不能删除当前分支,
未合并: 在要删除的分支存在一个新的版本 commit,而且只有当前删除的分支指向于这个版本
可以强制 删除 git branch -D dev
合并完可以删除
git merge dev
/*
更新 4b4b597..0444a94
Fast-forward :前进分支分指针由之前的commit 向前走了n步 ,这个向前走的动作,向前合并
a.txt | 1 + :0444a94相比于 4b4b597 在a.txt 文件中增加了一行
1 file changed, 1 insertion(+)
*/
git branch -d dev
3. 注意两个细节:
a)如果在分支dev中进行了写(新建文件,删除文件,修改文件)操作 ,但此操作局限在工作区(没有进过add commit)
在这种情况下,在master分支是可以看到dev分支的写操作的 ,如果 dev 分支对这个写操作执行了add和 commit
则master 分支是不能观察到dev这个写操作的
b)如果在分支dev中进行了写操作 ,但这个写操作仅局限在工作区,
可以直接删除这个dev分支,原因在master中是可以感知到dev的写操作的
实验: Fast-forward
场景:dev分支领先master 两个commit,master落后dev 两个commit
git merge dev // 在master分支上合并dev
merge dev (默认按照 Fast-forward方式合并)
merge --no-ff dev (使用 --no-ff方式合并)
/*
更新 ff6eefd..9a5d8f0
Fast-forward
a.txt | 3 +++
1 file changed, 3 insertions(+)
*/
注意:
1. 合并后也会保留中间的commit
2. git merge 合并后 两个分支归于同一个commit
3. Fast-forward合并方式丢失分支信息
git log --graph
git log --graph --pretty=oneline --abbrev-commit
实验 :–no-ff 合并方式
场景:dev分支领先master 两个commit,master落后dev 两个commit
git merge --no-ff dev
/*
Merge made by the 'recursive' strategy.
a.txt | 2 ++
1 file changed, 2 insertions(+)
*/
注意:
1.no-ff和并完后,主动发起合并的分支会领先于被合并的分支一个commit版本
2.no-ff 不会丢失分支信息
3.被合并的分支也要进行fast-forward前进一步 ,两个分支指向于同一个commit