Git是目前世界上最先进的分布式版本控制系统(没有之一) 。
在Linux上安装Git
首先, 你可以试着输入 git , 看看系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令, 有很多Linux会友好地告诉你Git没有安装, 还会告诉你如何安装Git。
msysgit是Windows版的Git, 从http://msysgit.github.io/下载, 然后按默认选项安装即可。
安装完成后, 在开始菜单里找到“Git”->“Git Bash”, 蹦出一个类似命令行窗口的东西, 就说明Git安装成功!
安装完成后, 还需要最后一步设置, 在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
注意 git config 命令的 --global 参数, 用了这个参数, 表示你这台机器上所有的Git仓库都会使用这个配置, 当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
什么是版本库呢?版本库又名仓库, 英文名repository, 你可以简单理解成一个目录, 这个目录里面的所有文件都可以被Git管理起来, 每个文件的修改、 删除, Git
都能跟踪, 以便任何时刻都可以追踪历史, 或者在将来某个时刻可以“还原”。
所以, 创建一个版本库非常简单, 首先, 选择一个合适的地方, 创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
第二步, 通
过
git init
命令把
这
个目
录变
成
Git
可以管理的
仓库
:$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬
间
Git
就把
仓库
建好了, 而且告
诉
你是一个空的
仓库
(
empty Git repository
) ,
细
心的
读
者可以
发现
当前目
录
下多了一个
.git
的目
录
,
这
个目
录
是
Git
来跟踪管理版本
库
的, 没事千万不要手
动
修改
这
个目
录
里面的文件, 不然改乱了, 就把
Git
仓库给
破坏了。如果你没有看到 .git 目录, 那是因为这个目录默认是隐藏的, 用 ls -ah 命令就可以看见。
现在我们编写一个 readme.txt 文件, 内容如下:
Git is a version control system.
Git is free software.
第一步, 用命令
git add
告
诉
Git
, 把文件添加到
仓库
:$ git add readme.txt
第二步, 用命令
git commit
告
诉
Git
, 把文件提交到
仓库
:$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
简单
解
释
一下
git commit
命令,
-m
后面
输
入的是本次提交的
说
明, 可以
输
入任意内容, 当然最好是有意
义
的,
这样
你就能从
历
史
记录
里方便地找到改
动记录
。
git commit
命令
执
行成功后会告
诉
你,
1
个文件被改
动
(我
们
新添加的
readme.txt
文件) , 插入了
两
行内容(
readme.txt
有
两
行内容) 。为 什么 Git 添加文件需要 add , commit 一共 两 步呢?因 为 commit 可以一次提交很多文件, 所以你可以多次 add 不同的文件, 比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
我
们继续
修改
readme.txt
文件, 改成如下内容:Git is a distributed version control system.
Git is free software.
现
在,
运
行
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
# n
o changes added to commit (use "git add" and/or "git commit -a")
虽
然
Git
告
诉
我
们
readme.txt
被修改了, 但如果能看看具体修改了什么内容, 自然是很好的。 比如你休假 两 周从国外回来, 第一天上班 时 , 已 经记 不清上次怎么修改的
readme.txt , 所以, 需要用 git diff 这 个命令看看:
$ git diff readme.txt
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.
git diff
顾
名思
义
就是
查
看
difference
,
显
示的格式正是
Unix
通用的
diff
格式, 可以从上面的命令
输
出看到, 我
们
在第一行添加了一个
“distributed”
单词
。
知道了 对 readme.txt 作了什么修改后, 再把它提交到 仓库 就放心多了, 提交修改和提交新文件是一 样 的 两 步, 第一步是 git add :
$ git add readme.txt
同
样
没有任何
输
出。 在
执
行第二步
git commit
之前, 我
们
再
运
行
gitstatus 看看当前 仓库 的状 态 :
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# #
modified: readme.txt
#
git status
告
诉
我
们
, 将要被提交的修改包括
readme.txt
, 下一步, 就可以放心地提交了:
$ git commit -m "add distributed"
[master ea34578] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后, 我
们
再用
git status
命令看看
仓库
的当前状
态
:$ git status
# On branch master
nothing to commit (working directory clean)
Git必须知道当前版本是哪个版本, 在Git中, 用 HEAD 表示当前版本, 也就是最新的提交 3628164...882e1e0 (注意我的提交ID和你的肯定不一样) , 上一个版本就是 HEAD^ , 上上一个版本就是 HEAD^^ , 当然往上100个版本写100个 ^ 比较容易数不过来, 所以写成 HEAD~100 。
小结
要随时掌握工作区的状态, 使用 git status 命令。- 如果 git status 告诉你有文件被修改过,
- 用 git diff 可以查看修改内容。
- HEAD 指向的版本就是当前版本, 因此, Git允许我们在版本的历史之间穿梭
- 使用命令 git reset --hard commit_id 。
- 穿梭前, 用穿梭前, 用 git log 可以查看提交历史, 以便确定要回退到哪个版本。
- 要重返未来, 用 git reflog 查看命令历史, 以便确定要回到未来的哪个版本
- 看看readme.txt的内容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录, 比如我的 learngit 文件夹就是一个工作区 :
就是你在电脑里能看到的目录, 比如我的 learngit 文件夹就是一个工作区 :
版本
库
(
Repository
)
工作区有一个 隐 藏目 录 .git , 这 个不算工作区, 而是 Git 的版本 库 。 Git 的版本 库 里存了很多 东 西, 其中最重要的就是称 为 stage (或者叫 index ) 的 暂 存区, 还 有 Git 为 我 们 自 动创 建的第一个分支 master , 以及指向 master 的一个指 针 叫 HEAD 。
工作区有一个 隐 藏目 录 .git , 这 个不算工作区, 而是 Git 的版本 库 。 Git 的版本 库 里存了很多 东 西, 其中最重要的就是称 为 stage (或者叫 index ) 的 暂 存区, 还 有 Git 为 我 们 自 动创 建的第一个分支 master , 以及指向 master 的一个指 针 叫 HEAD 。
前面
讲
了我
们
把文件往
Git
版本
库
里添加的
时
候, 是分
两
步
执
行的:
第一步是用 git add 把文件添加 进 去, 实际 上就是把文件修改添加到 暂 存区;
第二步是用 git commit 提交更改, 实际 上就是把 暂 存区的所有内容提交到当前分支。
因 为 我 们创 建 Git 版本 库时 , Git 自 动为 我 们创 建了唯一一个 master 分支, 所以,现在, git commit 就是往 master 分支上提交更改。 你可以 简单 理解 为 , 需要提交的文件修改通通放到 暂 存区, 然后, 一次性提交 暂 存区的所有修改。
第一步是用 git add 把文件添加 进 去, 实际 上就是把文件修改添加到 暂 存区;
第二步是用 git commit 提交更改, 实际 上就是把 暂 存区的所有内容提交到当前分支。
因 为 我 们创 建 Git 版本 库时 , Git 自 动为 我 们创 建了唯一一个 master 分支, 所以,现在, git commit 就是往 master 分支上提交更改。 你可以 简单 理解 为 , 需要提交的文件修改通通放到 暂 存区, 然后, 一次性提交 暂 存区的所有修改。
撤销修改
git checkout -- file
可以
丢
弃工作区的修改:
修改全部撤 销 , 这 里有 两 种情况:
一种是 readme.txt 自修改后 还 没有被放到 暂 存区, 现 在, 撤 销 修改就回到和版本 库 一模一 样 的状 态 ;
一种是 readme.txt 已 经 添加到 暂 存区后, 又作了修改, 现 在, 撤 销 修改就回到添加到 暂 存区后的状 态 。
$ git checkout -- readme.txt
命令
git checkout -- readme.txt
意思就是, 把
readme.txt
文件在工作区的修改全部撤 销 , 这 里有 两 种情况:
一种是 readme.txt 自修改后 还 没有被放到 暂 存区, 现 在, 撤 销 修改就回到和版本 库 一模一 样 的状 态 ;
一种是 readme.txt 已 经 添加到 暂 存区后, 又作了修改, 现 在, 撤 销 修改就回到添加到 暂 存区后的状 态 。
在
commit
之前, 你
发现
了
这
个
问题
。 用
git status
查
看一下, 修
改只是添加到了 暂 存区, 还 没有提交:
( unstage ) , 重新放回工作区:
用 HEAD 时 , 表示最新的版本。
用命令
git rm
删
掉, 并且
git commit
:
git log退出方法:英文状态下按q。
改只是添加到了 暂 存区, 还 没有提交:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# #
modified: readme.txt
#
Git
同
样
告
诉
我
们
, 用命令
git reset HEAD file
可以把
暂
存区的修改撤
销
掉( unstage ) , 重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既可以回退版本, 也可以把
暂
存区的修改回退到工作区。 当我
们用 HEAD 时 , 表示最新的版本。
删除文件
用命令
git rm
删
掉, 并且
git commit
:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现
在, 文件就从版本
库
中被
删
除了。
git log退出方法:英文状态下按q。