目录
Git的简介
什么是Git啊
git是目前世界上最先进的分布式版本控制系统,没有之一!
那什么是版本控制系统呢?它是一种在开开发过程中,确保由不同人所编辑的同一份档案(工程)都得到更新,他透过文档控制记录程序各个模块的改动,并为每次改动加以序列,并且编辑错误之后可以回溯到以前的版本的系统。
Git是怎么诞生的啊
万能的Linus在1991年创建了开源的Linux,从此Linux系统不断发展,然而Linux的不断发展是靠世界各地的Linux社区志愿者们的不懈努力,但是当初的版本控制系统要么就是不好用如SVN、CVS,要么商用收费,与Linux开源精神不符合。所以呢。。伟大Linus在2002年之前都是人工添加代码的。。醉了。Linux系统已经发展了十年了,代码库之大终于让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。然后呢2005年开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司怒了,收回Linux社区的免费使用权。这时候,这时候,伟大的Linus用了两个星期自己用C写了一个分布式版本控制系统,对,你没猜错,那就是Git。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub。
分布式与集中式
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作。那分布式版本控制系统与集中式版本控制系统有何不同呢?分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。双方之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
当然Git优势多多,以后使用中就会知道了。
Git的基本结构
不多说直接上图
Git的基本使用总结
首先,我们要坚决抛弃Windows,不要问为什么,除了娱乐不要用它就对了,以下均为在Linux中(本人使用Ubuntu 14.04,偶尔用Kali),土豪同学用Mac的。。细微差别自己解决。
安装并配置Git
当时我们可以用万能的apt啊:
sudo apt-get install git
如果是老一点的Debian或者Ubuntu,那就要(所以要及时更新源啊):
sudo apt-get install git-core
如果是其他的Linux呢那就源码安装吧,解压后:
./config
make
sudo make install
安装完成后初步设置一下子:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
这里强烈建议大家去申请Gmail吧,人家Nessus都不认QQ邮箱的。
注意git config命令的- -global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
至此,恭喜你,成功安装了Git。
创建版本库
首先,选择一个合适的目录,作为自己的工作目录
root@firgavin-virtual-machine:~# mkdir learngit
root@firgavin-virtual-machine:~# cd learngit/
root@firgavin-virtual-machine:~/learngit# pwd
/root/learngit
root@firgavin-virtual-machine:~/learngit# git in
init instaweb
root@firgavin-virtual-machine:~/learngit# git init
初始化空的 Git 仓库于 /root/learngit/.git/
那么,一个新的Git仓库就建好了。切换进去查看一下:
root@firgavin-virtual-machine:~/learngit# ls -al
总用量 12
drwxr-xr-x 3 root root 4096 8月 17 10:49 .
drwx------ 5 root root 4096 8月 17 10:48 ..
drwxr-xr-x 7 root root 4096 8月 17 10:49 .git
虽然是个空的仓库(empty Git repository),但是可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
基本操作啊
我们随便创建一个文件,当然是在当前目录下了:
root@firgavin-virtual-machine:~/learngit# vi readme.txt
root@firgavin-virtual-machine:~/learngit# cat readme.txt
Git is a version control system.
Git is free software.
提交也是相当简单的啊,只需要两步(不查看状态的情况下)即可:
root@firgavin-virtual-machine:~/learngit# git add readme.txt
root@firgavin-virtual-machine:~/learngit# git commit -m "wrote a readme file"
[master (根提交) 3b5aaff] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
这里呢,-m参数后面接的是本次提交说明,养成良好习惯每次都要写,而且要干练精简。
修改一下readme.txt如下:
root@firgavin-virtual-machine:~/learngit# vi readme.txt
root@firgavin-virtual-machine:~/learngit# cat readme.txt
Git is a distributed version control system.
Git is free software.
使用git status查看当前仓库的具体状态:
root@firgavin-virtual-machine:~/learngit# git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
显然我们修改了文件但是并没有提交,那么我们的文件还是处于工作区的,于是Git人性化地提示我们,到底是要提交呢,还是放弃提交呢。不好确定就看一下修改内容吧:
root@firgavin-virtual-machine:~/learngit# git diff
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
很清晰的显示出改动的地方,不是么。
当然你确定修改的话就正常add然后commit,如果你要撤销修改的话,按照提示:
root@firgavin-virtual-machine:~/learngit# git checkout -- readme.txt
root@firgavin-virtual-machine:~/learngit# cat readme.txt
Git is a version control system.
Git is free software.
root@firgavin-virtual-machine:~/learngit#
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
以上情况使用于你修改了工作区想直接丢弃工作区的修改,如果你修改了并且添加到了暂存区那么就要:
root@firgavin-virtual-machine:~/learngit# git reset HEAD readme.txt
重置后取消暂存的变更:
M readme.txt
root@firgavin-virtual-machine:~/learngit# git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
root@firgavin-virtual-machine:~/learngit#
这里需要优先使用git reset HEAD file取消暂存区的变更,查看状态发现变更此时位于工作区。
然后参考第一种git checkout – file就万事大吉。
如果不但将文件add了又commit了,那么久需要版本回退
首先查看下当前有多少个版本:
root@firgavin-virtual-machine:~/learngit# git log
commit 7613ea2dd2a3b5333fb637b9c31fc74c6d4fa0c8
Author: Xiaoming <3052355537@qq.com>
Date: Wed Aug 17 11:40:34 2016 +0800
di 1 ci ciu gai
commit 3b5aaff96463cad74ef7238a8324fc3298b7e748
Author: Xiaoming <3052355537@qq.com>
Date: Wed Aug 17 11:02:04 2016 +0800
wrote a readme file
或者使用一个更为简洁的命令来查看版本:
root@firgavin-virtual-machine:~/learngit# git log --pretty=oneline
7613ea2dd2a3b5333fb637b9c31fc74c6d4fa0c8 di 1 ci ciu gai
3b5aaff96463cad74ef7238a8324fc3298b7e748 wrote a readme file
那么退回上一个版本只需要:
root@firgavin-virtual-machine:~/learngit# git reset --hard HEAD^
HEAD 现在位于 3b5aaff wrote a readme file
root@firgavin-virtual-machine:~/learngit# git log
commit 3b5aaff96463cad74ef7238a8324fc3298b7e748
Author: Xiaoming <3052355537@qq.com>
Date: Wed Aug 17 11:02:04 2016 +0800
wrote a readme file
好吧我操作失误又想回到刚才的版本怎么办,先用git reflog查看下commit ID然后调回即可:
root@firgavin-virtual-machine:~/learngit# git reflog
3b5aaff HEAD@{0}: reset: moving to HEAD^
7613ea2 HEAD@{1}: commit: di 1 ci ciu gai
3b5aaff HEAD@{2}: commit (initial): wrote a readme file
root@firgavin-virtual-machine:~/learngit# git reset --hard 7613ea2
HEAD 现在位于 7613ea2 di 1 ci ciu gai
root@firgavin-virtual-machine:~/learngit# git log
commit 7613ea2dd2a3b5333fb637b9c31fc74c6d4fa0c8
Author: Xiaoming <3052355537@qq.com>
Date: Wed Aug 17 11:40:34 2016 +0800
di 1 ci ciu gai
commit 3b5aaff96463cad74ef7238a8324fc3298b7e748
Author: Xiaoming <3052355537@qq.com>
Date: Wed Aug 17 11:02:04 2016 +0800
wrote a readme file
总结一下,git reset –hard HEAD^回到上个版本,git reset –hard commitID回到ID提交位置。
最后删除文件就十分简单明了了:
git rm filename
git commit -m "remove filename"
这样就可以将文件从版本库中删除了。万一从版本库中误删了可以:
git checkout -- filename
即可将文件恢复至最新版本。
以上是Git的基本应用,感谢廖老师的无私分享,从他那里学了不少东西,哈哈,话说廖老师的网站真心不错哦。