对Git的命令和理解进行更深层次的剖析。分支管理是Git的一个特色,同时也是Git的一个难点,但是用好了分支管理对我们的项目开发会有很大的帮助。

一、Git

什么是Git。百度百科的解释:
Git

分布式VS集中式

那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

二、概念理解

版本库

什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
git clone命令会把项目的版本库一起克隆到本地,就是.git目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。

工作区和暂存区

工作区:就是在电脑里能看到的目录,比如react-stage目录就是一个工作区
暂存区:在版本库中。
Git

三、一些常用命令

提交修改

1
2
3
4
git pull * 从远程仓库拉取
git add . * 将文件添加到暂存区
git commit -m '说明' * 将暂存区的修改提交到当前分支
git push * 推送到远程仓库

查看当前状态

1
git status

用来查看当前工作区和暂存区的状态。可以加-s查看状态的简写形式。

1
git status -s

1.颜色区分
红色表示在工作区,绿色表示在暂存区。

2.字符区分

  • ?? 表示新建的不在版本库中的文件
  • M 表示修改文件(Modify)
  • A 表示添加文件后追踪了该文件(Add)
  • D 表示删除文件(Delete)

查看修改

查看工作区的修改

1
git diff [filename]

查看日志

查看从近到远的日志信息。

1
git log

如果觉得信息太多,可以添加--pretty=oneline查看缩略信息

1
git log --pretty=oneline

撤销修改

1、撤销工作区修改

1
git checkout [filename]

2、撤销分支上的修改

1
git reset --hard [LogId]

四、分支管理

为了理解Git分支的实现方式,我们需要回顾一下Git是如何储存数据的。Git保存的不是文件差异或者变化量,而只是一系列文件快照。

当使用git commit新建一个提交对象前,Git会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。

branch

创建分支

1
git branch [branch-name]

通过git branch这种方式创建的分支仅仅是在本地创建了分支,远程仓库是没有这个分支的。因为没有关联,提交的修改是不能push到远程仓库的。

branch

一般都是从远程仓库拉取已有的分支。

1
git checkout -b [branch-name] origin/[branch-name]

提交本地分支到远程仓库

1
git push --set-upstream origin test

或者

1
git push origin [branch-name]

切换分支

1
git checkout [branch-name]

查看分支

查看本地所有的分支以及所在的分支

1
git branch

查看本地所有的分支以及远程仓库所有的分支

1
git branch --all

删除分支

删除本地分支

1
git branch -d [branch-name]

如果要删除的分支上有提交推送到远程或者merge到其他分支,那么这样删除会失败,可以用强制删除:

1
git branch -D [branch-name]

删除远程分支

1
git push origin -d [branch-name]

合并分支

将其他分支commit的内容合并到当前分支。

1
git merge [branch-name]

五、Git最佳实践

初始化git流程

在clone项目后使用git flow init初始化git流程,选项全部回车默认就行。这个操作只需要在clone后执行一次,以后都不需要了。

1
2
3
git clone [url]
git checkout -b develop origin/develop
git flow init

branch

分支说明:

  • master为线上分支。
  • develop为最新最稳当的开发分支。
  • feature/xx为当前开发特性的分支。
  • hotfix为bug修复分支

创建自己的特性分支并提交

1
2
git flow feature start [myName]
git push origin [feature/myName]

在自己的特性分支开发完成后:

1
2
git checkout develop
git merge [feature/myName]

下次开发前:

1
2
3
4
git checkout develop
git pull
git checkout [feature/myName]
git merge develop

本文地址: http://xieyufei.com/2017/09/11/Git-Learning.html