Git 单机版安装使用


简介:

Git 是一款开源的分布式版本控制系统,是当今最流行、先进的版本控制软件,没有之一。
Git 是一个分布式的版本控制系统,相反 SVN 就是一个集中式的版本控制系统了。SVN 每修改完一个文件要提交到服务端进行保存,而 Git 在本地有一个完整的版本库。

一、安装 Git

1、Linux( CentOS )

shell > yum -y install git

## 没错,已经安装完成了

2、Windows( WIN7 )
下载地址:https://github-windows.s3.amazonaws.com/GitHubSetup.exe

> 双击图标,选择 install( 会自动下载程序包 )
> 选择 skip ,如果你有 github 用户,也可以登陆哦
> 点击左上角的 "+" ,添加自己的版本库,输入版本库名、选择版本库路径,最后点击创建
> 然后就可以添加文件到版本库了,可以使用 Git Shell 命令行操作哟

二、Git( CentOS )

1、创建版本库

shell > git config --global user.name "bkjia"
shell > git config --global user.email "linux@bkjia.com"
shell > git config --global color.ui true

## 第一、二条是设置自己的用户名、邮件地址,分布式版本控制系统嘛,用来证明你是你。由于是全局配置,本地所有的版本库都是这个名,也可以单独为某个版本库设置( 这是必须设置的 )
## 第三条是智能颜色显示,输出的结果有颜色区分,看着方便、显着高大上,对就是这个意思

shell > mkdir -p /git/gitdb ; cd /git/gitdb
shell > git init
Initialized empty Git repository in /git/gitdb/.git/
shell > ls .git/
branches config description HEAD hooks info objects refs

## 使用 git init 初始化版本库( 在哪个目录下执行,哪个目录就是版本库目录 )
## 这样就创建好了一个 gitdb 的版本库了,版本库的相关文件全保存在隐藏目录 .git 下,一般不要手动去修改里面的东西,否则会把版本库玩坏

2、向版本库中添加文件

## 关于 Git 的操作,没有特殊说明情况下,操作目录都是 /git/gitdb/ 这里

shell > head -5 /etc/passwd | tee passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

## 把 /etc/passwd 文件中的前 5 行数据重定向到了 /git/gitdb/passwd 文件中,内容如上

 

shell > git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# passwd
nothing added to commit but untracked files present (use "git add" to track)

 

## 这时通过 git status 指令可以看到,工作区有一个名为 passwd 的文件,还没有提交( 提交前要使用 git add <file> 指令将文件添加到暂存区 )
## 工作区:版本库目录即为工作区( 在版本库目录中创建一个文件,就是在工作区创建一个文件 )
## 暂存区:使用 git add 指令时,实际上就是把文件从工作区添加到暂存区的过程
## 分支:创建版本库时,git 会自动创建一个 master 分支,使用 git commit 指令时,实际上就是把暂存区的所有文件提交到 master 分支
## 所以这三者之间的关系是:工作区-->暂存区-->分支
## git add 可以多次添加、也可以一次添加多个文件到暂存区,git commit 会一次性把暂存区的所有修改提交到分支

 

shell > git add passwd
shell > git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: passwd
#

 

## 添加完成后,发现暂存区有一个名为 passwd 的文件还没有提交( 可以使用 git rm --cached <file> 指令将暂存区的文件删除,注意:不是工作区的文件 )

shell > git rm --cached passwd
rm 'passwd'

## 删除后,你会发现:工作区的 passwd 文件还在,当使用 git status 指令时,状态又变回了没有 git add 时的状态

shell > git add passwd
shell > git commit passwd -m "one"
git commit -m "one"
[master (root-commit) 7af25e2] one
1 files changed, 5 insertions(+), 0 deletions(-)
create mode 100644 passwd

## 提交时,-m 参数用来做个标记,你可以标注一些有意思的东西,例如你做了什么修改之类的...

shell > git status
# On branch master
nothing to commit (working directory clean)

## 这时使用 git status 指令发现工作区已经没有东西了( 提交完成 )

3、恢复到上个版本或某个版本

 

shell > sed -i 's/nologin/login/g' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 由于把文件中 nologin 字段修改成了 login ,git status 发现 passwd 文件被修改了,但是还没有更新( git checkout -- <file> 待会说 )

 

shell > git diff HEAD -- passwd
diff --git a/passwd b/passwd
index 03dab68..96635c1 100644
--- a/passwd
+++ b/passwd
@@ -1,5 +1,5 @@
root:x:0:0:root:/root:/bin/bash
-bin:x:1:1:bin:/bin:/sbin/nologin
-daemon:x:2:2:daemon:/sbin:/sbin/nologin
-adm:x:3:4:adm:/var/adm:/sbin/nologin
-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+bin:x:1:1:bin:/bin:/sbin/login
+daemon:x:2:2:daemon:/sbin:/sbin/login
+adm:x:3:4:adm:/var/adm:/sbin/login
+lp:x:4:7:lp:/var/spool/lpd:/sbin/login

 

## 可以使用 git diff 指令查看工作区跟版本库( 分支 )的文件( 改动 )差异( HEAD 代表分支中( 版本库 )当前版本,即最新版本 )

 

shell > git add passwd
shell > git commit -m "two"
[master 6fd5803] two
1 files changed, 4 insertions(+), 4 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)

 

## 将修改后的文件提交到了版本库中,搞了个标记叫 two ,呃,代表第二次提交
## 提交完成后,工作区就没有东西了

 

shell > sed -i 's/bash/python/' passwd
shell > git add passwd
shell > git commit -m "three"
[master 4cba143] three
1 files changed, 1 insertions(+), 1 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)
shell > git diff HEAD -- passwd

 

## 第三次提交完成,使用 git diff 指令发现版本库中最新版本跟工作区文件完全相同

 

shell > git log
git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 通过 git log 指令可以清楚的看到总共有三次提交,标记为 one 、two 、three ,现在想回到上次版本( two )怎么办 ?

 

shell > git reset --hard HEAD^
HEAD is now at 6fd5803 two
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login

 

## 使用 git reset 指令,HEAD^ 代表上个版本,HEAD^^ 代表上两个版本,现在已经回到了 two 版本了( three 版本的 bash 变为 python 已经又恢复成 bash 了 )

 

shell > git log
commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 现在就剩两个版本了,最上面 two 为最新版本,即当前版本
## 恢复到某个版本,假设有好多好多个版本,使用 HEAD^^^^ 或 HEAD~[number] 的方式就很不方便了( 都要数 )
## 既然 HEAD 代表版本号,那么恢复时直接输入版本号不就可以了?非常方便,git log 指令输出的 commit 字段( 7af25e23a89ba16e5ff14a8da305542bc9cc6062 )就是版本号

 

shell > git reset --hard 7af25e2
HEAD is now at 7af25e2 one
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

## 使用 git reset 指令时,只需输出版本号的前几位即可,可以看到已经恢复到了第一版,文件内容也变回了最初的状态

shell > git log
commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

## 这时使用 git log 指令发现只有第一次提交的版本了,那么现在想回到 two 或 three 版本该怎么办?( 版本号没有了 )

 

shell > git reflog
7af25e2 HEAD@{0}: 7af25e2: updating HEAD
6fd5803 HEAD@{1}: HEAD^: updating HEAD
4cba143 HEAD@{2}: commit: three
6fd5803 HEAD@{3}: commit: two
shell > git reset --hard 4cba143
HEAD is now at 4cba143 three

 

## 使用 git reflog 指令可以看到操作记录,第一列就是我们想要的版本号,再次使用 git reset 指令恢复即可

 

shell > cat passwd
root:x:0:0:root:/root:/bin/python
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login
shell > git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 文件内容、版本信息都回来了,现在的版本恢复到了 three 状态

4、git checkout -- <file> :还记得这个不 ?

 

shell > sed -i '1d' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 当修改了工作区文件内容后,使用 git status 指令可以看到这样的提示( git checkout -- <file> 可以撤销工作区文件的修改 )

 

shell > cat passwd
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login

shell > git checkout -- passwd

 

## 使用 git checkout 指令撤销工作区文件的改动( 恢复到跟版本库一样的状态,就是刚才所有的修改全部被撤回 )

 

shell > sed -i '1d' passwd
shell > git add passwd
shell > sed -i '1d' passwd
shell > git status
shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#

 

## 现在是一个什么情况呢 ?首先删除了文件第一行,执行了 git add 指令( 文件的修改被添加到了暂存区 ),接着又删除了一次,那么现在执行 git checkout 指令文件被恢复成什么样 ?

shell > git checkout -- passwd

## 实践证明:文件被恢复到了暂存区的状态,也就是删除一次的状态

 

shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#

 

## 这是暂存区的状态,怎么恢复暂存区的状态,也就是把第一次的删除也撤销( 注意:这已经 git add 了 )

shell > git reset HEAD passwd
Unstaged changes after reset:
M passwd

## 还记得 git reset 这个指令不,没错用来恢复文件到上个版本的,也可以用来将暂存区的改动回退到工作区

 

shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 再次查看状态,提示工作区有改动,可以使用 git checkout -- <file> 将工作区的改动也撤销

## git reset 将文件回退到上一次版本 / 将暂存区的改动回退到工作区
## git checkout 将工作区的改动撤销 / 将工作区的改动回退到暂存区

5、删除文件

shell > git rm passwd
rm 'passwd'
shell > git commit -m "delete passwd"
[master 3be8d7a] delete passwd
1 files changed, 0 insertions(+), 5 deletions(-)
delete mode 100644 passwd

## 使用 git rm 指令将版本库中的文件删除,然后提交删除( 文件就被删除了,版本库目录下也没有了 )

 

shell > git log
commit 3be8d7a3ade6f8947135843832bb6cfa075638a4
Author: bkjia <linux@bkjia.com>
Date: Wed Jul 22 13:18:23 2015 +0200

delete passwd

commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: bkjia <linux@bkjia.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

shell > git reset --hard 4cba14
HEAD is now at 4cba143 three

 

## ... 好不容易删除了,结果又给恢复了 ^_^ ,不要高兴太早,如果修改完文件,没有提交就删除了文件,那么刚才的修改就真的丢失了..

shell > rm -rf passwd
shell > git reset --hard 4cba14
HEAD is now at 4cba143 three

## 是不是再也不用担心误删除文件了 ^_^ ( 单机情况下你别物理磁盘爆炸了,那就真的啥也没有了 )

Git 教程系列文章: 

GitHub 使用教程图文详解   

Git 标签管理详解  

Git 分支管理详解  

Git 远程仓库详解  

Git 本地仓库(Repository)详解  

Git 服务器搭建与客户端安装   

Git 概述  

分享实用的GitHub 使用教程  

Ubuntu下Git服务器的搭建与使用指南 

Git 的详细介绍:请点这里
Git 的下载地址:请点这里

本文永久更新链接地址

相关内容