Git学习笔记(3)-分支管理

Git学习笔记第三篇,主要参照廖雪峰的Git教程,好记性不如烂笔头,学习成果形成文档,加油!

1 创建与合并分支

每一次 git commit,Git都会把提交的内容串成一条时间线,这条时间线就是一个分支。截止到前面两章的内容都只有一条时间线,即一个分支——master。严格来讲,HEAD并不是指向提交,而是指向当前分支mastermaster才是指向提交的,所以HEAD指向的就是当前分支。
Head与Master的关系
当创建新的分支dev的时候,Git会创建一个指针dev,并指向与master相同的提交,然后再把HEAD指向dev,这样就表示当前分支在dev上。
创建dev分支
现在对工作区的修改和提交就是针对dev分支了,如果修改一次再提交,就是dev指针向前移动一步,而master指针不变。
dev分支上的修改
如果在dev分支上的工作完成,就需要把dev分支合并到master分支上,最简单的方式就是直接将master指向dev当前的提交。
合并分支
合并完分支之后,就可以将dev分支删除,只留下master分支。
删除dev分支

步骤 作用 命令
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 devdev分支合并到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描述写进去
强制禁用Fast-Forward合并分支

2 解决冲突

  1. 第一个分支上的操作
    准备分支feature1,并切换到该分支。修改learngit目录下的文件readme.txt,在其最后一行添加内容:

    Creating a new branch is quick AND simple.

    feature1分支上,使用git add将修改添加到Stage,然后和git commit将修改提交到feature1分支。

  2. 第二个分支上的操作
    切换到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 addgit commit的内容。
如果bug101master分支上,那么如果在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>分支。

猜你喜欢

转载自blog.csdn.net/weixin_40528417/article/details/79387259