Git学习笔记第三篇,主要参照廖雪峰的Git教程,好记性不如烂笔头,学习成果形成文档,加油!
1 创建与合并分支
每一次 git commit
,Git都会把提交的内容串成一条时间线,这条时间线就是一个分支。截止到前面两章的内容都只有一条时间线,即一个分支——master
。严格来讲,HEAD
并不是指向提交,而是指向当前分支master
,master
才是指向提交的,所以HEAD
指向的就是当前分支。
当创建新的分支dev
的时候,Git会创建一个指针dev
,并指向与master
相同的提交,然后再把HEAD
指向dev
,这样就表示当前分支在dev
上。
现在对工作区的修改和提交就是针对dev
分支了,如果修改一次再提交,就是dev
指针向前移动一步,而master
指针不变。
如果在dev
分支上的工作完成,就需要把dev
分支合并到master
分支上,最简单的方式就是直接将master
指向dev
当前的提交。
合并完分支之后,就可以将dev
分支删除,只留下master
分支。
步骤 | 作用 | 命令 |
---|---|---|
1 | 创建分支dev | git branch dev |
2 | 切换到分支dev | git checkout dev |
还可以把上面两条命令合并在一起执行
创建分支dev | git branch dev |
---|
1. git branch
的作用是查看当前所有分支,执行该命令够,会列出所有的分支,并在当前分支前面打*。
2. git branch -d <name>
的作用是删除<name>
分支。
3. git merge
表示将指定分支合并到当前分支
把dev
分支的工作成果合并到master
分支上,首先git checkout master
切换到master
分支上,然后git merge dev
将dev
分支合并到master
分支。
通常情况下,合并分支时,如果有可能,Git会默认采用“Fast-Forward”模式,但是这种模式在删除分支之后会丢失分支信息。
如果强制禁用“Fast-Forward”模式,就会在merge
的时候生成一个新的commit
,这样从分支历史上就可以看到分支信息。
使用--no-ff
命令可以进行强制禁用“Fast-Forward”模式的git merge
步骤 | 作用 | 命令 |
---|---|---|
1 | 创建并切换到分支dev | git checkout -b dev |
2 | 添加修改到Stage | git add readme.txt |
3 | 提交到当前分支 | git commit -m "add merge" |
4 | 切换到master | git checkout master |
5 | 使用 –no-ff合并 | git merge --no-ff -m “with --no-ff” dev |
因为本次合并要创建一个新的commit
,所以加上-m
参数,把commit
描述写进去
2 解决冲突
第一个分支上的操作
准备分支feature1
,并切换到该分支。修改learngit
目录下的文件readme.txt
,在其最后一行添加内容:Creating a new branch is quick AND simple.
在
feature1
分支上,使用git add
将修改添加到Stage,然后和git commit
将修改提交到feature1
分支。第二个分支上的操作
切换到master
分支,修改learngit
目录下的文件readme.txt
,在其最后一行添加内容:Creating a new branch is quick && simple.
在
master
分支上,使用git add
将修改添加到Stage,然后git commit
将修改提交到master分支。
现在,分支的情况变成下面这样:
这种情况下,如果使用git merge feature1
,Git无法执行“快速合并”(Fast-Forward),只能试图把各自的修改合并起来,但这种合并就可能会有冲突。查看readme.txt
文件:
Git is a version control system.
Git is free software.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git使用<<<<<<<
、 =======
、 >>>>>>>
来标记出不同分支的内容,将readme.txt
中的内容修改为:
Creating a new branch is quick AND simple.
此时在master
分支上,使用git add
将修改添加到Stage
,然后和git commit
将修改提交到master
分支。变成下面的情况:
即:master
分支修改之后往前走一步,解决合并时的冲突。然后feature1
分支合并到master
分支上。合并完成之后删除feature1
分支。
3 分支管理策略
通常情况下,分支管理遵循以下原则:
1. master分支是稳定分支,不能在上面干活,只用来发布新版本;
2. dev分支是用来干活的分支,到了某个版本发布的时候,才把dev分支合并到 master分支上;
3. 每个开发人员在自己的分支上进行操作开发,时不时地将自己的分支合并到dev分支上;
在Git中,分支非常的强大,所以对于每一个bug,都可以建立一个新的临时分支来进行修复,当修复完成之后,再合并分支,然后将临时分支删除。
4 bug分支
假如正在dev
分支上进行开发,突然接到立即修复bug101
任务,但是dev
分支上的开发工作还没有完成,也不能提交,这个时候就可以使用git stash
命令将dev
分支上的工作现场“储藏”起来,等修复完bug,在回到dev
分支上,“恢复”工作现场,然后接着工作。
git stash
储藏工作现场之后,如果此时使用git status
命令查看工作区,会发现此时的工作区是干净的(除非有不被Git管理的文件),没有需要git add
和git commit
的内容。
如果bug101
在master
分支上,那么如果在master
分支上修复bug101
,就从master
分支上创建新的临时分支issue-101
。
步骤 | 作用 | 命令 |
---|---|---|
1 | 切换到master分支 | git checkout master |
2 | 创建并切换到issue-101分支 | git checkout -b issue-101 |
现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:
步骤 | 作用 | 命令 |
---|---|---|
3 | 添加到Stage | git add readme.txt |
4 | 提交到issue-101分支 | git commit -m “fix bug-101” |
修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:
步骤 | 作用 | 命令 |
---|---|---|
5 | 切换到master | git checkout master |
6 | 使用 –no-ff合并 | git merge –no-ff -m “merged fix bug-101”` |
7 | 删除issue-101分支 | git branch -d issue-101 |
截止到此时,bug101
修复完成,可以返回到dev
分支,恢复曾经“储藏”的工作现场,接着工作。
步骤 | 作用 | 命令 |
---|---|---|
1 | 切换到dev分支 | git checkout dev |
2 | 查看“储藏”的工作现场 | git stash list |
恢复现场
步骤 | 作用 | 命令 |
---|---|---|
3 | 恢复工作现场 | git stash apply |
4 | 删除“储藏”的工作现场 | git stash drop` |
5 | 恢复工作现场,并删除“储藏”的工作现场 | git stash pop |
命令git stash apply
恢复工作现场之后,并不会删除stash
的内容,需要使用命令git stash drop
来删除掉stash的内容。
命令git stash pop
则可以在恢复工作现场之后,删除掉stash
的内容。
可以多次stash
,恢复的时候,先用git stash list
查看,然后恢复指定的stash
,用命令:git stash apply stash@{0}
5 feature分支
开发新的功能时,一般都是要建立一个新的feature
分支,然后在这个分支上进行对应的功能开发。
如果要删除一个从未被合并过的分支,可以通过git branch -D <name>
来强制删除<name>
分支。