目录
一. 理解分支
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 的话就是这个样子
文章来源:https://www.toymoban.com/news/detail-529987.html
这样的话,我们时恒容易出错的,因为我们的 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 的远程操作~ 文章来源地址https://www.toymoban.com/news/detail-529987.html
到了这里,关于git 分支管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!