image.png

什么是分支

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独
分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时
候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是
一个单独的副本。(分支底层其实也是指针的引用)
image.png

分支的好处

同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败
的分支删除重新开始即可。

分支的操作

创建分支 : git branch 分支名
查看分支: git branch -v
切换分支 : git checkout 分支名
把指定的分支合并到当前分支上 : git merge 分支名

查看当前分支

git branch -v

  1. root@ZJJ MINGW64 /f/projectDemo (master)
  2. $ git branch -v
  3. * master e694c82 第二次提交

创建分支

命令: git branch [分支名字]

  1. $ git branch fenzhi1

查看分支
发现已经出现了你刚刚创建的fenzhi1 这个分支

  1. $ git branch -v
  2. fenzhi1 e694c82 第二次提交
  3. * master e694c82 第二次提交
  4. root@ZJJ MINGW64 /f/projectDemo (master)

切换分支

git checkout [要切换的分支名字]

  1. $ git checkout fenzhi1
  2. Switched to branch 'fenzhi1'
  3. root@ZJJ MINGW64 /f/projectDemo (fenzhi1)

此时你会发现 root@ZJJ MINGW64 /f/projectDemo (fenzhi1) ,注意观察括号里面的内容fenzhi1,这个就是你文件的当前的分支.

$ git branch -v 查看下分支,可以发现你刚刚切换的fenzhi1 这个分支在最上面了,说明切换分支成功了.

  1. $ git branch -v
  2. * fenzhi1 e694c82 第二次提交
  3. master e694c82 第二次提交

在新分支上修改提交

在fenzhi1上进行文件修改,然后将修改完成的文件进行提交

  1. root@ZJJ MINGW64 /f/projectDemo (fenzhi1)
  2. $ git add hello.txt
  3. root@ZJJ MINGW64 /f/projectDemo (fenzhi1)
  4. $ git commit -m"在fenzhi1上第一次提交代码" hello.txt
  5. [fenzhi1 1bb7833] fenzhi1上第一次提交代码
  6. 1 file changed, 1 insertion(+), 1 deletion(-)
  7. root@ZJJ MINGW64 /f/projectDemo (fenzhi1)

然后你去.git文件夹下打开HEAD文件,发现里面ref引用到了fenzhi1这个分支了.
image.png

然后你去看heads文件下的 fenzhi1这个文件里面的版本号,就是你刚刚提交的代码的版本号

image.pngimage.png

切换回别的分支

git checkout [要切换的分支名字]

  1. root@ZJJ MINGW64 /e/projectDemo (fenzhi1) # 注意括号里面fenzhi1 是你当前的分支
  2. $ git checkout master
  3. Switched to branch 'master'
  4. root@ZJJ MINGW64 /e/projectDemo (master) # 注意括号里面master , 说明你已经切换回来master分支了

合并分支

把指定的分支合并到当前分支上 : git merge 分支名

我想把fenzhi1分支合并到master分支上

git merge [要合并的分支名字]

  1. root@ZJJ MINGW64 /e/projectDemo (master) # 注意括号里面的内容,(master)的意思就是当前分支是master分支
  2. $ git merge fenzhi1 # 意思是将fenzhi1合并到当前分支,也就是master分支上
  3. Updating e694c82..1bb7833
  4. Fast-forward
  5. hello.txt | 2 +-
  6. 1 file changed, 1 insertion(+), 1 deletion(-) # 一个文件被修改 1行被删除,1行被添加

这里需要注意,你想把哪个分支合并到当前分支,就git merge 哪个分支

合并冲突解决

我在master分支修改hello.txt第一行,然后commit操作
然后我在fenzhi1分支修改hello.txt第一行,然后commit操作
我切换到master分支上,把fenzhi1上的文件合并到master分支上,此时就会出现冲突了,因为两个分支都修改了第一行,git无法决定选哪个分支上的数据,所以就得由操作者自己决定.

  1. root@ZJJ MINGW64 /e/projectDemo (master)
  2. $ git merge fenzhi1
  3. Auto-merging hello.txt
  4. CONFLICT (content): Merge conflict in hello.txt # 合并代码冲突在 hello.txt文件里面
  5. Automatic merge failed; fix conflicts and then commit the result. # 自动合并失败了,
  6. root@ZJJ MINGW64 /e/projectDemo (master|MERGING) #此时括号里面的内容是(master|MERGING),说明此时有文件正处于合并中状态
  7. $

查看本地库状态

  1. $ git status
  2. On branch master
  3. You have unmerged paths.
  4. (fix conflicts and run "git commit")
  5. (use "git merge --abort" to abort the merge)
  6. Unmerged paths:
  7. (use "git add <file>..." to mark resolution)
  8. both modified: hello.txt
  9. no changes added to commit (use "git add" and/or "git commit -a") # 此时显示这个没有合并成功,有两个分支都修改了这个文件的同一行
  10. root@ZJJ MINGW64 /e/projectDemo (master|MERGING)

此时就需要操作人员手动打开文件进行代码合并了.打开hello.txt文件

image.png

一番对比之后,我决定要我自己的代码,然后我就把代码改成下面的样子,删除git那些 ===== <<<<<< 符号,然后进行代码添加提交

  1. 我是在master分支上修改的
  2. hello.zjj
  3. hello.zjj
  4. hello.zjj
  5. hello.zjj
  6. hello.zjj
  7. hello.zjj
  8. hello.zjj
  9. hello.zjj
  10. hello.zjj
  11. hello.zjj
  12. hello.zjj
  13. hello.zjj
  14. hello.zjj
  15. hello.zjj
  16. hello.zjj
  17. hello.zjj


将代码挪到暂存区并且进行提交操作
这里有个注意点,就是git commit的时候不能带上文件名
$ git commit -m “我进行代码冲突解决” hello.txt
上面这样会报错,提示 : 不能在合并期间执行部分提交。
得去掉文件名,比如说这样:
$ git commit -m “我进行代码冲突解决”

  1. root@ZJJ MINGW64 /e/projectDemo (master|MERGING)
  2. $ git add hello.txt
  3. root@ZJJ MINGW64 /e/projectDemo (master|MERGING)
  4. $ git commit -m "我进行代码冲突解决" hello.txt
  5. fatal: cannot do a partial commit during a merge.
  6. root@ZJJ MINGW64 /e/projectDemo (master|MERGING)
  7. $ git commit -m "我进行代码冲突解决"
  8. [master 4b6302d] 我进行代码冲突解决
  9. root@ZJJ MINGW64 /e/projectDemo (master)

解决完了冲突之后,你会发现
root@ZJJ MINGW64 /e/projectDemo (master|MERGING) 变成了root@ZJJ MINGW64 /e/projectDemo (master)
(master|MERGING) 变成了(master) ,说明解决完了冲突了.

注意,此时你合并是修改master的内容的, 并不会修改原来的分支的内容
比如说我将fenzhi1合并到master分支上,然后此时出现冲突了,我修改完了之后进行commit,我只是改变了master分支上的文件,并不会改变fenzhi1上的文件.