git使用基础

版本控制在实际开发中扮演着举足轻重的作用,做为日常中我们经常接触到的版本控制的工具:SVNGit的应用应该是每个程序员所必备的技巧。

简单的理解,其作用是:在开发的过程中,确保由不同人所编辑的同一档案都得到更新(增、删、改、查)。

一. SVN介绍

SVN(Subversion,又称为“时间机器”),是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

集中式版本控制系统

1. Git分布式版本控制 - 图1

集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。下面举例说明:

开始新一天的工作

  1. 从服务器下载项目组最新代码;
  2. 进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了);
  3. 下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器;

缺点:

  • 服务器压力太大,数据库容量暴增;
  • 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等;
  • 不适合开源开发(开发人数非常非常多)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。

优点:

  • 管理方便,逻辑明确,符合一般人思维习惯;
  • 易于管理,集中式服务器更能保证安全性;
  • 代码一致性非常高;
  • 适合开发人数不多的项目开发;
  • 大部分软件配置管理的大学教材都是使用svn和vss.

二. git介绍

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

分布式版本控制系统

1. Git分布式版本控制 - 图2

Git的功能特性

从一般开发者的角度来看,git有以下功能:

  1. 从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
  2. 在自己的机器上根据不同的开发目的,创建分支,修改代码。
  3. 在单机上自己创建的分支上提交代码。
  4. 在单机上合并分支。
  5. 把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
  6. 生成补丁(patch),把补丁发送给主开发者。
  7. 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
  8. 一般开发者之间解决冲突的方法,开发者之间可以使用pull命令解决冲突,解决完冲突之后再向主开发者提交补丁。

从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:

  1. 查看邮件或者通过其它方式查看一般开发者的提交状态。
  2. 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
  3. 向公共服务器提交结果,然后通知所有开发人员。

优点

  • 适合分布式开发,强调个体。
  • 公共服务器压力和数据量都不会太大。
  • 速度快、灵活。
  • 任意两个开发者之间可以很容易的解决冲突。
  • 离线工作。

缺点

  • 学习周期相对而言比较长。
  • 不符合常规思维。
  • 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

三. git理论基础

3.1 Git的交互过程图

1. Git分布式版本控制 - 图3

再看一个图:

1. Git分布式版本控制 - 图4

3.2 重要理论思想:

对于任何一个文件,在Git内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。

  • 已提交表示该文件已经被安全地保存在本地数据库中了;
  • 已修改表示修改了某个文件,但还没有提交保存;
  • 已暂存表示把已修改的文件放在下次提交时要保存的清单中。

用Git 管理项目时,文件流转的三个工作区域:

  • Git的工作目录;
  • 暂存区域;
  • 本地仓库。

1. Git分布式版本控制 - 图5

从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从Git目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。所谓的暂存区域只不过是个简单的文件,一般都放在Git目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。

基本的Git工作流程如下

  1. 在工作目录中修改某些文件;
  2. 对修改后的文件进行快照,然后保存到暂存区域;
  3. 提交更新,将保存在暂存区域的文件快照永久转储到Git目录中;

所以,我们可以从文件所处的位置来判断状态

  • 如果是Git目录中保存着的特定版本文件,就属于已提交状态
  • 如果作了修改并已放入暂存区域,就属于已暂存状态
  • 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态

基本概念

  • 工作区(Working Directory):就是你在电脑里能看到的目录,比如电脑中的learngit文件夹就是一个工作区;
  • 版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库;
  • Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

3.3 git、GitHub和gitlab

Github和Git是两回事。

  • Git是版本控制系统
  • Github是在线的基于Git的代码托管服务。

GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目Ruby on Rails、jQuery、python等。GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,但是付费账户也可以创建私有的代码仓库。地址:https://github.com/

1. Git分布式版本控制 - 图6

  • gitlab是一个基于git实现的在线代码仓库软件,你可以用gitlab自己搭建一个类似于github一样的系统,一般用于在企业、学校等内部网络搭建git私服。

四. git安装

git官网:https://git-scm.com/

  1. [root@localhost ~]# yum install git -y
  2. [root@localhost ~]# git --version
  3. git version 1.8.3.1

也可以选择编译安装最新版本:
Git下载地址:https://github.com/git/git/releases

  1. ##安装依赖关系
  2. yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
  3. ##编译安装
  4. tar -zxf git-2.0.0.tar.gz
  5. cd git-2.0.0
  6. make configure
  7. ./configure
  8. make
  9. make install

五. 使用git

5.1 初次运行Git前的配置

一般在新的系统上,我们都需要先配置下自己的Git工作环境。配置工作只需一次,以后升级时还会沿用现在的配置。当然,如果需要,你随时可以用相同的命令修改已有的配置。

Git 提供了一个叫做 git config的工具(译注:实际是git-config命令,只不过可以通过git加一个名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了Git在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用git config时用–system选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用–global选项,读写的就是这个文件。
  • 当前项目的Git目录中的配置文件(也就是工作目录中的.git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖/etc/gitconfig中的同名变量。

在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 1. Git分布式版本控制 - 图7USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

5.2 用户信息:

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

  1. [root@localhost ~]# git config --global user.name "legolas999" #配置使用git用户
  2. [root@localhost ~]# git config --global user.email "lqr888888@aliyun.com" #配置git使用邮箱
  3. [root@localhost ~]# git config --global color.ui true #语法高亮
  4. [root@localhost ~]# git config --list #查看全局配置
  5. user.name=legolas999
  6. user.email=lqr888888@aliyun.com
  7. color.ui=true
  8. [root@localhost ~]# cat .gitconfig #查看生成的配置文件
  9. [user]
  10. name = legolas999
  11. email = lqr888888@aliyun.com
  12. [color]
  13. ui = true
  14. [root@localhost ~]# git help config 获取config命令的帮助

注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

5.3 创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  1. [root@localhost ~]# mkdir -p /work/project #创建一个目录
  2. [root@localhost ~]# cd /work/project/
  3. [root@localhost project]# git init #初始化仓库
  4. Initialized empty Git repository in /work/project/.git/
  5. [root@localhost project]# git status #查看工作区状态
  6. # On branch master
  7. #
  8. # Initial commit
  9. #
  10. nothing to commit (create/copy files and use "git add" to track)

当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件、网页、所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,如果要真正使用版本控制系统,就要以纯文本方式编写文件。也不要使用Windows的记事本编写,在Windows下可以使用Notepad代替记事本,记得把Notepad的默认编码设置为UTF-8 without BOM即可。

5.4 添加文件及文件操作:

在当前目录先创建一个文件,内容如下:

  1. [root@localhost project]# cat README
  2. Git is a version control system.
  3. Git is free software.
  4. ##查看状态
  5. [root@git project]# git status
  6. # On branch master
  7. #
  8. # Initial commit
  9. #
  10. # Untracked files:
  11. # (use "git add <file>..." to include in what will be committed)
  12. #
  13. # README
  14. nothing added to commit but untracked files present (use "git add" to track)

可以看到,有未追踪的文件README,并没有添加和提交,将文件添加到staging area中转区域。

  1. [root@git project]# git add README
  2. [root@git project]# git status
  3. # On branch master
  4. #
  5. # Initial commit
  6. #
  7. # Changes to be committed:
  8. # (use "git rm --cached <file>..." to unstage)
  9. #
  10. # new file: README
  11. #
  12. ##文件会被添加到.git目录
  13. [root@git project]# tree -C .git/
  14. .git/
  15. |-- HEAD
  16. |-- branches
  17. |-- config
  18. |-- description
  19. |-- hooks
  20. | |-- applypatch-msg.sample
  21. | |-- commit-msg.sample
  22. | |-- post-update.sample
  23. | |-- pre-applypatch.sample
  24. | |-- pre-commit.sample
  25. | |-- pre-push.sample
  26. | |-- pre-rebase.sample
  27. | |-- prepare-commit-msg.sample
  28. | `-- update.sample
  29. |-- index
  30. |-- info
  31. | `-- exclude
  32. |-- objects
  33. | |-- 46 #添加的文件
  34. | | `-- d49bfabb79a25385fb8f46a0953c22ad2cd6a2
  35. | |-- info
  36. | `-- pack
  37. `-- refs
  38. |-- heads
  39. `-- tags
  40. 10 directories, 15 files

从中转区域提交文件到本地仓库:

  1. [root@git project]# git commit -m 'this is a readme file'
  2. [master (root-commit) 26a897f] this is a readme file
  3. 1 file changed, 2 insertions(+)
  4. create mode 100644 README
  5. ## -m参数后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
  6. ##查看状态
  7. [root@git project]# git status
  8. # On branch master
  9. nothing to commit, working directory clean
  10. [root@git project]# tree -C .git/objects/
  11. .git/objects/
  12. |-- 26
  13. | `-- a897fb6a6e4469acb8ac343beb40579ce5fbee
  14. |-- 46
  15. | `-- d49bfabb79a25385fb8f46a0953c22ad2cd6a2
  16. |-- 4f
  17. | `-- 14d36d6802b1545310cb507f19c7ec0b25c1d5
  18. |-- info
  19. `-- pack
  20. 5 directories, 3 files

总结:

常规添加文件方法:

  • git add * 添加到暂存区域
  • git commit 提交git仓库
    • -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看
  • 简便方法:
    • git commit -a -m “注释信息”
    • -a :表示直接提交

修改文件README的内容如下:

  1. [root@git project]# cat README
  2. Git is distributed a version control system.
  3. Git is free software.
  4. ###查看状态,会看到README文件已经修改
  5. [root@git project]# git status
  6. # On branch master
  7. # Changes not staged for commit:
  8. # (use "git add <file>..." to update what will be committed)
  9. # (use "git checkout -- <file>..." to discard changes in working directory)
  10. #
  11. # modified: README
  12. #
  13. no changes added to commit (use "git add" and/or "git commit -a")
  14. ##查看一下文件README都有哪些变化内容,即修改后的文件和本地仓库的文件有哪些不同。
  15. ##git diff 比较的是工作区和暂存中转区域之间的文件不同之处
  16. [root@git project]# git diff README
  17. diff --git a/README b/README
  18. index 46d49bf..dd90832 100644
  19. --- a/README
  20. +++ b/README
  21. @@ -1,2 +1,2 @@
  22. -Git is a version control system.
  23. +Git is distributed a version control system.
  24. Git is free software.
  25. ##git diff --cached 比较的是暂存区域和本地仓库之间的文件内容不同之处
  26. [root@git project]# git diff --cached
  27. ##提交修改到中转区域并查看:
  28. [root@git project]# git add README
  29. [root@git project]# git status
  30. # On branch master
  31. # Changes to be committed:
  32. # (use "git reset HEAD <file>..." to unstage)
  33. #
  34. # modified: README
  35. #
  36. ##提交到本地仓库并查看状态:
  37. [root@git project]# git commit -m "add distributed"
  38. [master c2f7987] add distributed
  39. 1 file changed, 1 insertion(+), 1 deletion(-)
  40. [root@git project]# git status
  41. # On branch master
  42. nothing to commit, working directory clean

再次修改文件内容,并直接提交到本地仓库

  1. [root@git project]# cat README
  2. Git is distributed a version control system.
  3. Git is free software.
  4. this is a modified test.
  5. ##直接提交
  6. [root@git project]# git commit -a -m "modified test"
  7. [master 0d7e702] modified test
  8. 1 file changed, 1 insertion(+)
  9. [root@git project]# git status
  10. # On branch master
  11. nothing to commit, working directory clean

5.5 查看git历史纪录

  1. [root@git project]# git log
  2. commit 0d7e7026f7d169c8d51a76e6782b7fe3f7c51573
  3. Author: legolas999 <lqr888888@aliyun.com>
  4. Date: Sun Feb 23 20:39:09 2020 +0800
  5. modified test
  6. commit c2f798717bc2417b73a9d2e91a342c924145c223
  7. Author: legolas999 <lqr888888@aliyun.com>
  8. Date: Sun Feb 23 20:30:46 2020 +0800
  9. add distributed
  10. commit 26a897fb6a6e4469acb8ac343beb40579ce5fbee
  11. Author: legolas999 <lqr888888@aliyun.com>
  12. Date: Sun Feb 23 20:17:15 2020 +0800
  13. this is a readme file

可以看到一共做了三次版本更新,可以简单输出一下结构:

  1. ##前面SHA字串代表的就是git的版本号
  2. [root@git project]# git log --pretty=oneline
  3. 0d7e7026f7d169c8d51a76e6782b7fe3f7c51573 modified test
  4. c2f798717bc2417b73a9d2e91a342c924145c223 add distributed
  5. 26a897fb6a6e4469acb8ac343beb40579ce5fbee this is a readme file
  • git log :查看提交历史记录
  • git log -2:查看最近2条记录
  • git log -p -1:-p显示每次提交的内容差异,例如仅查看最近一次差异
  • git log —stat -2:–stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息。
  • git log —pretty=oneline:–pretty根据不同的格式展示提交的历史信息
  • git log —pretty=fuller -2:以更详细的模式输出提交的历史记录
  • git log —pretty=format:”%h %cn”:查看当前所有提交记录的简短SHA-1哈希子串与提交者的姓名
    • 使用format参数来指定具体的输出格式:

1. Git分布式版本控制 - 图8

5.6 还原历史数据

Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD,上上一个版本则会叫做HEAD^,当然一般会用HEAD~5来表示往上数第五个提交版本。

  • git reset —hard hash #还原到某个版本
  • git reset —hard HEAD^ #还原历史提交版本上一次
  • git reset —hard 3de15d4 #找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)
  1. [root@git project]# cat README
  2. Git is distributed a version control system.
  3. Git is free software.
  4. this is a modified test.
  5. [root@git project]# git reset --hard HEAD^
  6. HEAD is now at c2f7987 add distributed
  7. [root@git project]# cat README
  8. Git is distributed a version control system.
  9. Git is free software.

如果后悔了,想撤销更改,但是git log已经找不到这个版本了。

  1. [root@git project]# git log
  2. commit c2f798717bc2417b73a9d2e91a342c924145c223
  3. Author: legolas999 <lqr888888@aliyun.com>
  4. Date: Sun Feb 23 20:30:46 2020 +0800
  5. add distributed
  6. commit 26a897fb6a6e4469acb8ac343beb40579ce5fbee
  7. Author: legolas999 <lqr888888@aliyun.com>
  8. Date: Sun Feb 23 20:17:15 2020 +0800
  9. this is a readme file

这时候可以使用git reflog命令。

git reflog #查看未来历史更新点。

  1. [root@git project]# git reflog
  2. c2f7987 HEAD@{0}: reset: moving to HEAD^
  3. 0d7e702 HEAD@{1}: commit: modified test ##这是那个最新点
  4. c2f7987 HEAD@{2}: commit: add distributed
  5. 26a897f HEAD@{3}: commit (initial): this is a readme file
  6. [root@git project]# git reset --hard 0d7e702
  7. HEAD is now at 0d7e702 modified test
  8. [root@git project]# cat README
  9. Git is distributed a version control system.
  10. Git is free software.
  11. this is a modified test.
  12. ##可以看到文件内容又回来了

5.7 标签使用

前面回滚使用的是一串字符串,又长又难记。

  • git tag v1.0 :当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。
  • git tag :查看当前所有的标签;
  • git show v1.0 :查看当前1.0版本的详细信息;
  • git tag v1.2 -m “version 1.2 release is test” :创建带有说明的标签,-a指定标签名字,-m指定说明文字;
  • git tag -d v1.0 :为同一个提交版本设置了两次标签,删除之前的v1.0;
  1. ##将当前提交内容打上标签
  2. [root@git project]# git tag 1.0
  3. [root@git project]# git tag
  4. 1.0
  5. ##创建一个新文件,并提交
  6. [root@git project]# cat README2
  7. add a second file
  8. [root@git project]# git add README2
  9. [root@git project]# git commit -m "add new file"
  10. [master 35515a6] add new file
  11. 1 file changed, 1 insertion(+)
  12. create mode 100644 README2
  13. ##打上新版本标签
  14. [root@git project]# git tag v1.2
  15. [root@git project]# git tag
  16. 1.0
  17. v1.2
  18. ##回到上一个版本
  19. [root@git project]# git reset --hard 1.0
  20. HEAD is now at 0d7e702 modified test
  21. [root@git project]# ls
  22. README
  23. ##再回到V1.2版本
  24. [root@git project]# git reset --hard v1.2
  25. HEAD is now at 35515a6 add new file
  26. [root@git project]# ls
  27. README README2

5.8 删除文件

先添加一个新文件test.txt到Git并且提交:

  1. [root@git project]# echo "this is a test file" > test.txt
  2. [root@git project]# git add test.txt
  3. [root@git project]# git commit -m "new file test.txt"
  4. [master b56d125] new file test.txt
  5. 1 file changed, 1 insertion(+)
  6. create mode 100644 test.txt

一般情况,我们会直接通过系统命令删除文件:

  1. [root@git project]# rm -f test.txt

但是Git知道你删除了文件,因此,工作区和版本库就不一致了。

  1. [root@git project]# git status
  2. # On branch master
  3. # Changes not staged for commit:
  4. # (use "git add/rm <file>..." to update what will be committed)
  5. # (use "git checkout -- <file>..." to discard changes in working directory)
  6. #
  7. # deleted: test.txt
  8. #
  9. no changes added to commit (use "git add" and/or "git commit -a")

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

  1. [root@git project]# git rm test.txt
  2. rm 'test.txt'
  3. [root@git project]# git commit -m "delete test.txt"
  4. [master e713f18] delete test.txt
  5. 1 file changed, 1 deletion(-)
  6. delete mode 100644 test.txt
  7. [root@git project]# git status
  8. # On branch master
  9. nothing to commit, working directory clean

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

  1. [root@git project]# git checkout -- test.txt
  2. [root@git project]# ls
  3. README README2 test.txt

5.9 Git常用命令

命令 命令说明
add 添加文件内容到暂存区域(索引)
bisect 通过二分查找定位引入bug的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前HEAD到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个GPG签名的tag对象

5.10 分支管理:

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

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

1. Git分布式版本控制 - 图9

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长;当创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

1. Git分布式版本控制 - 图10

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

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

1. Git分布式版本控制 - 图11

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

1. Git分布式版本控制 - 图12

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

1. Git分布式版本控制 - 图13

分支管理常用命令:

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

分支操作练习

  1. ##查看当前分支
  2. [root@git project]# git branch
  3. * master
  4. ##创建新分支linux
  5. [root@git project]# git branch linux
  6. [root@git project]# git branch
  7. linux
  8. * master
  9. ##切换到新分支linux
  10. [root@git project]# git checkout linux
  11. Switched to branch 'linux'
  12. [root@git project]# git branch
  13. * linux
  14. master
  15. ##修改文件内容,添加并提交到Linux分支
  16. [root@git project]# cat README
  17. Git is distributed a version control system.
  18. Git is free software.
  19. this is a modified test.
  20. [root@git project]# echo "creating a new branch is quick." >> README
  21. [root@git project]# git add README
  22. [root@git project]# git commit -m "branch test"
  23. [linux 4ccb399] branch test
  24. 1 file changed, 1 insertion(+)
  25. [root@git project]# cat README
  26. Git is distributed a version control system.
  27. Git is free software.
  28. this is a modified test.
  29. creating a new branch is quick.
  30. ##切换回master分区,发现新添加的文件内容没有了
  31. [root@git project]# git checkout master
  32. Switched to branch 'master'
  33. [root@git project]# git branch
  34. linux
  35. * master
  36. [root@git project]# cat README
  37. Git is distributed a version control system.
  38. Git is free software.
  39. this is a modified test.
  40. ##并没有最新的提交版本内容:
  41. [root@git project]# git log -1
  42. commit b56d125b5350fc6f6385140c0783a7164b91e6bd
  43. Author: legolas999 <lqr888888@aliyun.com>
  44. Date: Sun Feb 23 21:25:45 2020 +0800
  45. new file test.txt
  46. ##合并linux分支代码到当前分支,即master分支
  47. [root@git project]# git merge linux
  48. Updating b56d125..4ccb399
  49. Fast-forward
  50. README | 1 +
  51. 1 file changed, 1 insertion(+)
  52. [root@git project]# git log -1
  53. commit 4ccb399b651d65d260284c2a3a3488fdc6c50917
  54. Author: legolas999 <lqr888888@aliyun.com>
  55. Date: Sun Feb 23 22:10:07 2020 +0800
  56. branch test
  57. [root@git project]# git status
  58. # On branch master
  59. nothing to commit, working directory clean
  60. [root@git project]# cat README
  61. Git is distributed a version control system.
  62. Git is free software.
  63. this is a modified test.
  64. creating a new branch is quick.