Git 的基本使用
1.创建 Git 本地仓库
仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来,例如下面代码创建了gitcode_linux的文件夹,之后再对其进行初始化。创建⼀个 Git 本地仓库对应的命令为 git init
,注意命令要在⽂件⽬录下执⾏,例如
我们发现,当前⽬录下多了⼀个
.git
的隐藏⽂件,
.git
⽬录是 Git 来跟踪管理仓库的,不要⼿动修改这个⽬录⾥⾯的⽂件,不然改乱了,就把 Git 仓库给破坏了。其中包含 Git 仓库的诸多细节,我们可以进⼊看看。
2.配置 Git
当安装 Git 后⾸先要做的事情是设置你的⽤⼾名称 和 e-mail 地址,这是⾮常重要的。配置命令为:
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可。
其中
--global
是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个配置。如果你希望在不同仓库中使⽤不同的 name
或
e-mail
,可以不要
--global
选项,但要注意的是,执⾏命令时必须要在仓库⾥。即下面代码执行的路径在gitcode_linux下。
查看配置命令为:
git config -l
删除对应的配置命令为:
git config [--global] --unset user.name
git config [--global] --unset user.email
3. 认识⼯作区、暂存区、版本库
•
⼯作区:是在电脑上你要写代码或⽂件的⽬录。
•
暂存区:英⽂叫 stage 或 index。⼀般存放在
.git
⽬录下的 index ⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。
•
版本库:⼜名仓库,英⽂名
repository
。⼯作区有⼀个隐藏⽬录
.git
,它不算⼯作区,⽽是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
下⾯这个图展⽰了⼯作区、暂存区和版本库之间的关系:
•
图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
•
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。
•
当对⼯作区修改(或新增)的⽂件执⾏
git add
命令时,暂存区⽬录树的⽂件索引会被更新。
•
当执⾏提交操作
git commit
时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。
由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤
git add
和
git commit
命令才能将⽂件添加到仓库中进⾏管理!!!
4. 添加⽂件
在包含 .git 的⽬录下新建⼀个 ReadMe ⽂件,我们可以使⽤
git add
命令可以将⽂件添加到暂存区:
•
添加⼀个或多个⽂件到暂存区:
git add
[
file1
] [
file2
] ...
•
添加指定⽬录到暂存区,包括⼦⽬录:
git add
[
dir
]
•
添加当前⽬录下的所有⽂件改动到暂存区:
git add
.
再使⽤
git commit
命令将暂存区内容添加到本地仓库中:
•
提交暂存区全部内容到本地仓库中:
git commit
-
m "message"
•
提交暂存区的指定⽂件到仓库区:
git commit
[
file1
] [
file2
] ... -
m "message"
注意
git commit
后⾯的
-m
选项,要跟上描述本次提交的 message,由⽤⼾⾃⼰完成,这部分内
容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。
git commit
命令执⾏成功后会告诉我们,1个⽂件被改动(就是我们新添加的ReadMe⽂件)。
我们还可以多次 add 不同的⽂件,⽽只 commit ⼀次便可以提交所有⽂件,是因为需要提交的⽂件是通通被 add 到暂存区中,然后⼀次性 commit 暂存区的所有修改。
截⾄⽬前为⽌,我们已经更够将代码直接提交⾄本地仓库了。我们可以使⽤
git log
命令,来查看 下历史提交记录:
该命令显⽰从最近到最远的提交⽇志,并且可以看到我们 commit 时的⽇志消息。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline
参数.
需要说明的是,我们看到每行最前面的⼀⼤串类似
7ba3...aeb6
的是每次提交的
commit id
(版本号),Git 的 commit id
不是1,2,3……递增的数字,⽽是⼀个 SHA1 计算出来的⼀个⾮常⼤的数字,⽤⼗六进制表⽰
。
5.查看 .git ⽂件
先来看看我们的
.git
的⽬录结构:
1.
index
就是我们的暂存区,add 后的内容都是添加到这⾥的。
2.
HEAD
就是我们的默认指向 master 分⽀的指针:
⽽默认的 master 分⽀,其实就是:
打印的 7ba3a19c5990b6a0949f89cc70e1a307cdb3aeb6 是什么东西呢?实际上是当前最新的 commit id
。
3.
objects
为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏
git add
命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下。
找到某个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过
sha (安全哈希算法)加密过的⽂件,好在我们可以使⽤ git cat-file -p + 该文件commit id 命令来查看版本库对象的内容。下面我们以HEAD指针指向的文件为例,即最新的一次文件提交。
其中,还有⼀⾏ tree 349e7a9afb8b97e6f2a9a632cf783f188da5fe1a ,我们使⽤同样的⽅法,看看结果:
总结⼀下,在本地的 git 仓库中,有⼏个⽂件或者⽬录很特殊
•
index: 暂存区,
git add
后会更新该内容。
•
HEAD: 默认指向 master 分⽀的⼀个指针。
•
refs/heads/master: ⽂件⾥保存当前
master
分⽀的最新
commit id
。
•
objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。
6.修改⽂件
Git ⽐其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,⽽⾮⽂件。什么是修改?⽐如新增了⼀⾏,这是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。让我们将 ReadMe ⽂件进⾏⼀次修改,增加三行hello world:
此时,仓库中的 ReadMe 和我们⼯作区的 ReadMe 是不同的,如何查看当前仓库的状态呢?
git status
命令⽤于查看在上次提交之后是否有对⽂件进⾏再次修改。
上⾯的结果告诉我们,ReadMe 被修改过了,但还没有完成添加与提交。⽬前,我们只知道⽂件被修改了,如果能知道具体哪些地⽅被修改了,就更好了。
git diff [file]
命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格
式。也可以使⽤
git diff HEAD -- [file]
命令来查看版本库和⼯作区⽂件的区别。
我们再使用git add命令把它提交到本地仓库。
我们没有再看到上⾯
no changes added to commit (use "git add" and/or "git commit -a") 的消息了。接下来让我们继续
git commit
即可。