#要点
GIT介绍
GIT安装
GIT创建版本库
GIT工作区和暂存区
GIT版本处理
GIT文件处理
GIT介绍
Git迅速成为最流行的***分布式版本控制系统***,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
注意:
这边需要对集中式版本控制系统和分布式控制系统进行一下区分。
(1)集中式版本控制系统
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后对内容进行处理,再把自己所处理的内容推送给中央服务器;
同时,集中式版本控制系统需要进行联网才能处理,受网络影响较大。
(2)分布式版本控制系统
分布式版本控制系统从根本上看,就没有“中央服务器”,每个人电脑上都是一个完整的版本库,因此不需要联网操作;
同时,由于每个人手上都是一套完整的版本库,在多人协作上,如果都修改了同一个文件,只要各自的修改的推送给对方,是可以看到对方的修改内容,并根据修改内容进行选择;
其次,分布式版本控制系统的安全性要高,也正是因为每个人手上都有一个完整的版本库,即便其他人的版本库错误,也可以从其他用户那边复制一份;而对于集中式,如果中央服务器挂掉之后,就都可以休息啦。
最后,也是最重要的是,GIT属于开源免费的分布式版本控制系统。
GIT安装
-
在Linux上进行程序包安装
sudo apt-get install git
通过上面的命令可直接进行安装,相对比较简单。 -
源码编译安装
先从Git官网下载源码;
然后解压;
./config,make,sudo make install安装即可,在这里因为不是重点,不做演示。
GIT创建版本库
版本库也叫GIT仓库,在Linux中可以理解为一个目录,这个目录中所有文件会被GIT所管理,包括文件的修改、删除以及对某一时刻的文件还原与恢复等。对于开发人员而言,也是项目的根目录。注意:GIT仓库可以把一个已有项目的文件夹作为仓库;也可以重新创建文件夹,并作为GIT仓库。创建命令如下:
(1)创建空文件夹:
- mkdir learngit
- cd learngit
- pwd(查询当前的文件路径是为了保证在文件夹内)
(2)通过git init命令把这个目录变成Git可以管理的仓库: - git init
- ls -ah(通过此命令,会发现当前目录下有一个.git目录,此目录是GIT追踪管理版本库的,尽量不要去修改,相当于暂存区)
GIT工作区和暂存区
- 工作区
工作区就相当于我们系统上的项目目录; - 版本库
工作区存在的隐藏目录.git文件夹,并非工作区内容,二货思GIT版本库;
在GIT版本库中,其最重要的就包含了所谓的stage暂存区,其次还有GIT会自动创建的主分支master,并且包含指向master的一个指针HEAD。
- 文件提交至master步骤
(1)git add 将文件修改添加只暂存区;
(2)git commit 把暂存区的所有内容提交至当前分支。 - 示例
(1)先对readme.txt做个修改,比如加上一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
(2)在工作区新增一个LICENSE文本文件;
(3)通过git status查看状态;
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
此时,可以看到readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
(4)通过git add命令操作后,再用git status再去查看:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
modified: readme.txt
而此时,暂存区的状态被添加之后,就会如下显示:
(5)执行git commit之后就可以把暂存区中的所有修改提交至分支。
$ git commit -m "understand how stage works"
[master e43a48b] understand how stage works
2 files changed, 2 insertions(+)
create mode 100644 LICENSE
注意,一旦提交之后,如果对工作区没有做任何修改,因此工作区是干净的。如图:
$ git status
On branch master
nothing to commit, working tree clean
此时,版本库就会变成如下,而暂存区中就不再有内容啦。
GIT版本处理
当遇到对工作区的文件进行多次修改并提交至GIT仓库时,就会出现多个版本信息。如下示例:
版本1:wrote a readme file
Git is a version control system.
Git is free software.
版本2:add distributed
Git is a distributed version control system.
Git is free software.
版本3:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
而对于不同的版本,都可以通过***git log***命令进行查看;该命令会显示提交日志,并对每次提交的信息进行追踪。最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
当修改版本较多时,可通过参数–pretty=oneline进行简化,需要注意的是,GIT提供的版本号是用16进制生成的;而SVN的话,采用的是递增版本号处理,容易引起冲突。
- 版本回退(都在在没有提交在远程之前)
如果需要回退到某一版本,先通过git log 查看至哪一版本。然后再选择***git reset --hard***命令进行回退。
注意:
HEAD表示当前版本,也就是最新版本;上一个版本为HEAD^;再 往上一个版本为HEAD ^ ^;如下操作:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
倘若还原出错,想再次返回去时,只要上面的命令窗口没有关闭(方法1),可根据之前的版本号指定回去,如下操作:
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
补充:
版本回退之所以速度快,其原理就是在于GIT内部有个指向当前版本的HEAD指针,当回退时,GIT内部仅仅将指向版本的指向进行修改即可。并且,也会把工作区中的文件进行更新,也就是说,HEAD指向哪个版本,当前工作区中就是哪个版本内容。
但是,当命令窗口已经关闭(方法2),此时想恢复新版本时,没办法找到提交版本号,可通过***git reflog***来记录每一次命令;(常用)
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
GIT文件处理
- 修改文件
在这里可以用一句话概括,多次修改,可以多次添加至暂存区,一并提交至分支,也可以分别提交至分支。
- 撤销修改
当在提交错误文件前,可通过***git checkout --file***来丢弃工作区的修改。
在这里需要注意:工作区的修改文件撤销操作分为两种情况:
(1)文件修改后并没有放入暂存区,如果同名命令,可撤销修改至与版本库一致;
(2)如果已添加至暂存区,此时做了修改,如果撤销修改,就相当于回到添加暂存区之后的状态。
-
总结:
让文件回到最近一次***git commit***或者***git add***时的状态。 -
补充:
***git reset***命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区: -
删除文件
在提交文件之后,如果通过rm命令,将文件删除后,GIT会检测到工作区和版本库中的文件不一致,通过git status可查看哪些文件删除。
$ git add test.txt
$ git commit -m "add test.txt"
[master b84166e] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
$ rm test.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
注意:
此时,有两个选择以供选择:
(1)确实从版本库中删除该文件,可通过git rm进行删除,并且git commit再次进行提交,如此文件就从版本库中彻底删除了;
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
(2)如果删除错啦,还想恢复,也可通过git checkout – file将误删的文件恢复至最新版本;git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
$ git checkout -- test.txt
注意:
从来没有被添加到版本库就被删除的文件,是无法恢复的!