由于篇幅过长接着上篇:https://blog.csdn.net/aaaaaab_/article/details/82192344
都是跟着廖雪峰老师的git教程进行学习(需要看的同学直接百度即可),做个学习笔记!
分支的意义在于你不必要每次完成一点工作进度的时候就得提交,一次性提交又担心数据丢失的问题,分支可以实现你在
做任务的时候提交到自己的分支,然后完成任务时进行分支合并将数据传到主分支即可。
在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,
所以,HEAD指向的就是当前分支。一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向
master,就能确定当前分支,以及当前分支的提交点
创建与合并分支:
创建分支:
首先,我们创建dev分支,然后切换到dev分支:
mi@ubuntu:~/Desktop/demo$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch命令查看当前分支:
mi@ubuntu:~/Desktop/demo$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
进行文件的更改提交:
mi@ubuntu:~/Desktop/demo$ ls
file1.txt file2.txt file3.txt readme.md readme.txt test
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
mi@ubuntu:~/Desktop/demo$ echo "Creating a new branch is quick." >> readme.txt
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick.
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "branch test"
[dev 4b4a010] branch test
1 file changed, 1 insertion(+)
切换到主分支发现文件并没有更改,因为我们是在dev分支上面进行的操作,在master分支无法查看。
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
合并分支在master分支上面可以查看提交数据:
mi@ubuntu:~/Desktop/demo$ git merge dev
Updating ccc7a4d..4b4a010
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick.
删除分支:
mi@ubuntu:~/Desktop/demo$ git branch -d dev
Deleted branch dev (was 4b4a010).
mi@ubuntu:~/Desktop/demo$ git branch
* master
如果在主分支和新建分支同时提交就会出现BUG:
新建分支进行提交数据:
mi@ubuntu:~/Desktop/demo$ git checkout -b feature1
Switched to a new branch 'feature1'
mi@ubuntu:~/Desktop/demo$ git branch
* feature1
master
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick AND simple.
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "AND simple"
[feature1 673899c] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
切换到主分支进行更改数据提交(更改数据不统一)
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "& simple"
[master efb7433] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
进行分支合并会出现冲突:
mi@ubuntu:~/Desktop/demo$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
查看文件会出现不同分支修改内容提示,手动更改文件提交:
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
mi@ubuntu:~/Desktop/demo$ vim vim readme.txt
2 files to edit
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "conflict fix"
[master d758c59] conflict fix
可以用git log --graph命令查看分支合并图:
mi@ubuntu:~/Desktop/demo$ git log --graph --pretty=oneline --abbrev-commit
* d758c59 conflict fix
|\
| * 673899c AND simple
* | efb7433 & simple
|/
* ec7236b conflict fixed
|\
| * 701d07b AND simple
* | 38f1038 & simple
|/
* 4b4a010 branch test
* ccc7a4d test
* 80b06b9 add readme.txt
* 3ee6806 add readme.txt
* 6af4dd7 add readme.txt
* 58aa685 add readme.txt
* b2c2c7d add 3 files.
* e66e360 wtrote a readme file
* f177193 add readme.md
删除分支:
mi@ubuntu:~/Desktop/demo$ git branch -d feature1
Deleted branch feature1 (was 673899c).
mi@ubuntu:~/Desktop/demo$ git branch
* master
分支管理策略:
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息看不到之前的分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
下面我们实战一下--no-ff方式的git merge:
创建新的分支更改数据并提交:
mi@ubuntu:~/Desktop/demo$ git checkout -b dev
Switched to a new branch 'dev'
mi@ubuntu:~/Desktop/demo$ git branch
* dev
master
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "add merge"
[dev c9ed0b0] add merge
1 file changed, 1 deletion(-)
切换分支加入–no-ff参数进行分支合并,-m表示加入解释:
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 -
1 file changed, 1 deletion(-)
查看分支合并图:
mi@ubuntu:~/Desktop/demo$ git log --graph --pretty=oneline --abbrev-commit
* 7687817 merge with no-ff
|\
| * c9ed0b0 add merge
|/
* 0925bf0 merge with no-ff
|\
| * 42adf39 add merge
|/
* d758c59 conflict fix
|\
| * 673899c AND simple
* | efb7433 & simple
|/
* ec7236b conflict fixed
|\
| * 701d07b AND simple
* | 38f1038 & simple
|/
* 4b4a010 branch test
* ccc7a4d test
* 80b06b9 add readme.txt
* 3ee6806 add readme.txt
* 6af4dd7 add readme.txt
* 58aa685 add readme.txt
* b2c2c7d add 3 files.
* e66e360 wtrote a readme file
* f177193 add readme.md
总述:
我们在生产环境中可以新建分支来完成自己的工作,然后合并到master分支即可!
Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史可以
查看到有分支,能看出来曾经做过合并,而fast forward方式合并就看不出来曾经做过合并。
BUG分支:
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过
一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。当你接到一个修复一个代号101的bug的任务时,很
自然地,你想创建一个分支issue-101来修复它。但是在dev分支上面修改的文件还没有提交:
mi@ubuntu:~/Desktop/demo$ git checkout -b dev
Switched to a new branch 'dev'
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
利用git的stash功能可以存储现在的工作环境先来处理bug,存储之后工作区是干净的查询不到状态
mi@ubuntu:~/Desktop/demo$ git stash
Saved working directory and index state WIP on dev: 7687817 merge with no-ff
HEAD is now at 7687817 merge with no-ff
mi@ubuntu:~/Desktop/demo$ git status
On branch dev
nothing to commit, working directory clean
假设在master分支修复BUG,切换到master分支建立修复故障分支更改文件进行提交:
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ git checkout -b issue-101
Switched to a new branch 'issue-101'
mi@ubuntu:~/Desktop/demo$ vim readme.txt
mi@ubuntu:~/Desktop/demo$ cat readme.txt
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "fix bug 101"
[issue-101 1644202] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
修复完成回到master分支进行分支合并:
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ git merge --no-ff -m "merge bug fix 101" issue-101
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
BUG修复完成重新回到dev分支进行工作,但是查看工作区还是干净的:
mi@ubuntu:~/Desktop/demo$ git checkout dev
Switched to branch 'dev'
mi@ubuntu:~/Desktop/demo$ git status
On branch dev
nothing to commit, working directory clean
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
mi@ubuntu:~/Desktop/demo$ git stash list
stash@{0}: WIP on dev: 7687817 merge with no-ff
mi@ubuntu:~/Desktop/demo$ git stash pop
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (351750096bf74c302a30d8c2e6f92da564175a17)
mi@ubuntu:~/Desktop/demo$ git stash list 删除之后查询不到任何内容
总述:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
你想删除新建的dev和故障分支的时候需要先git add然后git commit将之前的修改提交,
才可以切换删除分支:
mi@ubuntu:~/Desktop/demo$ git add readme.txt
mi@ubuntu:~/Desktop/demo$ git commit -m "add"
[dev d03f87b] add
1 file changed, 1 deletion(-)
mi@ubuntu:~/Desktop/demo$ git checkout master
Switched to branch 'master'
mi@ubuntu:~/Desktop/demo$ git branch
dev
issue-101
* master
mi@ubuntu:~/Desktop/demo$ git branch -d dev 这里提示还没有完成合并,加入-D参数可以强制删除分支
或者是其他原因导致不能直接删除
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.
mi@ubuntu:~/Desktop/demo$ git branch -d issue-101
Deleted branch issue-101 (was 1644202).
mi@ubuntu:~/Desktop/demo$ git branch -D dev
Deleted branch dev (was d03f87b).
mi@ubuntu:~/Desktop/demo$ git branch
* master
标签管理:
我们在使用git log命令查看历史的时候会出来一大串commit号不好辨识,打标签是为了方便使用辨识。
创建标签:
mi@ubuntu:~/Desktop/demo$ git branch
* master
mi@ubuntu:~/Desktop/demo$ git tag v1.0
mi@ubuntu:~/Desktop/demo$ git tag 查看标签
v1.0
可以找到历史提交的commit id打标签:
mi@ubuntu:~/Desktop/demo$ git log --pretty=oneline --abbrev-commit
3ba476a merge bug fix 101
1644202 fix bug 101
7687817 merge with no-ff
c9ed0b0 add merge
0925bf0 merge with no-ff
42adf39 add merge
d758c59 conflict fix
efb7433 & simple
673899c AND simple
ec7236b conflict fixed
38f1038 & simple
701d07b AND simple
4b4a010 branch test
ccc7a4d test
80b06b9 add readme.txt
3ee6806 add readme.txt
6af4dd7 add readme.txt
58aa685 add readme.txt
b2c2c7d add 3 files.
e66e360 wtrote a readme file
f177193 add readme.md
mi@ubuntu:~/Desktop/demo$ git tag v0.9 1644202 打标签
mi@ubuntu:~/Desktop/demo$ git tag 查看所有标签
v0.9
v1.0
标签是按照字母排序的:可以使用git show查看,还可以加参数:-a 指定版本号,-m指定说明文字
mi@ubuntu:~/Desktop/demo$ git show v0.9
commit 1644202adad7fa815c0c56e9dc6f1f69d6906ca9
Author: xuefeilong <xuefeilong@xiaomi.com>
Date: Thu Jan 24 15:18:14 2019 +0800
fix bug 101
diff --git a/readme.txt b/readme.txt
index cb62dc1..1ab8b4e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,3 @@
Git is a distributed version control system.
-Git is free software distributed under the GPL.
+Git is a free software distributed under the GPL.
Git has a mutable index called stage.
操作标签:删除本地标签
mi@ubuntu:~/Desktop/demo$ git tag
v0.1
v0.9
v1.0
mi@ubuntu:~/Desktop/demo$ git tag -d v0.1
Deleted tag 'v0.1' (was 468c2ef)
mi@ubuntu:~/Desktop/demo$ git tag
v0.9
v1.0