什么是 Git
Git 属于分散型版本管理系统,是为了版本管理而设计的软件。版本管理就是管理更新的历史记录,它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更改源代码的过程,回滚到特定阶段,恢复错误删除的文件等。
在 Git 出现之前,人们普遍采用的是 Subversion 等集中型版本管理系统,集中型管理系统就是将仓库集中存放在服务器之中,所以只存在一个仓库。而分散型拥有多个仓库。
安装 Git
下载地址: https://gitforwindows.org/,下载完成之后根据向导一步步安装即可。如果无法翻墙,可以从https://pan.baidu.com/s/1vQrNSxWuR1vFnyWAGKqgag下载
注意配置换行符时选择 Checkout Windows-style,commit Unix-style line endings 这个选项。
Git 配置用户名和邮箱
首先运行 Git bash,设置用户名,使用如下命令:
然后设置邮箱地址,将上面设置用户名命令中的 user.name 改为 user.email,然后后面跟着自己的邮箱地址即可。
Git 基本操作
首先选择一个空文件夹,点击鼠标右键,选择 git bash here,就会在当前文件夹在打开 Git bash。
初始化仓库
要是用 Git 进行版本管理,必须先初始化一个仓库, Git 是使用 git init
命令进行初始化的。只需要运行 git init
命令即可。
如果初始化成功,在当前目录下会生成一个 .git 目录,这个 .git 目录中存储着管理当前目录所需的仓库数据。
查看仓库状态
使用 git status
命令查看 Git 仓库的状态,工作树和仓库被操作的过程中,状态会不断发生变化,一年春经常需要查看仓库的状态。
结果显示我们当前正处于 master 分支下,所谓提交,就是指“记录工作树中所有文件的当前状态”。
新建一个 README.md 文件作为管理对象,为第一个提交做准备。
向暂存区中添加文件
如果只是用 Git 仓库的工作树创建了文件,那么该文件并不会被计入 Git 仓库的版本管理对象当中。因此我们使用 git status
命令查看时,README.md 文件会显示在 Untracked files 中。
想要让文件成为 Git 仓库的管理对象,就需要用 git add
命令将其添加到暂存区,暂存区就是提交之前的一个临时区域。
在将其添加入暂存区之后,再次使用 git status
命令查看仓库状态,发现 README.md 已经显示在 Changes to be committed 中了。
保存仓库的历史记录
使用 git commit
命令可以将当前暂存区中的文件实际保存到仓库的历史记录中,通过这些记录,我们就可以在工作树中复原文件了。
-m 参数后的 “first commit” 成为提交信息,是对这个提交的概述。
再次使用 git status
命令查看仓库的状态:
可以看到当前工作树处于刚刚完成提交的最新状态,所以结果显示没有更改。
查看提交日志
使用 git log
命令,可以查看仓库提交的历史记录,包括查看什么人在什么时候进行了提交或者合并,以及操作前后有怎么的差别等等。
显示的结果第一行 commit 之后的时候这个提交的哈希值,第二行是作者,第三行是提交的时间,最后是这个提交的提交信息。
如果想要更简单的结果,可以在 git log
命令之后添加--pretty=short
。
如果想要查看指令文件或者目录的日志,可以在 git log
之后添加文件或目录名,比如git log README.md
。
如果想要查看提交所带来的改动,可以添加 -p 参数,即 git log -p
。同样的,如果想要只查看指定目录或文件的改动,可以在 -p 之后添加目录或文件名,比如 git log -p README.md
。
查看更改前后的差别
使用 git diff
命令可以查看工作树、暂存区、最新提交之间的差别。
比如这里我们打开 README.md 文件,输入 “git 基本操作” 这句话,当前你也可以随便输入点别的什么。然后我们通过 git diff
命令,查看当前工作树与暂存区的差别。
由于我们没有使用 git add
向暂存区添加任何东西,所以这里只会显示工作树与最新提交之间的差别。
+ 标注的是新添加的行,- 标注的是被删除的行,这里我们看到只添加了一行。
使用 git add
命令将 README.md 添加到暂存区。
这时候如果再次使用 git diff
命令,你会发现什么都没有输出,这是因为当前工作树和暂存区的状态是一致的。如果想要查看与最新提交的差别,需要在 git diff
之后添加 HEAD 参数。
建议每次在执行git commit
命令之前,都先使用git diff HEAD
命令查看本次提交与上次提交之间有什么差别,这里的 HEAD 是指向当前分之中最新一次提交的指针。
再次使用git commit
命令将暂存区的文件保存到仓库的历史记录中。
为了确认提交没有出现差错,可以在执行git log
命令查看日志,这里应该会显示两次提交的信息。
分支的操作
在进行多个并行作业时,我们会使用到分支。在这类并行开发的过程中,往往同时存在多个最新代码状态。在不同的分支中,可以同时进行完全不同的作业,等该分支的作业完成之后再与 master 分支合并,通过灵活运用分支,可以让多人同时高效地进行并行开发。
查看当前仓库中所有分支
使用 git branch
命令可以将分支名列表显示,同时可以确认当前所在的分支。
可以看到 master 分支左侧标有 *,表示这是我们当前所在的分支
创建一个分支
使用 git checkout -b
命令可以创建一个新的分支并转到新创建的分支下作业
实际上,连续使用以下两条命令也可以达到相同的效果:
git branch branch-A
git checkout branch-A
现在我们位于 branch-A 分支下,在这个状态下像正常状态下修改代码,然后执行 git add
命令提交的话,代码就会提交到 branch-A 分支。像这样不断对一个分支进行提交操作被称为 “培育分支”。
比如现在打开 README.md,输入一行新的内容 branch-A,然后使用 git add
和 git commit
命令进行提交。
于是这一行内容就被添加到 branch-A 分支中了。
如果你不放心的话,可以查看一下 master 分支有没有受到影响,首先切换回到 master 分支,使用 git checkout master
命令。然后打开 README.md 文件,可以发现只有一行文字,而没有 branch-A 这句新文字,说明 branch-A 分支的修改不会影响到 master 分支,而这也正是分支在开发过程中的优点。
切换回上一个分支
可以使用 git checkout -
命令切换回到上一个分支,当然,使用分支名字也是可以的,比如 git checkout branch-A
。
其实这时候你可以在打开看一下 README.md,你会发现有两行文字。
特性分支
特性分支,顾名思义是集中实现单一特性或主题,除此之外不进行任何作业的分支。在日常开发中,往往会创建多个特性分支,同时保留一个稳定分支,可以随时发布软件,稳定分支通常由 master 分支担任。
主干分支
主干分支是特性分支的原点,同时也是合并的终点。通常人们会使用 master 分支作为主干分支,主干分支可以随时供人查看。
合并分支
加入现在 branch-A 分支已经实现完毕,需要将其合并到主干分支 master 中,需要首先切换回 master 分支,然后使用 git merge
命令进行合并。
以图表形式查看分支
使用 git log --graph
命令即可以图表形式查看分支
推送至远程仓库
添加远程仓库
使用 git remote add
命令添加远程仓库
git remote add origin (远程仓库)
origin 是我们为远程仓库设置的名字。
推送至远程仓库
如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到 git push
命令。假定我们现在正在 master 分支下工作。
git pust -u origin master
像这样执行 git push
命令,当前分支的内容就会被推送到远程仓库 origin 的 master 分支。-u
参数可以在推送的同时,将 origin 仓库的 master 分支设置为本地仓库当前分支的 upstream,也就是将来执行 git pull
命令从远程仓库获取内容时,本地仓库的这个分支就可以直接从 origin 的 master 分支获取内容,而不用添加额外的参数。
推送至 master 以外的分支
除了 master 分支之外,远程仓库也可以创建其它分支。比如我们在本地仓库中建立了一个 branch-A 分支,然后以同名形式推送至远程仓库。
git checkout -b branch-A
git push -u origin branch-A
这样,在远程仓库就可以查看 branch-A 了。
从远程仓库获取
获取远程仓库
首先切换到其他目录(不要和之前的仓库在同一目录下),使用 git clone
命令获取远程仓库。
git clone (远程仓库)
执行完 git clone
命令之后,我们默认处于 master 分支下,同时系统自动将 origin 设置为该远程仓库的标识符。
获取最新的远程仓库分支
使用 git pull
命令。