目录
1.Git简介
Git是目前世界上最先进的分布式版本控制系统。
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统。
集中式和分布式版本控制系统有什么区别呢?
集中式版本控制系统,版本库是集中存放在中央服务器的。集中式版本控制系统最大的毛病就是必须联网才能工作。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。
安装Git
直接下载安装包,默认安装即可。
安装完成之后设置用户名和密码:
$ git config --global user.name "H-PAI"
$ git config --global user.email "1004128190@qq.com"
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
1.选择一个合适的地方(直接选择D盘或者E盘的根目录)
2.命令mkdir创建一个空目录(创建只后 系统会直接在之前选择的目录里创建该目录)
3.命令git init对空目录进行初始化操作,完成仓库的创建
$ mkdir learnGit
$ cd learnGit/
$ git init
Initialized empty Git repository in D:/learnGit/.git/
把文件添加到版本库当中
1.新建一个文件readme.txt,并把文件放在learnGit文件夹下面
2.命令git add告诉Git把文件添加到仓库,注意,可反复多次使用,添加多个文件。(执行完之后没有任何显示)
3.命令git commit告诉Git把文件提交到仓库。(-m 后面输入的是本次提交的说明,可以输入任意内容)
$ git add readme.txt
$ git commit -m "wrote a readme file"
[master (root-commit) 091ecf2] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
2.时光机穿梭
命令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
命令git diff可以查看当前版本与之前做了哪些修改。
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index b6dec33..71747a4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
Git is a version control system.
Git is free software.
-Git is a distributed version control system.
\ No newline at end of file
+Git is a distributed version control system.
+add one line.
\ No newline at end of file
命令git log显示从最近到最远的提交日志。
$ git log
commit 4354f6fa81b6746750cf6c23f28a21d0b1674f36 (HEAD -> master)
Author: H-PAI <1004128190@qq.com>
Date: Tue Jul 31 09:00:52 2018 +0800
append GPL
commit 1f569826b0b6a9d4db4d2b5eb790d7c443263d63
Author: H-PAI <1004128190@qq.com>
Date: Tue Jul 31 08:39:26 2018 +0800
add a line
commit 5ad156c71765be92d24903dd8820f4dbca8c16e9
Author: H-PAI <1004128190@qq.com>
Date: Tue Jul 31 08:33:41 2018 +0800
change readme.txt
commit 091ecf2b609e72b82d50dc488ded1ff4be4b0b32
Author: H-PAI <1004128190@qq.com>
Date: Mon Jul 30 20:36:07 2018 +0800
wrote a readme file
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数。
$ git log --pretty=oneline
4354f6fa81b6746750cf6c23f28a21d0b1674f36 (HEAD -> master) append GPL
1f569826b0b6a9d4db4d2b5eb790d7c443263d63 add a line
5ad156c71765be92d24903dd8820f4dbca8c16e9 change readme.txt
091ecf2b609e72b82d50dc488ded1ff4be4b0b32 wrote a readme file
版本回退
Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交4354f6f...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。(
版本号没必要写全,前几位就可以了,Git会自动去找。)
$ git reset --hard HEAD^
HEAD is now at 1f56982 add a line
$ cat readme.txt
Git is a version control system.
Git is free software.
Git is a distributed version control system.
add one line.
$ git reset --hard 4354f6
HEAD is now at 4354f6f append GPL
$ cat readme.txt
Git is a version control system.
Git is free software distributed under the GPL.
命令git reflog用来记录你的每一次命令。
$ git reflog
4354f6f (HEAD -> master) HEAD@{0}: reset: moving to 4354f6
1f56982 HEAD@{1}: reset: moving to HEAD^
4354f6f (HEAD -> master) HEAD@{2}: commit: append GPL
1f56982 HEAD@{3}: commit: add a line
5ad156c HEAD@{4}: commit: change readme.txt
091ecf2 HEAD@{5}: commit (initial): wrote a readme file
工作区和暂存区
工作区(Working Directory):就是你在电脑里能看到的目录。
版本库(Repository):工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。
管理修改
Git跟踪并管理的是修改,而非文件。
操作:第一次修改 -> git add
-> 第二次修改 -> git commit
结果:第二次的修改没有被提交
原因分析:我们前面讲了,Git管理的是修改,当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
解决方案:你可以继续git add
再git commit
,也可以别着急提交第一次修改,先git add
第二次修改,再git commit
,就相当于把两次修改合并后一块提交了。
解决操作:第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
撤销修改(还需理解)
删除文件(还需理解)
首先添加一个新文件(textAdd.txt)到Git并提交。一般情况下,你通常直接在文件管理器(windows窗口)中把没用的文件删了,或者用rm
命令删了。这个时候,Git知道你删除了文件。因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了。
$ rm testAdd.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: testAdd.txt
no changes added to commit (use "git add" and/or "git commit -a")
情况一:删错了
解决方案:因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
$ git checkout -- testAdd.txt
情况二:确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
$ git rm testAdd.txt
rm 'testAdd.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: testAdd.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -m "remove testAdd.txt"
[master 4bfe9e6] remove testAdd.txt
1 file changed, 5 deletions(-)
delete mode 100644 testAdd.txt
删除有两种方式:
1、工作区内"rm 文件名",然后"git rm 文件名",然后"git commit -m '备注'"
2、直接使用"git rm 文件名",然后"git commit -m '备注'"
实验结果:
1、工作区内"rm 文件名" 只是删除工作区内容,暂存区内容还是在的,在"git rm 文件名"操作之前可通过"git checkout --文件名"从暂存区进行恢复。
2、"git rm 文件名"是既删除工作区内容也删除暂存区内容的,所以在"git commit -m '备注'"操作之前可以通过"git checkout HEAD -- 文件名"从版本库进行恢复,当然你要是直接用git reset HEAD^也行但是可能会影响你其他修改但是未提交的其他内容的。