Git分布式版本控制系统

关键字 git 版本控制 分布式

前言:

git是与svn这类集中式版本控制的分布式版本控制,相对于集中式:

一、安装

1.yum install -y git

二、创建版本库

1、创建一个目录作为仓库

1.mkdir repo <---repo这个名字随意

2、初始化仓库

1.git init
1.[root@centos-1 repo]# pwd
2./home/lcr/repo
3.[root@centos-1 repo]# git init
4.初始化空的 Git 版本库于 /home/lcr/repo/.git/

其中.git这个目录是Git来跟踪管理版本库的,一般不用改动,会导致混乱,如果查看不到,可以使用ls -ah指令,因为通常.git是隐藏的

3、创建文件并加入git

添加文件到git仓库

1.git add filename
1.[root@centos-1 repo]# vim readme.txt
2.[root@centos-1 repo]# git add readme.txt
1.Git is a version control system
2.Git is free software
3.This is LCR`s git

提交文件

1.git commit
1.[root@centos-1 repo]# git commit -m "wrote a readme file"
2.[master(根提交) d7c65c7] wrote a readme file
3. Committer: root <root@centos-1.lan>
4.您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
5.与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:
6.
7. git config --global user.name "Your Name"
8. git config --global user.email you@example.com
9.
10.设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
11.
12. git commit --amend --reset-author
13.
14. 1 file changed, 3 insertions(+)
15. create mode 100644 readme.txt
16.[root@centos-1 repo]# vim readme.txt

其中分号内的内容为标签,类似于注释,说明修改了什么内容,人为添加

4、概念

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

Alt text

分支和HEAD的概念我们以后再讲。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

三、使用实践

1、查看更改状态

1.git status
1.[root@centos-1 repo]# git status
2.# 位于分支 master
3.# 尚未暂存以备提交的变更:
4.# (使用 "git add <file>..." 更新要提交的内容)
5.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
6.#
7.# 修改: readme.txt
8.#
9.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

2、查看变更

1.git diff filename
1.[root@centos-1 repo]# git diff readme.txt
2.diff --git a/readme.txt b/readme.txt
3.index 95f930c..55a32c0 100644
4.--- a/readme.txt
5.+++ b/readme.txt
6.@ -1,3 +1,4 @@
7. Git is a version control system
8. Git is free software
9. This is LCR`s git!!!!
10.+emil: laicr0729@gmail.com

3、查看修改日志

1.git log
1.[root@centos-1 repo]# git log
2.commit ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311
3.Author: fatcatsk <laicr0729@gmail.com>
4.Date: Sun Sep 24 20:40:42 2017 +0800
5.
6. add emil
7.
8.commit 07da92c8445a54f5042f73b59114eaaa3bc4b24d
9.Author: fatcatsk <laicr0729@gmail.com>
10.Date: Sun Sep 24 19:55:25 2017 +0800
11.
12. wrote a readme file
13.
14.commit aeaa66112b784907e0c566c6c6c1065e50440ffc
15.Author: root <root@centos-1.lan>
16.Date: Sun Sep 24 19:51:23 2017 +0800
17.
18. wrote a readme file

增加参数--pretty=oneline可以使得排版跟清晰

1.[root@centos-1 repo]# git log --pretty=oneline
2.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
3.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
4.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file

其中ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311为哈希值,类似于ID

4、版本回退

1.git reset --hard HEAD

用HEAD表示当前版本,也就是最新的提交ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311
上一个版本就是HEAD^,上上一个版本就是HEAD^^,
100个版本写100个^比较容易数不过来,所以写成HEAD~100

1.[root@centos-1 repo]# git log --pretty=oneline
2.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
3.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
4.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file
5.[root@centos-1 repo]# git reset --hard HEAD^^
6.HEAD 现在位于 aeaa661 wrote a readme file
7.[root@centos-1 repo]# cat readme.txt
8.Git is a version control system
9.Git is free software
10.This is LCR`s git
11.[root@centos-1 repo]# ls
12.readme.txt
13.[root@centos-1 repo]# git log
14.commit aeaa66112b784907e0c566c6c6c1065e50440ffc
15.Author: root <root@centos-1.lan>
16.Date: Sun Sep 24 19:51:23 2017 +0800
17.
18. wrote a readme file

从上面可以看到另外两个状态不见了
只要窗口还未关闭,就可以恢复,使用前面获取的ID

1.[root@centos-1 repo]# git reset --hard ceeb1
2.HEAD 现在位于 ceeb13d add emil
3.[root@centos-1 repo]# ls
4.html readme.txt
5.[root@centos-1 repo]#

不用完全复制ID,只需要其中开头一部分

如果已经重启了,看到ID了呢

1.[root@centos-1 repo]# git log --pretty=oneline <---查看当前状态
2.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
3.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
4.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file
5.[root@centos-1 repo]# git reset --hard HEAD^^ <---会退到上上个版本
6.HEAD 现在位于 aeaa661 wrote a readme file
7.[root@centos-1 repo]# git log <---查看当前的状态
8.commit aeaa66112b784907e0c566c6c6c1065e50440ffc
9.Author: root <root@centos-1.lan>
10.Date: Sun Sep 24 19:51:23 2017 +0800
11.
12. wrote a readme file
13.[root@centos-1 repo]# git reset --hard HEAD^ <---尝试回退,但是无效
14.fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
15.Use '--' to separate paths from revisions, like this:
16.'git <command> [<revision>...] -- [<file>...]'
17.[root@centos-1 repo]# git reflog <---查看操作日志
18.aeaa661 HEAD@{0}: reset: moving to HEAD^^
19.ceeb13d HEAD@{1}: reset: moving to ceeb1 <---获的上个状态的ID:ceeb13d
20.aeaa661 HEAD@{2}: reset: moving to HEAD^^
21.ceeb13d HEAD@{3}: commit: add emil
22.07da92c HEAD@{4}: commit: wrote a readme file
23.aeaa661 HEAD@{5}: commit (amend): wrote a readme file
24.d7c65c7 HEAD@{6}: commit (initial): wrote a readme file
25.[root@centos-1 repo]# git reset --hard ceeb13d <---回退到ID:ceeb13d
26.HEAD 现在位于 ceeb13d add emil
27.[root@centos-1 repo]# git log --pretty=oneline <---查看现在的状况
28.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
29.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
30.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file

5、管理修改

1.[root@centos-1 repo]# git log --pretty=oneline
2.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
3.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
4.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file
5.[root@centos-1 repo]# cat readme.txt <----查看现在的readme.txt
6.Git is a version control system
7.Git is free software
8.This is LCR`s git!!!!
9.emil: laicr0729@gmail.com
10.[root@centos-1 repo]# vim readme.txt
11.[root@centos-1 repo]# cat readme.txt
12.Git is a version control system
13.Git is free software
14.This is LCR`s git!!!!
15.emil: laicr0729@gmail.com
16.adr:guangzhou <---添加了adr
17.[root@centos-1 repo]# git add readme.txt <----将修改从工作区添加到暂存区
18.[root@centos-1 repo]# vim readme.txt
19.[root@centos-1 repo]# cat readme.txt
20.Git is a version control system
21.Git is free software
22.This is LCR`s git!!!!
23.emil: laicr0729@gmail.com
24.adr:guangzhou
25.time:201792421:44:45 <---添加了time
26.[root@centos-1 repo]# git commit -m "add adr & time" <---提交修改
27.[master 53ea31b] add adr & time
28. 1 file changed, 1 insertion(+)
29.[root@centos-1 repo]# git status
30.# 位于分支 master
31.# 尚未暂存以备提交的变更:
32.# (使用 "git add <file>..." 更新要提交的内容)
33.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
34.#
35.# 修改: readme.txt
36.#
37.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
38.[root@centos-1 repo]# git diff readme.txt
39.diff --git a/readme.txt b/readme.txt
40.index 3d602e3..013f64e 100644
41.--- a/readme.txt
42.+++ b/readme.txt
43.@@ -3,3 +3,4 @@ Git is free software
44. This is LCR`s git!!!!
45. emil: laicr0729@gmail.com
46. adr:guangzhou
47.+time:201792421:44:45 <---确认修改了
48.[root@centos-1 repo]# git log --pretty=oneline <---查看以提交的修改
49.53ea31bdbc5c37a8ba6aa8d0464e9f0b01b23501 add adr & time
50.ceeb13d0193d9ce0ed4b97862aeb0ac75ca05311 add emil
51.07da92c8445a54f5042f73b59114eaaa3bc4b24d wrote a readme file
52.aeaa66112b784907e0c566c6c6c1065e50440ffc wrote a readme file
53.[root@centos-1 repo]# cat readme.txt
54.Git is a version control system
55.Git is free software
56.This is LCR`s git!!!!
57.emil: laicr0729@gmail.com
58.adr:guangzhou
59.time:201792421:44:45
60.[root@centos-1 repo]# git reset --hard 53ea31 <---回退到最新版本
61.HEAD 现在位于 53ea31b add adr & time
62.[root@centos-1 repo]# cat readme.txt
63.Git is a version control system
64.Git is free software
65.This is LCR`s git!!!!
66.emil: laicr0729@gmail.com
67.adr:guangzhou <---最新版本中没有time这个
68.[root@centos-1 repo]#

第一次修改工作区中的readme.txt,添加了adr字段,并git add,将工作区的修改添加到暂存区
第二次修改工作区中的readme.txt,但是没有使用git add 将修改添加到暂存区
最后使用git commit,将暂存区的修改提交到版本库
其中第二次修改并未被提交

6、撤销修改

1.[root@centos-1 repo]# cat readme.txt
2.Git is a version control system
3.Git is free software
4.This is LCR`s git!!!!
5.emil: laicr0729@gmail.com
6.adr:guangzhou
7.[root@centos-1 repo]# vim readme.txt
8.[root@centos-1 repo]# cat readme.txt
9.Git is a version control system
10.Git is free software
11.This is LCR`s git!!!!
12.emil: laicr0729@gmail.com
13.adr:guangzhou
14.2017年9月24日22:10:34 <---工作区中的文件readme.txt添加了字段
15.[root@centos-1 repo]# git checkout -- readme.txt <---撤销工作区文件readme.txt的修改
16.[root@centos-1 repo]# cat readme.txt
17.Git is a version control system
18.Git is free software
19.This is LCR`s git!!!!
20.emil: laicr0729@gmail.com
21.adr:guangzhou <---工作区文件readme.txt 添加的字段被撤销了
22.[root@centos-1 repo]# vim readme.txt
23.[root@centos-1 repo]# cat readme.txt
24.Git is a version control system
25.Git is free software
26.This is LCR`s git!!!!
27.emil: laicr0729@gmail.com
28.adr:guangzhou
29.time:2017年9月24日22:15:52 <----工作区中的文件readme.txt添加了字段
30.[root@centos-1 repo]# git add readme.txt <---将工作区的修改添加到暂存区
31.[root@centos-1 repo]# git checkout readme.txt <---撤销修改
32.[root@centos-1 repo]# cat readme.txt
33.Git is a version control system
34.Git is free software
35.This is LCR`s git!!!!
36.emil: laicr0729@gmail.com
37.adr:guangzhou
38.time:2017年9月24日22:15:52 <---添加到暂存区的修改不能被撤销
39.[root@centos-1 repo]# vim readme.txt
40.[root@centos-1 repo]# cat readme.txt
41.Git is a version control system
42.Git is free software
43.This is LCR`s git!!!!
44.emil: laicr0729@gmail.com
45.adr:guangzhou
46.time:2017年9月24日22:15:52
47.[root@centos-1 repo]# git add readme.txt
48.[root@centos-1 repo]# vim readme.txt
49.[root@centos-1 repo]# cat readme.txt
50.Git is a version control system
51.Git is free software
52.This is LCR`s git!!!!
53.emil: laicr0729@gmail.com
54.adr:guangzhou
55.time:2017年9月24日22:15:52
56.time:2017年9月24日22:18:34 <---添加到暂存区后又添加的字段
57.[root@centos-1 repo]# git checkout readme.txt
58.[root@centos-1 repo]# cat readme.txt
59.Git is a version control system
60.Git is free software
61.This is LCR`s git!!!!
62.emil: laicr0729@gmail.com
63.adr:guangzhou
64.time:2017年9月24日22:15:52 <---只撤销没有添加到暂存区的字段

总结

  • 撤销修改只能撤销工作区内的修改,恢复到最后一次add或者commit的状态
  • 已经add的修改不会被撤销

7、删除文件

1.[root@centos-1 repo]# vim test.txt
2.[root@centos-1 repo]# ls
3.html readme.txt test.txt
4.[root@centos-1 repo]# git add test.txt
5.[root@centos-1 repo]# git commit -m "add test.txt"
6.[master 7b27310] add test.txt
7. 2 files changed, 2 insertions(+)
8. create mode 100644 test.txt <---提交了test.txt
9.[root@centos-1 repo]# rm test.txt <---删除文件
10.rm:是否删除普通文件 "test.txt"?y
11.[root@centos-1 repo]# ls
12.html readme.txt
13.[root@centos-1 repo]# git status
14.# 位于分支 master
15.# 尚未暂存以备提交的变更:
16.# (使用 "git add/rm <file>..." 更新要提交的内容)
17.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
18.#
19.# 删除: test.txt <---提示删除了文件
20.#
21.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
22.[root@centos-1 repo]# git checkout -- test.txt <---撤销了删除
23.[root@centos-1 repo]# ls
24.html readme.txt test.txt <---文件恢复了
25.[root@centos-1 repo]# rm test.txt
26.rm:是否删除普通文件 "test.txt"?y
27.[root@centos-1 repo]# git status
28.# 位于分支 master
29.# 尚未暂存以备提交的变更:
30.# (使用 "git add/rm <file>..." 更新要提交的内容)
31.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
32.#
33.# 删除: test.txt <---提示删除了文件
34.#
35.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
36.[root@centos-1 repo]# ls
37.html readme.txt
38.[root@centos-1 repo]# git rm test.txt <---git中删除test.txt
39.rm 'test.txt'
40.[root@centos-1 repo]# git checkout test.txt <---尝试撤销无效
41.error: pathspec 'test.txt' did not match any file(s) known to git.
42.[root@centos-1 repo]# git commit -m "test.txt" <---提交修改
43.[master 4605677] test.txt
44. 1 file changed, 1 deletion(-)
45. delete mode 100644 test.txt

四、远程仓库

1、添加ssh-key

Alt text

1.[root@centos-1 repo]# ssh -T git@github.com
2.The authenticity of host 'github.com (192.30.255.112)' can't be established.
3.RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
4.Are you sure you want to continue connecting (yes/no)? yes
5.Warning: Permanently added 'github.com,192.30.255.112' (RSA) to the list of known hosts.
6.Hi fatcatsk! You've successfully authenticated, but GitHub does not provide shell access.

2、添加远程创库

Alt text

Alt text

Alt text

1.[root@centos-1 repo]# git remote add origin git@github.com/fatcatsk/fatcatsk.github.io
2.[root@centos-1 repo]# git push -u origin master
3.fatal: 'git@github.com/fatcatsk/fatcatsk.github.io' does not appear to be a git repository
4.fatal: Could not read from remote repository.
5.
6.Please make sure you have the correct access rights
7.and the repository exists.
8.[root@centos-1 repo]# git remote add origin git@github.com/fatcatsk/git.git
9.fatal: 远程 origin 已经存在。
10.[root@centos-1 repo]# git remote add gitrepo git@github.com/fatcatsk/git.git
11.[root@centos-1 repo]# git push -u gitrepo master
12.fatal: 'git@github.com/fatcatsk/git.git' does not appear to be a git repository
13.fatal: Could not read from remote repository.
14.
15.Please make sure you have the correct access rights
16.and the repository exists.
17.[root@centos-1 repo]# git remote add learngit https://github.com/fatcatsk/git.git
18.[root@centos-1 repo]# git push -u learngit master
19.Username for 'https://github.com': fatcatsk
20.Password for 'https://fatcatsk@github.com':
21.Counting objects: 20, done.
22.Delta compression using up to 4 threads.
23.Compressing objects: 100% (16/16), done.
24.Writing objects: 100% (20/20), 3.79 KiB | 0 bytes/s, done.
25.Total 20 (delta 5), reused 0 (delta 0)
26.remote: Resolving deltas: 100% (5/5), done.
27.To https://github.com/fatcatsk/git.git
28. * [new branch] master -> master
29.分支 master 设置为跟踪来自 learngit 的远程分支 master。

Alt text

这种连接方式需要密码

1.[root@centos-1 repo]# git remote add gitrepo git@github.com/fatcatsk/git.git
2.[root@centos-1 repo]# git push -u gitrepo master
3.fatal: 'git@github.com/fatcatsk/git.git' does not appear to be a git repository
4.fatal: Could not read from remote repository.
5.
6.Please make sure you have the correct access rights
7.and the repository exists.

错误之处:git@github.com/fatcatsk/git.git
改为:
git@github.com:fatcatsk/git.git

1.[root@centos-1 repo]# vim time.txt
2.[root@centos-1 repo]# git add time.txt
3.[root@centos-1 repo]# git commit -m "add time.txt"
4.[master ae57f6c] add time.txt
5. 1 file changed, 1 insertion(+)
6. create mode 100644 time.txt
7.[root@centos-1 repo]# git remote add gitssh git@github.com:fatcatsk/git.git
8.[root@centos-1 repo]# git push -u gitssh master
9.Counting objects: 4, done.
10.Delta compression using up to 4 threads.
11.Compressing objects: 100% (2/2), done.
12.Writing objects: 100% (3/3), 339 bytes | 0 bytes/s, done.
13.Total 3 (delta 0), reused 0 (delta 0)
14.To git@github.com:fatcatsk/git.git
15. 4605677..ae57f6c master -> master
16.分支 master 设置为跟踪来自 gitssh 的远程分支 master。
1.[root@centos-1 repo]# git remote add fatcatsk git@github.com:fatcatsk/fatcatsk.github.io
2.[root@centos-1 repo]# git push -u fatcatsk master
3.To git@github.com:fatcatsk/fatcatsk.github.io
4. ! [rejected] master -> master (fetch first)
5.error: 无法推送一些引用到 'git@github.com:fatcatsk/fatcatsk.github.io'
6.提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外
7.提示:一个版本库已推送了相同的引用。再次推送前,您可能需要先合并远程变更
8.提示:(如 'git pull')。
9.提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。

3、克隆远程仓库

1.git clone
1.[root@centos-1 repo]# git clone git@github.com:fatcatsk/fatcatsk.github.io
2.正克隆到 'fatcatsk.github.io'...
3.remote: Counting objects: 167, done.
4.remote: Compressing objects: 100% (51/51), done.
5.remote: Total 167 (delta 27), reused 0 (delta 0), pack-reused 116
6.接收对象中: 100% (167/167), 2.40 MiB | 301.00 KiB/s, done.
7.处理 delta 中: 100% (87/87), done.
8.[root@centos-1 repo]# ls
9.fatcatsk.github.io git.html
1.[root@centos-1 repo]# cd fatcatsk.github.io/
2.[root@centos-1 fatcatsk.github.io]# ls
3.ansible操作实践.html _config.yml
4.Ansible中文手册.html docker.html
5.CentOS7 LAMP mediawiki.html git.html
6.CentOS7_LNMP_mediawiki.html MySQL主从同步.html
7.CentOS7 yum 安装 MySQL.html README.md
8.CentOS7 安装 Zaibbix3.0.html 欢迎来到fatcat的博客.html
9.CentOS yum 升级PHP7.0.html [转载]Ansible :一个配置管理和IT自动化工具.html
10.CentOS 升级 Python3.6.html
11.[root@centos-1 fatcatsk.github.io]# git add git.html
12.[root@centos-1 fatcatsk.github.io]# git commit -m "add git.html"
13.[master b0e501b] add git.html
14. 1 file changed, 777 insertions(+)
15. create mode 100644 git.html
16.[root@centos-1 fatcatsk.github.io]# git status
17.# 位于分支 master
18.# 您的分支领先 'origin/master' 共 1 个提交。
19.# (使用 "git push" 来发布您的本地提交)
20.#
21.无文件要提交,干净的工作区
22.[root@centos-1 fatcatsk.github.io]# git push -u fatcatsk master
23.fatal: 'fatcatsk' does not appear to be a git repository
24.fatal: Could not read from remote repository.
25.
26.Please make sure you have the correct access rights
27.and the repository exists.
28.[root@centos-1 fatcatsk.github.io]# git push -u git@github.com:fatcatsk/fatcatsk.github.io master
29.Counting objects: 4, done.
30.Delta compression using up to 4 threads.
31.Compressing objects: 100% (3/3), done.
32.Writing objects: 100% (3/3), 383.69 KiB | 0 bytes/s, done.
33.Total 3 (delta 1), reused 0 (delta 0)
34.remote: Resolving deltas: 100% (1/1), completed with 1 local object.
35.To git@github.com:fatcatsk/fatcatsk.github.io
36. d531135..b0e501b master -> master
37.分支 master 设置为跟踪来自 git@github.com:fatcatsk/fatcatsk.github.io 的远程分支 master。
38.

五、分支管理

1、原理说明:

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支
HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

master分支说明

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

创建dev分支

现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变

使用dev分支

假如在dev上的工作完成了,就可以把dev合并到master上。Git合并就是直接把master指向dev的当前提交,就完成了合并:

移动master分支

合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

删除dev分支


2、创建与合并分支

1、创建并切换分支

1.git checkout -b
1.[root@centos-1 repo]# git checkout -b dev
2.切换到一个新分支 'dev'
3.[root@centos-1 repo]# git status
4.# 位于分支 dev
5.# 未跟踪的文件:
6.# (使用 "git add <file>..." 以包含要提交的内容)
7.#
8.# fatcatsk.github.io/
9.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

2、查看分支

1.git branch
1.[root@centos-1 repo]# git branch
2.* dev
3. master

3、修改分支

1、创建并编辑readme.txt

1.[root@centos-1 repo]# vim readme.txt
2.[root@centos-1 repo]# cat readme.txt
3.Create a new branch
1.[root@centos-1 repo]# git status
2.# 位于分支 dev
3.# 未跟踪的文件:
4.# (使用 "git add <file>..." 以包含要提交的内容)
5.#
6.# fatcatsk.github.io/
7.# readme.txt
8.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

2、提交变更

1.[root@centos-1 repo]# git add readme.txt
2.[root@centos-1 repo]# git status
3.# 位于分支 dev
4.# 要提交的变更:
5.# (使用 "git reset HEAD <file>..." 撤出暂存区)
6.#
7.# 新文件: readme.txt
8.#
9.# 未跟踪的文件:
10.# (使用 "git add <file>..." 以包含要提交的内容)
11.#
12.# fatcatsk.github.io/
13.[root@centos-1 repo]# git commit -m "new branch"
14.[dev 259f8a7] new branch
15. 1 file changed, 1 insertion(+)
16. create mode 100644 readme.txt
17.[root@centos-1 repo]# git status
18.# 位于分支 dev
19.# 未跟踪的文件:
20.# (使用 "git add <file>..." 以包含要提交的内容)
21.#
22.# fatcatsk.github.io/
23.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

4、切换分支

1.git checkout

1.[root@centos-1 repo]# git checkout -b master
2.fatal: 一个分支名 'master' 已经存在。
1.[root@centos-1 repo]# git checkout master
2.切换到分支 'master'
3.您的分支领先 'gitssh/master' 共 2 个提交。
4. (使用 "git push" 来发布您的本地提交)
1.[root@centos-1 repo]# cat readme.txt
2.cat: readme.txt: 没有那个文件或目录

5、合并分支

1.git merge

切换分支

1.[root@centos-1 repo]# git merge dev
2.更新 a4338a6..259f8a7
3.Fast-forward
4. readme.txt | 1 +
5. 1 file changed, 1 insertion(+)
6. create mode 100644 readme.txt

合并后,分支dev上创建的文件可以正常查看到了

1.[root@centos-1 repo]# cat readme.txt
2.Create a new branch

6、删除分支

1.git branch -d
1.[root@centos-1 repo]# git branch
2. dev
3.* master
4.[root@centos-1 repo]# git branch -d dev
5.已删除分支 dev(曾为 259f8a7)。
6.[root@centos-1 repo]# git branch
7.* master
8.[root@centos-1 repo]#

总结

操作 指令
查看分支 git branch
创建分支 git branch
切换分支 git checkout
创建+切换分支 git checkout -b
合并某分支到当前分支 git merge
删除分支 git branch -d

到这里对前面的撤销修改就比较理解了,工作区的修改再未提交之前,切换到分支,就会恢复到修改之前的状态,因为还没有提交,这部分修改没有写入当前分支

3、解决冲突

1、切换到分支下修改文件,并提交

1.[root@centos-1 repo]# git checkout newbranch
2.切换到分支 'newbranch'
3.[root@centos-1 repo]# ls
4.fatcatsk.github.io new.txt readme.txt
5.[root@centos-1 repo]# vim new.txt
6.[root@centos-1 repo]# cat new.txt
7.this is a newbranch
8.time:201792510:58:16
9.[root@centos-1 repo]# git add new.txt
10.[root@centos-1 repo]# git commit -m "new.txt add time"
11.[newbranch bb1751e] new.txt add time
12. 1 file changed, 1 insertion(+)

2、切换到master,修改文件并提交

1.[root@centos-1 repo]# git checkout master
2.切换到分支 'master'
3.您的分支领先 'gitssh/master'6 个提交。
4. (使用 "git push" 来发布您的本地提交)
5.[root@centos-1 repo]# ls
6.fatcatsk.github.io master.txt new.txt readme.txt
7.[root@centos-1 repo]# vim new.txt
8.[root@centos-1 repo]# cat new.txt
9.this is a newbranch
10.time:当前时间:10:59:38
11.[root@centos-1 repo]# git add new.txt
12.[root@centos-1 repo]# git commit -m "master add time"
13.[master d7f00d2] master add time
14. 1 file changed, 1 insertion(+)

3、合并分支newbranch

1.[root@centos-1 repo]# git merge newbranch
2.自动合并 new.txt
3.冲突(内容):合并冲突于 new.txt
4.自动合并失败,修正冲突然后提交修正的结果。

4、查看状态

1.[root@centos-1 repo]# git status
2.# 位于分支 master
3.# 您的分支领先 'gitssh/master' 共 7 个提交。
4.# (使用 "git push" 来发布您的本地提交)
5.#
6.# 您有尚未合并的路径。
7.# (解决冲突并运行 "git commit")
8.#
9.# 未合并的路径:
10.# (使用 "git add <file>..." 标记解决方案)
11.#
12.# 双方修改: new.txt
13.#
14.# 未跟踪的文件:
15.# (使用 "git add <file>..." 以包含要提交的内容)
16.#
17.# fatcatsk.github.io/
18.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

此处说明了冲突的地方

5、查看文件

1.[root@centos-1 repo]# cat new.txt
2.this is a newbranch
3.<<<<<<< HEAD
4.time:当前时间:10:59:38
5.=======
6.time:2017年9月25日10:58:16
7.>>>>>>> newbranch

6、编辑冲突文件

1.[root@centos-1 repo]# vim new.txt
2.[root@centos-1 repo]# cat new.txt
3.this is a newbranch
4.time:当前时间:10:59:38
5.time:2017年9月25日10:58:16
6.[root@centos-1 repo]# git add new.txt
7.[root@centos-1 repo]# git commit -m "megre both change"
8.[master 0632fa3] megre both change

7、重新合并分支

1.[root@centos-1 repo]# git merge newbranch
2.Already up-to-date.

8、查看变更状态

1.[root@centos-1 repo]# git log --graph --pretty=oneline --abbrev-commit
2.* 0632fa3 megre both change
3.|\
4.| * bb1751e new.txt add time
5.* | d7f00d2 master add time
6.* | 68979a1 Merge branch 'newbranch'
7.|\ \
8.| |/
9.| * c5b6022 create new.txt
10.* | ec07515 creat master.txt
11.|/
12.* 259f8a7 new branch
13.* a4338a6 delete
14.* a891a1f add git.html
15.* ae57f6c add time.txt
16.* 4605677 test.txt
17.* 7b27310 add test.txt
18.* 53ea31b add adr & time
19.* ceeb13d add emil
20.* 07da92c wrote a readme file
21.* aeaa661 wrote a readme file
22.[root@centos-1 repo]#

4、bug分支

使用场景:当前分支的工作区中还有未提交但是还不能提交的任务,又有需要处理的,将当前工作区的内容暂时储存起来

1、保存

1.git stash
1.[root@centos-1 repo]# git branch <---查看分支
2.* master
3. newbranch
4.[root@centos-1 repo]# ls
5.fatcatsk.github.io master.txt new.txt readme.txt
6.[root@centos-1 repo]# vim new.txt <---编辑文件
7.[root@centos-1 repo]# cat new.txt
8.this is a newbranch
9.time:当前时间:10:59:33
10.time:201792510:58:16
11.begin a new job
12.[root@centos-1 repo]# git status <---查看当前状况
13.# 位于分支 master
14.# 尚未暂存以备提交的变更:
15.# (使用 "git add <file>..." 更新要提交的内容)
16.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
17.#
18.# 修改: new.txt <---显示当前工作区有未提交的内容
19.#
20.# 未跟踪的文件:
21.# (使用 "git add <file>..." 以包含要提交的内容)
22.#
23.# fatcatsk.github.io/
24.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
25.[root@centos-1 repo]# git stash <---保存未提交的内容
26.Saved working directory and index state WIP on master: 0632fa3 megre both change
27.HEAD 现在位于 0632fa3 megre both change
28.[root@centos-1 repo]# git status <---重新查看当前状况兵器显示当前没有内容
29.# 位于分支 master
30.# 未跟踪的文件:
31.# (使用 "git add <file>..." 以包含要提交的内容)
32.#
33.# fatcatsk.github.io/
34.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

2、恢复

1.[root@centos-1 repo]# vim new.txt
2.[root@centos-1 repo]# cat new.txt
3.this is a newbranch
4.time:当前时间:10:59:33
5.time:2017年9月25日10:58:16
6.begin a new job
7.[root@centos-1 repo]# git status #查看状态
8.# 位于分支 master
9.# 尚未暂存以备提交的变更:
10.# (使用 "git add <file>..." 更新要提交的内容)
11.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
12.#
13.# 修改: new.txt
14.#
15.# 未跟踪的文件:
16.# (使用 "git add <file>..." 以包含要提交的内容)
17.#
18.# fatcatsk.github.io/
19.修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
20.[root@centos-1 repo]# git stash #保存装填
21.Saved working directory and index state WIP on master: 0632fa3 megre both change
22.HEAD 现在位于 0632fa3 megre both change
23.[root@centos-1 repo]# git status
24.# 位于分支 master
25.# 未跟踪的文件:
26.# (使用 "git add <file>..." 以包含要提交的内容)
27.#
28.# fatcatsk.github.io/
29.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
30.[root@centos-1 repo]# git checkout newbranch #切换分支
31.切换到分支 'newbranch'
32.[root@centos-1 repo]# ls
33.fatcatsk.github.io new.txt readme.txt
34.[root@centos-1 repo]# cat new.txt
35.this is a newbranch
36.time:2017年9月25日10:58:16
37.[root@centos-1 repo]# vim new.txt
38.[root@centos-1 repo]# cat new.txt
39.this is a newbranch
40.time:2017年9月25日10:58:16
41.this is bug fix
42.[root@centos-1 repo]# git add new.txt
43.[root@centos-1 repo]# git commit -m "bug fix"
44.[newbranch 82feae0] bug fix
45. 1 file changed, 1 insertion(+)
46.[root@centos-1 repo]# git checkout master
47.切换到分支 'master'
48.[root@centos-1 repo]# git status #查看状态
49.# 位于分支 master
50.# 未跟踪的文件:
51.# (使用 "git add <file>..." 以包含要提交的内容)
52.#
53.# fatcatsk.github.io/
54.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
55.[root@centos-1 repo]# git stash list #查看保存的状态
56.stash@{0}: WIP on master: 0632fa3 megre both change
57.[root@centos-1 repo]# git stash apply #恢复状态
58.# 位于分支 master
59.# 尚未暂存以备提交的变更:
60.# (使用 "git add <file>..." 更新要提交的内容)
61.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
62.#
63.# 修改: new.txt
64.#
65.# 未跟踪的文件:
66.# (使用 "git add <file>..." 以包含要提交的内容)
67.#
68.# fatcatsk.github.io/
69.修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
70.[root@centos-1 repo]# git stash list
71.stash@{0}: WIP on master: 0632fa3 megre both change
72.[root@centos-1 repo]# git stash drop
73.丢弃了 refs/stash@{0} (acde223aa03f152e49ef541e314f3dff197e7ae9)
74.[root@centos-1 repo]# git stash
75.Saved working directory and index state WIP on master: 0632fa3 megre both change
76.HEAD 现在位于 0632fa3 megre both change
77.[root@centos-1 repo]# vim new.txt
78.[root@centos-1 repo]# git stash
79.Saved working directory and index state WIP on master: 0632fa3 megre both change
80.HEAD 现在位于 0632fa3 megre both change
81.[root@centos-1 repo]# git list
82.git:'list' 不是一个 git 命令。参见 'git --help'。
83.
84.您指的是这其中的某一个么?
85. bisect
86. rev-list
87.[root@centos-1 repo]# git stash list
88.stash@{0}: WIP on master: 0632fa3 megre both change
89.stash@{1}: WIP on master: 0632fa3 megre both change
90.[root@centos-1 repo]# cat new.txt
91.this is a newbranch
92.time:当前时间:10:59:33
93.time:2017年9月25日10:58:16
94.[root@centos-1 repo]# git stash@{1} apply
95.git:'stash@{1}' 不是一个 git 命令。参见 'git --help'。
96.[root@centos-1 repo]# git --h
97.--help --html-path
98.[root@centos-1 repo]# git stash apply stash@{1}
99.# 位于分支 master
100.# 尚未暂存以备提交的变更:
101.# (使用 "git add <file>..." 更新要提交的内容)
102.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
103.#
104.# 修改: new.txt
105.#
106.# 未跟踪的文件:
107.# (使用 "git add <file>..." 以包含要提交的内容)
108.#
109.# fatcatsk.github.io/
110.修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
111.[root@centos-1 repo]# cat new.txt
112.this is a newbranch
113.time:当前时间:10:59:33
114.time:2017年9月25日10:58:16
115.begin a new job
116.[root@centos-1 repo]# git stash list
117.stash@{0}: WIP on master: 0632fa3 megre both change
118.stash@{1}: WIP on master: 0632fa3 megre both change
119.[root@centos-1 repo]# git stash apply stash@{0}
120.error: Your local changes to the following files would be overwritten by merge:
121. new.txt
122.Please, commit your changes or stash them before you can merge.
123.Aborting
124.[root@centos-1 repo]# cat new.txt
125.this is a newbranch
126.time:当前时间:10:59:33
127.time:2017年9月25日10:58:16
128.begin a new job
129.[root@centos-1 repo]# git stash apply stash@{1}
130.error: Your local changes to the following files would be overwritten by merge:
131. new.txt
132.Please, commit your changes or stash them before you can merge.
133.Aborting
134.[root@centos-1 repo]# cat new.txt
135.this is a newbranch
136.time:当前时间:10:59:33
137.time:2017年9月25日10:58:16
138.begin a new job
139.[root@centos-1 repo]# git stash list
140.stash@{0}: WIP on master: 0632fa3 megre both change
141.stash@{1}: WIP on master: 0632fa3 megre both change

删除保存

1.[root@centos-1 repo]# git stash drop
2.丢弃了 refs/stash@{0} (3476c2c0f6f14e623979dc742b3404c4e0cba48b)
3.[root@centos-1 repo]# git stash list
4.stash@{0}: WIP on master: 0632fa3 megre both change
5.[root@centos-1 repo]# git stash drop
6.丢弃了 refs/stash@{0} (10f758a1674655605f93dcc9e303f1396434967b)

恢复并删除

1.git stash pop
1.[root@centos-1 repo]# git stash
2.Saved working directory and index state WIP on master: 0632fa3 megre both change
3.HEAD 现在位于 0632fa3 megre both change
4.[root@centos-1 repo]# git status
5.# 位于分支 master
6.# 未跟踪的文件:
7.# (使用 "git add <file>..." 以包含要提交的内容)
8.#
9.# fatcatsk.github.io/
10.提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
11.[root@centos-1 repo]# git stash pop
12.# 位于分支 master
13.# 尚未暂存以备提交的变更:
14.# (使用 "git add <file>..." 更新要提交的内容)
15.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
16.#
17.# 修改: new.txt
18.#
19.# 未跟踪的文件:
20.# (使用 "git add <file>..." 以包含要提交的内容)
21.#
22.# fatcatsk.github.io/
23.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
24.丢弃了 refs/stash@{0} (677cbce65c06dc5276b98726ac2ec7e67e284323)

5、强制删除分支

已经提交但是未合并的分支在删除时,系统会发出警告

1.git branch -D
1.[root@centos-1 repo]# git checkout -b deletebranch
2.M new.txt
3.切换到一个新分支 'deletebranch'
4.[root@centos-1 repo]# vim delete.txt
5.[root@centos-1 repo]# ls
6.delete.txt fatcatsk.github.io master.txt new.txt readme.txt
7.[root@centos-1 repo]# git status
8.# 位于分支 deletebranch
9.# 尚未暂存以备提交的变更:
10.# (使用 "git add <file>..." 更新要提交的内容)
11.# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
12.#
13.# 修改: new.txt
14.#
15.# 未跟踪的文件:
16.# (使用 "git add <file>..." 以包含要提交的内容)
17.#
18.# delete.txt
19.# fatcatsk.github.io/
20.修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
21.[root@centos-1 repo]# git add delete.txt
22.[root@centos-1 repo]# git commit -m "add file"
23.[deletebranch 7f7bb06] add file
24. 1 file changed, 1 insertion(+)
25. create mode 100644 delete.txt
26.[root@centos-1 repo]# git checkout master
27.M new.txt
28.切换到分支 'master'
29.[root@centos-1 repo]# git branch
30. deletebranch
31.* master
32. newbranch
33.[root@centos-1 repo]# git branch -d deletebranch
34.error: 分支 'deletebranch' 没有完全合并。
35.如果您确认要删除它,执行 'git branch -D deletebranch'
36.[root@centos-1 repo]# git branch -D deletebranch
37.已删除分支 deletebranch(曾为 7f7bb06)。
38.[root@centos-1 repo]#

六、标签管理

1、创建及查看标签

1.[root@centos-1 repo]# git tag v0.1 #创建标签
2.[root@centos-1 repo]# git tag #查看标签
3.v0.1

2、根据commit ID创建标签

1.[root@centos-1 repo]# git log --pretty=oneline --abbrev-commit #查看ID
2.0632fa3 megre both change
3.d7f00d2 master add time
4.bb1751e new.txt add time
5.68979a1 Merge branch 'newbranch'
6.ec07515 creat master.txt
7.c5b6022 create new.txt
8.259f8a7 new branch
9.a4338a6 delete
10.a891a1f add git.html
11.ae57f6c add time.txt
12.4605677 test.txt
13.7b27310 add test.txt
14.53ea31b add adr & time
15.ceeb13d add emil
16.07da92c wrote a readme file
17.aeaa661 wrote a readme file
18.[root@centos-1 repo]# git tag v0.09 bb1751e #创建标签
19.[root@centos-1 repo]# git tag
20.v0.09
21.v0.1
22.[root@centos-1 repo]# git show v0.09 #查看标签详细信息
23.commit bb1751e1439b4c36f0a31417a4665cba8e2cb8f1
24.Author: fatcatsk <laicr0729@gmail.com>
25.Date: Mon Sep 25 10:59:03 2017 +0800
26.
27. new.txt add time
28.
29.diff --git a/new.txt b/new.txt
30.index cb5fcd7..2158a2a 100644
31.--- a/new.txt
32.+++ b/new.txt
33.@@ -1 +1,2 @@
34. this is a newbranch
35.+time:201792510:58:16

3、创建带说明的标签

1.git tag -a <name> -m <note>
1.[root@centos-1 repo]# git tag -a v0.08 -m "testtag" ec07515 #指定标签名,说明
2.[root@centos-1 repo]# git show v0.08
3.tag v0.08
4.Tagger: fatcatsk <laicr0729@gmail.com>
5.Date: Mon Sep 25 17:02:04 2017 +0800
6.
7.testtag #标签说明
8.
9.commit ec0751517b31536172020107415cefa8a2e5b594
10.Author: fatcatsk <laicr0729@gmail.com>
11.Date: Mon Sep 25 10:50:40 2017 +0800
12.
13. creat master.txt
14.
15.diff --git a/master.txt b/master.txt
16.new file mode 100644
17.index 0000000..c091147
18.--- /dev/null
19.+++ b/master.txt
20.@@ -0,0 +1 @@
21.+this is master branch

4、操作标签

1.[root@centos-1 repo]# git tag
2.v0.08
3.v0.09
4.v0.1

1、删除本地标签

1.[root@centos-1 repo]# git tag -d v0.08
2.已删除 tag 'v0.08'(曾为 e11721e)

2、以标签推送

1.[root@centos-1 repo]# git push gitssh v0.1
2.Total 0 (delta 0), reused 0 (delta 0)
3.To git@github.com:fatcatsk/git.git
4. * [new tag] v0.1 -> v0.1

3、推送所以标签

1.[root@centos-1 repo]# git push gitssh --tag
2.Total 0 (delta 0), reused 0 (delta 0)
3.To git@github.com:fatcatsk/git.git
4. * [new tag] v0.09 -> v0.09

4、删除已经推送的标签

1、先删除本地的标签

1.[root@centos-1 repo]# git tag -d v0.09
2.已删除 tag 'v0.09'(曾为 bb1751e)

2、删除远程服务器上的标签

1.[root@centos-1 repo]# git push gitssh : refs/tags/v0.09
2.error: src refspec refs/tags/v0.09 does not match any.
3.error: 无法推送一些引用到 'git@github.com:fatcatsk/git.git'
4.[root@centos-1 repo]# git push gitssh :refs/tags/v0.1
5.To git@github.com:fatcatsk/git.git
6. - [deleted] v0.1

https://fatcatsk.github.io/git.html
https://github.com/fatcatsk/git.git
git@github.com:fatcatsk/git.git