Git 是什么?
Git 是目前世界上最先进的分布式版本控制系统(没有之一)。
Git 有什么特点?简单来说就是:高端大气上档次!
那什么是版本控制系统?
版本控制,就是能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。
作为目前世界上最先进的分布式版本控制系统,提交文件修改到远程仓库是最常见的Git 操作了。今天,我们来学习一下这一整个流程。
一、对项目进行修改
在这里,我们简单模拟下项目的修改:添加一个名为A.txt 的文件。

二、查看当前项目状况
查看当前项目状况的命令是 git status
git status

这是Git中最为常用的命令之一,通过它可以查看当前工作区和暂存区文件的状态。
运行结果如下:
可以看到,工作区有一个文件 A.txt 处于未跟踪状态( untrcked )。
2.1 暂存区与工作区
2.1.1 工作区
工作区就是在电脑里能看到的目录,例如我的gitTest 文件夹就是一个工作区。

2.1.2 暂存区
在工作区中有一个隐藏目录 .git ,这是是Git 的版本库,不是工作区。Git 的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index )的暂存区。
在我们把文件推送到git 仓库的时候,就是:
通过 git add 命令将需要提交的文件修改放到暂存区
-
通过 git commit 命令一次性将暂存区的修改提交到当前分支。
image.gif
2.2 文件状态
2.2.1 未跟踪状态( untracked )
未跟踪状态的文件,是在工作区,但是未纳入Git 管理的文件,不参与版本控制。
使用git add 命令即可将未跟踪文件纳入管理。
2.2.2 位于暂存区待提交状态(Staged )
使用git add 命令即可将未跟踪文件纳入管理,即提交到暂存区,这时文件就处于可以提交的状态。

上图是将A.txt 添加到暂存区后的运行结果。因为第一次被提交到暂存区,它前面被标注new file。
2.2.3 Modified 状态
纳入跟踪的文件在工作区中被修改后就会处于Modified 状态。

上图是将A.txt 添加到暂存区后,再进行修改后的运行结果。
三、添加文件到暂存区
3.1 全部添加
通过执行 git add . 命令将工作区内的文件修改全部添加到暂存区。
git add .

还有一种说法是
通过git add all 命令将工作区内的文件修改全部添加到暂存区,但是经过本人尝试,该命令会将all 当成文件或目录来处理,因此会报错:未找到匹配的文件。

3.2 指定文件
通过执行 git add file 命令可指定文件添加到暂存区。
git add A.txt

如果想指定多个文件被添加到暂存区,只需在各个文件名之间空一格即可。
git add A.txt B.txt C.txt

3.3 指定目录
通过执行 git add dir 命令可指定哪些目录被添加到暂存区
git add AA

本人新建了AA 和BB 两个目录,AA目录下有AA.txt 和AAAA.txt 文件,BB目录下有BB.txt 文件。通过上述命令可只添加AA 目录下的所有文件,而不将BB 目录下的文件添加到暂存区。
提交到仓库后,查看项目状态:

可以看到,BB 目录仍是处于未跟踪状态。
如果想指定目录下的文件,可以将文件名改为文件路径。
git add BB/BB.txt

四、查看哪些文件将被提交
如果不会有多余、或错误的文件被提交,那么这一步可以省略。
我们可以使用 git status 命令来查看项目的状态,也可以使用另一条命令:
git diff --cached

来查看哪些文件将被添加到暂存区,即将被提交到当前分支。

在我对A.txt 进行修改且新增一个C.txt 文件后的运行结果:

而此时git status 的运行结果:

五、提交到本地版本库
5.1 直接提交
这是比较常用的方法,就是通过 git commit -m "message" 命令进行提交。
git commit -m "message"

message 指代你的提交信息。
如果你想要对提交信息进行详细设计的话,可以不加参数:
git commit

该命令的运行结果:

这个界面与vim 很是相似,但是在该节目的操作具体是:
按下字母键 c,进入编辑状态
按下Esc,退出编辑状态
连按两次大写字母Z,保存退出
5.2 追加提交
如果对最后一次提交信息不满意,可以利用git commit --amend 命令对其进行修改。
git commit --amend -m "add new file"

实际应用中,当完成一次提交之后,可能会发现此次提交有些文件需要修改,当然我们可以在下一次提交中修改此文件,但这无疑会让提交历史比较累赘。我们可以利用git commit --amend 命令追加新的文件修改。
git add .
git commit --amend --no-edit

这样就可以在最后一次提交中追加新的文件修改,并且不修改原本的提交信息。
六、拉取远程仓库最新代码
git pull 命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。
拉取master 分支上的最新代码:
git pull

拉取指定分支上的最新代码( 例如本人的当前分支是A )
git pull origin A

运行结果:

七、推送到远程仓库
如果第六步拉取的代码与本地的代码没有发生冲突,那么就可以直接推送到远程仓库的对应分支。
如果产生冲突,解决冲突后,重新执行 git add 与git commit 命令即可到达本步骤。
使用命令git push 将文件修改推送到远程分支A :
git push origin A

运行结果:

八、查看提交记录
8.1 可视化界面
使用命令 gitk 可以打开可视化界面进行查看
gitk

运行结果:

8.2 日志查看
使用命令 git log 可以查看所有的 commit 记录
git log

运行结果:

注:提交记录过多,按Enter 键进行拉取,按 q 键退出查看。
添加参数--stat 可查看每次提交的简略统计信息。
git log --stat

运行结果:

九、分支合并
git merge 命令用于合并指定分支到当前分支。
9.1 切换分支
因此,合并分支的第一步是:切换分支到你想要的分支。
git checkout master

9.2 查看当前分支
使用git branch 命令可以查看项目的所有分支。
git branch

运行结果:

其中,有 * 标志在前面的就是当前分支。
9.3 合并分支
使用命令git merge 命令可以将指定分支合并到当前分支。
git merge A

运行结果:

注意上图中的 Fast-forward 字样,这表明:本次合并是快速向前合并。
那什么是快速向前合并?
通常,一个合并会产生一个合并提交(commit ), 把两个父分支里的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit )都已经存在另一个分支里了,git 就会执行一个“快速向前" (fast forward )操作;git 不创建任何新的提交(commit ),只是将当前分支指向合并进来的分支。
我们可以添加--no-ff 参数禁用Fast forward 模式。
git merge --no-ff A

9.4 推送内容
使用 git psuh 将分支A 的内容同步到master 分支上。
git push origin master

运行结果:

十、总结
提交文件修改到远程仓库的最简步骤:
git add.
git commit -m "message"
git pull
git push origin A

最后,分享给大家一份国外网友制作的Git Cheat Sheet ,在公众号后台回复:gitSheet 即可免费领取。
至此,本文结束。我是陈冰安,一个Java学习者。欢迎关注我的公众号【暗星涌动】,愿与你们一同进步。