在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时 候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是 一个单独的副本。(分支底层其实也是指针的引用)。
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建本地分支 |
git branch -d 分支名 | 删除本地分支 |
git push <主机名> -d <分支名> | 删除远程分支,主机名不填默认是origin |
git branch -v | 查看本地分支+上次提交的信息 |
git branch -vv | 查看本地分支+上次提交的信息+本地和远程分支的关系 |
git branch -vv -a | 查看本地分支+上次提交的信息+本地和远程分支的关系+远程分支(如果不想显示提交的信息,也可以去掉-vv 参数) |
git branch -r | 只查看远程分支 |
git checkout 分支名 | 切换本地分支 |
git checkout -b 分支名 | 创建本地分支并切换 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
git branch -m 旧分支名 新分支名 | 修改本地分支名称 |
git branch -v
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git branch -v
* master 7f64f7b first commit!
git branch 分支名
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git branch hot-fix
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git branch -v
hot-fix 7f64f7b first commit!
* master 7f64f7b first commit!
刚创建的新的分支,并将主分支 master 的内容复制了一份
在 maste 分支上做修改(添加master test!)
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ vim hello.txt
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git add hello.txt
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git commit -m "my third commit" hello.txt
[master d3fa9de] my third commit
1 file changed, 1 insertion(+), 1 deletion(-)
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git branch -v
hot-fix 7f64f7b first commit!
* master d3fa9de my third commit
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ cat hello.txt
hello, git!!!
hello, git!!!
hello, git!!! master test!
当前 master 分支已更新为最新一次提交的版本,hot-fix 分支并未做任何改变
git checkout 分支名
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ git branch -v
* hot-fix 7f64f7b first commit!
master d3fa9de my third commit
查看 hot-fix 分支上的文件内容发现与 master 分支上的内容不同
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ cat hello.txt
hello, git!!!
hello, git!!!
hello, git!!!
在 hot-fix 分支上做修改(添加hot-fix test!)
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ vim hello.txt
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ cat hello.txt
hello, git!!!
hello, git!!!
hello, git!!!hot-fix test!
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ git add hello.txt
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ git commit -m "hot-fix commit" hello.txt
[fot-fix 7164176] hot-fix commit
1 file changed, 1 insertion(+), 1 deletion(-)
查看日志
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ git reflog
7164176 (HEAD -> hot-fix) HEAD@{0}: Branch: renamed refs/heads/fot-fix to refs/heads/hot-fix
7164176 (HEAD -> hot-fix) HEAD@{2}: commit: hot-fix commit
7f64f7b HEAD@{3}: checkout: moving from master to fot-fix
d3fa9de (master) HEAD@{4}: commit: my third commit
7f64f7b HEAD@{5}: reset: moving to 7f64f7b
bd40f0e HEAD@{6}: commit: second commit!
7f64f7b HEAD@{7}: commit (initial): first commit!
git merge 分支名
在 master 分支上合并 hot-fix 分支
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (hot-fix)
$ git checkout master
Switched to branch 'master'
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
此处合并失败,产生冲突
冲突产生的表现:后面状态为 MERGING
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master|MERGING)
$ cat hello.txt
hello, git!!!
hello, git!!!
<<<<<<< HEAD
hello, git!!! master test!
=======
hello, git!!!hot-fix test!
>>>>>>> hot-fix
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。
查看状态(检测到文件有两处修改)
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
git merge --abort
命令是回到解决冲突之前的状态
1)编辑有冲突的文件,删除特殊符号,决定要使用的内容
特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
此处两个修改均保留。
hello, git!!!
hello, git!!!
hello, git!!! master test!
hello, git!!!hot-fix test!
vim中,按
esc
退出编辑模式后,按dd
删除当前行,按u
撤销上回操作
2)添加到暂存区
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master|MERGING)
$ git add hello.txt
3)执行提交(发现后面 MERGING 消失,变为正常)
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master|MERGING)
$ git commit -m "merge hot-fix"
[master f5c8cbf] merge hot-fix
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ git status
On branch master
nothing to commit, working tree clean
Aiw@DESKTOP-2K268H6 MINGW64 /e/Git-Space/git-demo (master)
$ cat hello.txt
hello, git!!!
hello, git!!!
hello, git!!! master test!
hello, git!!!hot-fix test!
注意:此时使用 git commit 命令时不能带文件名,否则报错,因为不知道要提交哪个同名文件
合并成功后,被合并的分支内容不会修改
master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD 决定的。所以创建分支的本质就是多创建一个指针。
HEAD 如果指向 master,那么现在就在 master 分支上。
HEAD 如果执行 hotfix,那么现在就在 hotfix 分支上。
所以切换分支的本质就是移动 HEAD 指针。