Git
分布式版本控制系统,CVS及SVN都是集中式的版本控制系统。
版本库:仓库(repository),可以理解成为一个目录,目录都可以可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时间可以"还原"。
1.创建并使用
1.选择一个文件夹,创建一个空目录。(这里我选择的是桌面的git目录下创建learn)
$ cd /Users/apple/Desktop/git/Learn
用pwd可显示当前目录
2.通过git init
命令把目录变成Git可以管理的仓库
$git init
Initialized empty Git repository in /Users/apple/Desktop/git/Learn/.git/
这时候Git已经把仓库建好了,而且是一个空的仓库(empty Git repository),这时候Learn的目录下会多出一个.git
目录。这个目录用来跟踪管理版本库,不可以手动修改。
如果没有看到.git
目录,是因为这个目录默认隐藏,用ls -ah
命令就可以看见
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
3.添加内容
在Learn目录下(或者子目录)添加一个文件。比如是readme.md
-
首先,用
git add
告诉Git,把文件添加到仓库$ git add readme.md
执行之后没有任何显示。
-
其次,用
git commit
告诉Git,把文件提交给仓库。
$ git commit -m "wrote a readme file"
[master (root-commit) 2d9e62d] wrote a readme file
1 file changed, 158 insertions(+)
create mode 100644 readme.md
git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);158 insertions
:插入了158行内容。
commit
可以一次提交很多文件,所以你可以多次add
不同的文件
4.git status
命令可以让我们时刻掌握仓库当前的状态,git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,按q
即可退出当前查询模式。
提交修改还是用git add
,可以先用git status
查看状态,然后用git commit -m
提交。
$ git add readme.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.md
$ git commit -m "second"
[master 0679a3f] second
1 file changed, 63 insertions(+), 24 deletions(-)
5.git log
命令显示从最近到最远的提交日志
$ git log
commit 0679a3f9a7a890c7d2e41da20412ea8c24b5819e (HEAD -> master)
Author: ShuchenHuang <shuchenhuang@163.com>
Date: Wed May 22 22:56:22 2019 +0800
second
commit 2d9e62d027cca9bea777fe4ac28799047212d231
Author: ShuchenHuang <shuchenhuang@163.com>
Date: Wed May 22 22:38:51 2019 +0800
wrote a readme file
这里我提交了两次。
可以用git log --pretty=oneline
$ git log --pretty=oneline
0679a3f9a7a890c7d2e41da20412ea8c24b5819e (HEAD -> master) second
2d9e62d027cca9bea777fe4ac28799047212d231 wrote a readme file
一大串类似0679a...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。因为Git是分布式的版本控制系统,大家同时在一个版本库里面进行工作,1,2,3的版本号无法满足我们的需求。
在Git中,用HEAD
表示当前版本,也就是最新的提交0679a3...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
进行版本回退,可以使用git reset --hard HEAD^
$ git reset --hard HEAD^
HEAD is now at 2d9e62d wrote a readme file
$ git log
commit 2d9e62d027cca9bea777fe4ac28799047212d231 (HEAD -> master)
Author: ShuchenHuang <shuchenhuang@163.com>
Date: Wed May 22 22:38:51 2019 +0800
wrote a readme file
如果想要我刚才不要的版本,就可以通过查找命令行窗口找到版本号。版本号没必要写全,前几位就可以了,Git会自动去找,但也不能只写前两位。
$ git reset --hard 0679a3f9
HEAD is now at 0679a3f second
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD指针指向进行改变而已。
也可以使用git reflog
进行查看。
$ git reflog
0679a3f (HEAD -> master) HEAD@{0}: reset: moving to 0679a3f9
2d9e62d HEAD@{1}: reset: moving to HEAD^
0679a3f (HEAD -> master) HEAD@{2}: commit: second
2d9e62d HEAD@{3}: commit (initial): wrote a readme file
2.工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
2.总结
1.创建新项目
1.创建新目录,并打开。
2.初始化Git仓库:git init
3.添加文件,分两步:
a.使用命令`git add <file>`,注意,可反复多次使用,添加多个文件;
b.使用命令git commit -m <message>
,完成。
2.常用命令
1.初始化Git仓库:git init
2.添加文件:git add <file>
3.提交文件:git commit -m <message>
4.要随时掌握工作区状态 ,使用git status
命令
5.如果git status
告诉你有文件被修改过,可以用git diff
查看修改内容。
6.HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
7.穿梭前,用git log
可以查看提交历史,以便确定要退回哪个版本
8.要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。