什么是 Git ?
Git 是目前世界上最先进的分布式版本控制系统 。两个关键字 : 分布式和版本控制系统。
版本控制系统 : 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。更通俗来讲,它记录了你对文件的每次修改,
分布式 : 如 Git , 只要提供一台电脑作为版本集中存放的服务器就够了,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它也一样干活,只是交换修改不方便而已。而每一台电脑有各自独立的开发环境,不需要联网 (commit 是提交到本地仓库不需要联网, push 是推送到远程仓库需要联网)。
集中式 : 如 SVN , 有一个中央服务器,干活的时候,用的都是自己的电脑,需要先从中央服务器获取最新的版本,然后开始工作,工作完毕,再把自己的修改推动给中央服务器。
缺点 :提交代码需要联网的情况下才能使用,多人协作经常需要处理代码冲突。
使用 SVN 还是 Git ?
使用 SVN 还是 Git 呢 ? 我认为抛开项目和实际情况来讲毫无意义 。
如果公司以前使用的就是 SVN , 应用广泛、开发稳定 , 没有必要换到 Git 。 Git 相对 SVN 来说 , 学习成本更大一些。
如果一个人单独开发,使用 SVN 还是 Git , 我觉得都可以呀 , 对哪项工具熟悉,就使用哪个。
如果多人同时开发多个功能,使用 SVN 直接提交到中央仓库 ,经常需要处理版本冲突。我认为使用 Git 是否更好一点, 先把代码提交到本地或者另外开一个分支,开发完成后合并, 当然 Git 最后也要处理代码冲突,但 Git 使我们的开发过程更加高效,我们有更多的时间开发业务,而不是沟通处理冲突。
选择工具的目的是为了让开发高效、稳定。
良好的团队管理和开发规范比使用任何工具都要有效,单纯一味的追求工具的优劣毫无意义。
基本概念
- 仓库 ( repository ) : 版本库 、代码库。包含了文件、目录。版本库中所有文件都可以被 Git 所管理起来。 文件添加、修改、删除都会被 Git 记录下来。
- 主干 ( master): 是主要开发所在的目录 , 一般为项目稳定的代码,正常情况下禁止开发人员直接提交代码到 master 。
- 分支 ( branch ) : 开发分支,正常业务开发都在该分支进行,一般代码并不稳定,代码测试稳定后合并到 trunk 。多人协作,多功能同时开发,可通过 Git Flow 来管理 。
- 标签 ( tag ) : 一个版本发布后 , 需要打 tag , 后续版本有问题,可在 tag 上 开分支修复。
- HEAD : 在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。
基本的 Git 工作流程如下:
1. git add 将文件从工作区加入暂存区。
2. git commit 提交文件到本地仓库。
3. git push 推送文件到远程仓库。
即 工作区 -> 暂存区 -> 本地仓库 -> 远程仓库 , 如下图 :
Git 基础命令
以下所有命令,需要安装 Git , 并在 Git Bash中执行。
那么新建一个文件夹,将该文件夹作为 Git 仓库。输入下列命令,初始化一个 Git 仓库 。
git init
查看 Git 配置信息 :
git config --list
查看 Git 状态 :
git status //获取当前 Git 状态 (当前文件夹是否为 Git 仓库 ? 是否新的文件 ? 是否修改了文件 ? 都可以用该命令查询)
当进入任意一个文件夹 (该文件夹或其上级目录都不是用 Git 管理) , 调用上述命令行。很明显报错了,提示说该文件夹或其父目录都不是一个 Git 仓库。
git status
fatal: Not a git repository (or any of the parent directories): .git
在该文件夹下新建一个文件 Hello.txt ,并将该文件加入 Git 仓库中 。
git add hello.txt
查看文件的内容。
cat hello.txt
修改文件内容后,提交代码。-m 代表注释 双引号之间的 detail 为你这次修改的内容注释。
git commit -m "detail"
立即执行上述命令,发现没有提交到本地仓库 。提示如下:
git commit -m "detail"
Changes not staged for commit:
modified: hello.txt
文件修改后需要放入暂存区,放入暂存区后才能够提交,简单来说,你想要提交一个修改过的文件,需要做两步 :
git add hello.txt // 和添加文件到 Git 仓库的命令一样。
加入暂存区后,然后再执行 commit 命令 ,就能够成功提交。
git commit -m "我提交了"
[master 4bf0a96] 我提交了
1 file changed, 2 insertions(+), 1 deletion(-)
有没有简便方法 ? 加入暂存区后,并提交代码。 有 -m 为添加注释 -am 就为添加文件到暂存区并添加注释。
git commit -am "我提交了"
[master e62cc9c] 我提交了
1 file changed, 1 insertion(+), 1 deletion(-)
我提交了那么多次,想要看下提交的记录 。执行如下命令可以看到作者 、提交时间以及提交的内容。
git log
commit e62cc9c3e7d44ecb7199028a8d02cff970b7fb46 (HEAD -> master)
Author: XXXX<XXXX@qq.com>
Date: Tue Jun 5 22:32:49 2018 +0800
我提交了
信息有点多 , 来美化下,如下命令。前边的一串字符可以理解为提交的版本号。
git log --pretty=oneline
e62cc9c3e7d44ecb7199028a8d02cff970b7fb46 (HEAD -> master) 我提交了
4bf0a96a8929e03cb0497ee235413394c33a6b54 我提交了
87db33d32ab96c04bef0b964f6a1ee245485487f hello world
c452c51c5688d792c3404d78e493665ac874d0f6 hello
81810e48d1497963f4e5f847e031ba7cf4c8d3c7 init git
嗯,上面是提交的文本记录,接下来看下提交的命令记录。
git reflog
e62cc9c (HEAD -> master) HEAD@{0}: commit: 我提交了
4bf0a96 HEAD@{1}: commit: 我提交了
87db33d HEAD@{2}: commit: hello world
c452c51 HEAD@{3}: commit: hello
81810e4 HEAD@{4}: commit (initial): init git
前边的几位数字为版本号的省略写法,有了这些版本省略版本号,我们可以使用 Git 回退到指定版本。例如我提交了这么多版本,突然想从第二次提交后开始写,
好办 :
git reset --hard c452c51
HEAD is now at c452c51 hello
如果我一个版本在本地修改了很多次,突然间想撤销这些修改。
一种方法 : 采取上述的的 reset 到指定版本。
另一种方法: 撤销在工作区的全部修改(就是让这个文件回到最近一次git commit或git add时的状态) 。
git checkout -- hello.txt
如果你想删除这个文件,执行下面的命令,去文件夹看一下,文件没了,很开心。
rm hello.txt
当文件纳入 Git 管理后,即便你删除了文件,仍然能找回文件。
git checkout -- hello.txt
执行上边的命令后,文件又回来了,这就很气了。那么我们就把文件从 Git 中删除 ,并从磁盘中移除。 rm hello.txt 仅仅是从磁盘中移除,但是文件已经加入到 Git 中管理,
因此可以从 git 中找回文件,这是版本控制的好处之一。
git rm hello.txt
如果只想从 git 中删除,并不删除磁盘文件 。
git rm --cached hello.txt
文件删除干净了吗 ? 并没有 ! 暂存区删除了, 本地还没删除 ! 因此还得执行下方命令。
git commit -m "delete file "
注意
想获得一份仓库的拷贝, SVN 使用的是 checkout ,但是 Git 使用的是 git clone , 而不是 git checkout, 这是 Git 区别于其它版本控制系统的一个重要特性,Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。
总结
本文介绍了 Git 的一些基本概念和常用的基础命令。单纯的几个小时掌握 Git 是不现实的,你需要抽花几天时间系统的掌握概念和基础命令,之后在开发过程中不断的加深理解,更重要的开发过程中分支创建与合并的规范。
参考文章 :