目录
一. 理解分支
1. master分支
二. 分支的(创建,切换、合并、删除)
1.查看分支
2.创建分支
3. 切换分支
4. 合并分支
5. 删除分支
三. 合并冲突
四. 合并模式
五. bug 分支
六. 强制删除分支
一. 理解分支
1. master分支
在我们的版本库中式有一个master分支的,但是我们不知道我们的master分支是什么
我们可以看一下master分支里面存的是什么,我们想要看master,我们知道我们的.git目录中的HEAD指针就是指向master,所以我们可以查看HEAD指针指向的内容
[lxy@hecs-165234 gitcode]$ cat .git/HEAD
ref: refs/heads/master[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/master
fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
实际上我们的master里面存的是最近一次的提交ID
[lxy@hecs-165234 gitcode]$ git log --pretty=oneline
fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5 delete file1
1e0bdd4483c99c4498cfcd075a5443bd22feacd4 add file
16d08056d1837be3cf3354332da20e8db4164d66 add file
d70feee2620617fbc8d4ec39a107b9093d6d6783 the first file
最近一次的提交和master保存的都是一样的
我们可以简单的看一下我们的 .git文件里面的文件指向
我们可以继续看一下master分支里面的内容是什么
[lxy@hecs-165234 gitcode]$ git cat-file -p fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
tree 68047de1b39a8a3f6627648b7ebd160f03ebad78
parent 1e0bdd4483c99c4498cfcd075a5443bd22feacd4
author lxy <2146047600@qq.com> 1687599216 +0800
committer lxy <2146047600@qq.com> 1687599216 +0800delete file1
我们看到里面有一个parent,实际上这个parent里面就是距离最近提交的上一次的提交 ,所以我们的提交是被串联在一起的,串联的那条线叫做时间线也就是主线,而我们的master也就是主分支
既然master是主分支,所以我们也可以在主分支上金国多次提交,创建分支,创建分支后我们还可以合并分支
二. 分支的(创建,切换、合并、删除)
1.查看分支
指令:git branch
[lxy@hecs-165234 gitcode]$ git branch
* master
我们当前并没有创建分支,所以我们只有一个master主分支
背景知识:我们只知道HEAD指针式指向master分支的,但是实际上我们的HEAD指针可以指向任意一个分支,我们之前所做的提交都是直接就提交到了master分支上,所以我们的HEAD指针指向哪一个分支,被指向的分支就是当前正在工作的分支
2.创建分支
指令:git branch + 分支名
我们创建一个 dev 分支,然后使用 git branch 指令查看
[lxy@hecs-165234 gitcode]$ git branch dev
[lxy@hecs-165234 gitcode]$ git branch
dev
* master
但是当前 HEAD 依然指向 master 分支
[lxy@hecs-165234 gitcode]$ cat .git/HEAD
ref: refs/heads/master
我们可以 tree 一下 .git 目录,我们看最下面的 refs 目录,之前我们的 refs目录里面只有一个 master 分支, 但是现在还有一个 dev 分支
[lxy@hecs-165234 gitcode]$ tree .git
.git
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ ├── dev
│ └── master
├── objects
│ ├── 0d
│ │ └── b7b10c75f52a26bac87dd0f74c2022d4433551
│ ├── 0f
│ │ ├── 71ccb923b09f79e93f6ce96dbc84d508805b4c
│ │ └── f6aef62b249cdddebc1850135aea6e32cf3e0e
│ ├── 16
│ │ └── d08056d1837be3cf3354332da20e8db4164d66
│ ├── 1e
│ │ └── 0bdd4483c99c4498cfcd075a5443bd22feacd4
│ ├── 68
│ │ └── 047de1b39a8a3f6627648b7ebd160f03ebad78
│ ├── 75
│ │ └── 85c3a879c5cf6a6e61a78e6aeb0b3fcd164a27
│ ├── 82
│ │ └── 3a236d2f60d920980052608b7646418901b48c
│ ├── b5
│ │ └── 64faa66a046f747a58ce9ea8692b0e061d81ae
│ ├── b7
│ │ └── 87d48011046b43caa54c73c74bda9d76065d4d
│ ├── b8
│ │ └── 64093050c8039420193a53f639c49ef18948b9
│ ├── bb
│ │ └── fcc7ec62f2d2b28220e1081681ce009194d667
│ ├── d7
│ │ └── 0feee2620617fbc8d4ec39a107b9093d6d6783
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── f3
│ │ └── 25451d76f43cd460d070d6c316e81c85380b07
│ ├── fb
│ │ └── 1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
│ ├── info
│ └── pack
├── ORIG_HEAD
└── refs
├── heads
│ ├── dev
│ └── master
└── tags
我们现在查看 master 分支和 dev 分支里面的内容
[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/master
fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/dev
fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
master 分支和 dev 分支里面存储的内容是相同的,我们大概看一下目前的索引指向情况
我们的 dev 指向最新的一次提交,这是因为我们在创建 dev 的时候我们是在最新的一次提交上创建的。
3. 切换分支
如果我们想在当前自己创建的分支上创建,那么我们当然是需要切换到 dev 分支上的,我们切换之后查看是否切换成功
指令:git checkout + 分支名
[lxy@hecs-165234 gitcode]$ git checkout dev
Switched to branch 'dev'
[lxy@hecs-165234 gitcode]$ git branch
* dev
master
[lxy@hecs-165234 gitcode]$ cat .git/HEAD
ref: refs/heads/dev
那么我们现在的HEAD指向 dev 分支,我们现在修改里面的文件呢?
这次我们在 ReadMe 文件里面添加一行信息 "Add on dev branch"
然后 add commit,commit 后查看ReadMe文件,在 dev 最近一次提交
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "add on dev branch"
[dev ab3c339] add on dev branch
1 file changed, 1 insertion(+)[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/dev
ab3c339dde2734321c5c24dca1be3863316283ad
添加成功后,我们切换回master分支,查看文件
[lxy@hecs-165234 gitcode]$ git checkout master
Switched to branch 'master'
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
切换回 master 分支后我们发现文件的修改并未在 master 分支里面成功修改,我们继续查看master里面的提交记录
[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/master
fb1fa8ed3e0ed84a2a5d5ecaa7ec7afbfb4b7cd5
我们发现现在的dev 和 master指向并不相同,我们可以大概看一下 master 和 dev 的指向
4. 合并分支
我们现在向把 dev 分支上的内容合并到 master 分支上怎么弄?
指令:git merge + 想要合并的分支
[lxy@hecs-165234 gitcode]$ git merge dev
Updating fb1fa8e..ab3c339
Fast-forward
ReadMe | 1 +
1 file changed, 1 insertion(+)
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch
我们合并后查看,发现确实已经在文件里了
合并后我们查看 master 分支的最近一次的提交,已经和 dev 的最新提交相同了
[lxy@hecs-165234 gitcode]$ cat .git/refs/heads/master
ab3c339dde2734321c5c24dca1be3863316283ad
5. 删除分支
我们在前面已经将 dev 分支合并了,那么也就是我们的 dev 分支也就没有存在价值了,所以我们需要删除掉 dev 分支,删除掉后我们在查看分支,我们发现分支只剩下 master 分支了
指令:git branch -d + 分支名
[lxy@hecs-165234 gitcode]$ git branch -d dev
Deleted branch dev (was ab3c339).
[lxy@hecs-165234 gitcode]$ git branch
* master
分支删除提示:如果想要删除 a 分支 ,那么就必须到其他的分支上删除 a 分支,否则就是删除不成功
我们成功删除掉 dev 分支后我们看一下索引指向
三. 合并冲突
场景:我们现在有一个 dev 分支,当我们在 dev 分支里面对 ReadMe 文件进行的修改,然后我们对 master 分支里面的 ReadMe文件也进行了修改,那么此时我们在 git merge(合并分支) 的时候会怎么样? 首先我们在合并分支的时候我们 git 并不知道我们到底要保留哪一个分支,此时 git merge 就会产生合并冲突
dev 分支做准备工作
[lxy@hecs-165234 gitcode]$ git branch -d dev
Deleted branch dev (was ab3c339).
[lxy@hecs-165234 gitcode]$ git branch
* master
[lxy@hecs-165234 gitcode]$ git branch dev
[lxy@hecs-165234 gitcode]$ git branch
dev
* master
[lxy@hecs-165234 gitcode]$ git checkout dev
Switched to branch 'dev'
[lxy@hecs-165234 gitcode]$ git branch
* dev
master
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch
dev branch 试验合并冲突问题
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "dev 试验合并冲突问题"
[dev 3d2ea16] dev 试验合并冲突问题
1 file changed, 2 insertions(+), 1 deletion(-)msater 分支做准备工作
[lxy@hecs-165234 gitcode]$ git checkout master
Switched to branch 'master'
[lxy@hecs-165234 gitcode]$ git branch
dev
* master
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch
master 试验合并冲突问题
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "master 试验合并冲突问题"
[master 6531ca4] master 试验合并冲突问题
1 file changed, 1 insertion(+)
我们现在看一下此时 分支的指向状态
尝试合并
[lxy@hecs-165234 gitcode]$ git merge dev
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
我们发现合并失败了
解决冲突 ,我们打开 ReadMe 文件,然后看到我们的冲突代码是被分开的,我们只要手动删除掉某一个冲突代码就好了,然后我们就在进行一次提交就好了
Hello world
Hello world
Hello world
Hello world
Hello world
<<<<<<< HEAD
Add on dev branch
master 试验合并冲突问题
=======
Add on dev branch
dev branch 试验合并冲突问题
>>>>>>> dev上面的红色的就代表有冲突的代码,我们只要删掉两者中的任意一种就可以(我们删除下面的)
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "master 试验冲突"
[master 41122ab] master 试验冲突
[lxy@hecs-165234 gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
Hello world
Hello world
Hello world
Hello world
Add on dev branch
master 试验合并冲突问题
我们看到我们的合并冲突解决了
此时我们的分支指向 ,我们看一下
小技巧:我们想要创建并切换一个个新的分支 的时候我们可以使用一句指令就搞定
指令:git checkout -b + 分支名
查看上面的分支指向图
git log --graph --abbrev-commit
查看分支指向图
[lxy@hecs-165234 gitcode]$ git log --graph --abbrev-commit
* commit 41122ab
|\ Merge: 6531ca4 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:53:38 2023 +0800
| |
| | master 试验冲突
| |
| * commit 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:16:49 2023 +0800
| |
| | dev 试验合并冲突问题
| |
* | commit 6531ca4
|/ Author: lxy <2146047600@qq.com>
| Date: Thu Jun 29 17:23:27 2023 +0800
|
| master 试验合并冲突问题
|
* commit ab3c339
| Author: lxy <2146047600@qq.com>
| Date: Wed Jun 28 18:23:54 2023 +0800
|
| add on dev branch
|
* commit fb1fa8e
| Author: lxy <2146047600@qq.com>
| Date: Sat Jun 24 17:33:36 2023 +0800
|
| delete file1
|
* commit 1e0bdd4
| Author: lxy <2146047600@qq.com>
| Date: Sat Jun 24 15:03:03 2023 +0800
|
| add file
merge 冲突解决总结:手动删除冲突代码,并进行提交
四. 合并模式
git 其实是有几种模式的,其中一种就是我们在第一次合并的时候的 fast forward 模式,我们下面在复现一下第一次合并的模式
我们创建一个 dev 分支并切换过去,然后将 ReadMe 文件的内容删除到剩余1行 Hello world,然后我们进行 merge, merge之后我们使用 git log --grapg --abbrev-commit 查看 commit 分支
[lxy@hecs-165234 gitcode]$ git checkout -b dev
Switched to a new branch 'dev'
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "删除剩余1行 hello world"
[dev 2c7ad00] 删除剩余1行 hello world
1 file changed, 6 deletions(-)
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello world
下面是合并分支
[lxy@hecs-165234 gitcode]$ git checkout master
Switched to branch 'master'
[lxy@hecs-165234 gitcode]$ git merge dev
Updating 41122ab..2c7ad00
Fast-forward
ReadMe | 6 ------
1 file changed, 6 deletions(-)查看 commit 分支
[lxy@hecs-165234 gitcode]$ git log --graph --abbrev-commit
* commit 2c7ad00
| Author: lxy <2146047600@qq.com>
| Date: Sat Jul 1 15:57:05 2023 +0800
|
| 删除剩余1行 hello world
|
* commit 41122ab
|\ Merge: 6531ca4 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:53:38 2023 +0800
| |
| | master 试验冲突
| |
| * commit 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:16:49 2023 +0800
| |
| | dev 试验合并冲突问题
| |
* | commit 6531ca4
|/ Author: lxy <2146047600@qq.com>
| Date: Thu Jun 29 17:23:27 2023 +0800
|
| master 试验合并冲突问题
|
实际上我们发现在 fast forward 模式下 commit 分支是看不出来是 merge 的还是 自己 commit 的
实际就像这样,我们的 master 分支是指向了 dev 分支的最新提交,我们并不可以看出来,但是我们的非 no-fast forward 模式可以看出来
* commit 2c7ad00
| Author: lxy <2146047600@qq.com>
| Date: Sat Jul 1 15:57:05 2023 +0800
|
| 删除剩余1行 hello world
|
* commit 41122ab
|\ Merge: 6531ca4 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:53:38 2023 +0800
| |
| | master 试验冲突
| |
| * commit 3d2ea16
| | Author: lxy <2146047600@qq.com>
| | Date: Thu Jun 29 17:16:49 2023 +0800
| |
| | dev 试验合并冲突问题
| |
* | commit 6531ca4
|/ Author: lxy <2146047600@qq.com>
| Date: Thu Jun 29 17:23:27 2023 +0800
我们在之前的一次试验merge冲突的时候的模式,我们看到那里显示的是 merge, 而我们不使用 fast forward 模式的指向是这样的
那么我们如何在merge 的时候不使用 fast forward
指令:git merge --no-ff -m "...." 为什么要带 -m 呢? 因为不使用fast forward就是当前分支又提交一次,所以需要带 -m
我们再次使用 dev 分支修改 ReadMe 文件,然后进行提交,切换到 master 后 merge --no-faster 合并,查看是否可以看到提交信息显示 merge
[lxy@hecs-165234 gitcode]$ git checkout dev
Switched to branch 'dev'
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ git add ReadMe
[lxy@hecs-165234 gitcode]$ git commit -m "no-fast forward"
[dev 691b883] no-fast forward
1 file changed, 1 insertion(+)
[lxy@hecs-165234 gitcode]$ git checkout master
Switched to branch 'master'
[lxy@hecs-165234 gitcode]$ git merge --no-ff -m "merge no fast forward"
fatal: No commit specified and merge.defaultToUpstream not set.
[lxy@hecs-165234 gitcode]$ git merge --no-ff dev -m "merge no fast forward"
Merge made by the 'recursive' strategy.
ReadMe | 1 +
1 file changed, 1 insertion(+)查看commit信息
[lxy@hecs-165234 gitcode]$ git log --graph --abbrev-commit
* commit 8ca3b16
|\ Merge: 2c7ad00 a4a3b7f
| | Author: lxy <2146047600@qq.com>
| | Date: Sat Jul 1 16:36:38 2023 +0800
| |
| | merge no fast forward
| |
| * commit a4a3b7f
|/ Author: lxy <2146047600@qq.com>
| Date: Sat Jul 1 16:35:07 2023 +0800
|
| merge no-ff
而我们这一次的提交的指示图就是这样的,我们的 dev 还是指向自己的 提交,但是我们的 master 将提交合并
建议使用 no fast forward 模式
五. bug 分支
场景:我们在开发的过程中发现了 master 分支上的代码有 bug 但是我在这之前对 master 创建了一个分支,并且在上面开发了一些内容,所以我们现在的首要目的是修复 bug 我们要怎么做?
我们需要在 master 上在创建一个分支,然后对 master 上的代码进行修改,所以我们需要切换回 从当前开发分支上切换回 master 分支上,并且创建一个修复 bug 的分支,但是我们在 checkout master 的时候我们显示需要要对当前分支进行 commit/stash,才可以切换回去,然后我们就要在 master 上在创建一个分支,进行 bug 的修复,.......... bug 修符 ........... ,修复完成之后对我们还要继续进行开发,所以我们需要对 git stash 后的内容进行恢复 git stash pop, ....继续开发。
指令: git stash 对工作区的内容进行保存
指令:git stash list 查看保存的工作区内容
指令:git stash pop 恢复工作区的内容
[lxy@hecs-165234 gitcode]$ git branch
* dev1
master
[lxy@hecs-165234 gitcode]$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
ReadMe
Please, commit your changes or stash them before you can switch branches.
Aborting
[lxy@hecs-165234 gitcode]$ git branch
* dev1
master
[lxy@hecs-165234 gitcode]$ git stash
Saved working directory and index state WIP on dev1: 2c7ad00 删除剩余1行 hello world
HEAD is now at 2c7ad00 删除剩余1行 hello world在对当前文件进行了 git stash 后我们的 .git/refs 里面就会有一个新的文件
├── ORIG_HEAD
└── refs
├── heads
│ ├── dev1
│ └── master
├── stash
└── tags
stash 文件就是用来存储 git stash 的内容的
修复 bug ........
继续开发
[lxy@hecs-165234 gitcode]$ git stash pop
继续开发....
当前我们的分支的状态时这样的
我们现在对 dev1 分支已经开发完毕了,我们现在如果直接在 master 分支上进行 merge 的话就是这个样子
这样的话,我们时恒容易出错的,因为我们的 master分支的内容也修改了,所以我们在进行 merge 的时候回发生合并冲突,我们需要手动的修改,所以时特别容易出错的,我们建议先在 dev 分支上进行合并 这样出错了修改也不会影响到 master 分支上的内容那么我们就是这样的
等我我们合并后将 dev 分支上的冲突问题解决后,我们在到 mater 分支上进行合并,这样就不会冲突了
六. 强制删除分支
如果我们对一个分支不想要了,但是我们并没有对其 merge 操作,我们应该怎么样删除呢?
指令:git branch -D + 分支名
[lxy@hecs-165234 gitcode]$ git checkout -b dev3
Switched to a new branch 'dev3'
[lxy@hecs-165234 gitcode]$ vim ReadMe
[lxy@hecs-165234 gitcode]$ cat ReadMe
Hello worlddevelop
[lxy@hecs-165234 gitcode]$ git add .
[lxy@hecs-165234 gitcode]$ git commit -m "develop"
[dev3 344d59d] develop
1 file changed, 2 insertions(+)
[lxy@hecs-165234 gitcode]$ git checkout master
Switched to branch 'master'
[lxy@hecs-165234 gitcode]$ git branch -d dev3
error: The branch 'dev3' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev3'.
[lxy@hecs-165234 gitcode]$ git branch -D dev3
Deleted branch dev3 (was 344d59d).
[lxy@hecs-165234 gitcode]$ git branch
* master
git 分支管理就到这里结束了,下次我们说关于 git 的远程操作~