Git --- 分布式版本控制系统
几种常用的版本控制系统
- cvs/vss---锁定模式
- Subversion(svn)---合并模式
- 上述都是集中版本控制系统,必须需要中央服务器
- Mercury ---python版版本控制
- Git---分布式版本控制
Part one
Git 安装完成后进行如下操作:
- Git安装完成后执行如下命令进行绑定用户
$ git config --global user.name "xxx"
$ git config --global user.email "xxx"
- 绑定完成后,可通过命令查看
$ git config user.name
$ git config user.email
Part two 创建版本库
- 切换工作路径
进入Git bash 时,Git有默认路径,所以第一步先切换路径(也可以不切换,就使用默认路径)
$ cd D:/Git/My_Git
- 创建一个文件夹作为Git的仓库
$ mkdir one
- 查看当前工作路径
$ pwd
/d/Git/one
- 进入创建的仓库文件夹,并进行Git仓库的初始化
$ cd one
$ git init
Initialized empty Git repository in D:/Git/one/.git/
- 查看当前仓库文件
$ dir -a
注意 : 成功初始化Git仓库后,可以看到,新的仓库中存在三个文件,分别为. / .. / .git,.表示当前目录,.. 表示上级目录,.git是Git用来追踪版本控制的文件,请勿修改
- 初始化成功可以看到,当前路径的后面多了(master) master表示主干分支
RideoCos@RideoCos MINGW64 /d/Git/one (master)
$
- 尝试添加文件到仓库
首先我们将一个文件复制到Git仓库的文件夹中,也就是将文件放入D:/Git/one文件夹中,再使用Git命令添加此文件到仓库。
$ git add a.txt
- 查看当前仓库的工作状态
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: a.txt
可以看到,Git提示在当前master主干下,有一个新文件a.txt没有提交。所以还需提交这个文件到仓库中。
- 提交文件
$ git commit -m "本次提交说明"
[master (root-commit) 0d35e3b] 本次提交说明
1 file changed, 1 insertion(+)
create mode 100644 a.txt
- 再次查看提交后的状态,当前工作树干净
$ git status
On branch master
nothing to commit, working tree clean
注意 : 添加文件到仓库需要两步操作,1.git add file ; 2,git commit -m "xxx",之所以需要两步的原因是因为,Git的操作分为工作区、暂存区、版本库,当在工作区执行git add命令后,实际上是将文件添加到暂存区,在执行 git commit提交后,将暂存区的文件提交到版本库,再进行版本控制。实际工作如下图1-1所示。
若图片未能加载,请参考Git 工作区 暂存区 版本库 区别
Part three 时光穿梭
- 查看文件改动
在仓库目录下D:/Git/one对添加的文件a.txt进行修改,将原内容hello world 改动为 good bye,使用命令进行查看改动信息。
$ git diff a.txt
diff --git a/a.txt b/a.txt
index 95d09f2..34e219a 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello world
\ No newline at end of file
+good bye
\ No newline at end of file
- 查看当前查看的日志
$ git log
commit 0d35e3bad423ec2f3d6042f5fee5cf73a7821c41 (HEAD -> master)
Author: RideoCos
Date: Thu Oct 11 10:02:36 2018 +0800
本次提交说明
可以看到,第一次提交文件的具体信息,cimmit id记录了提交的id,Git就是通过每次操作的id来实现版本控制,除commit id 外还有提交的其他信息,包括提交人,提交时间,本次提交说明。
现在再次提交修改后的a.txt
$ git add a.txt
$ git commit -m "修改后提交说明"
- 再来查看日志
$ git log
commit d8f41954f5298870fe6ed48fce2987f7f564a7c2 (HEAD -> master)
Author: RideoCos
Date: Thu Oct 11 10:25:23 2018 +0800
修改后提交说明
commit 0d35e3bad423ec2f3d6042f5fee5cf73a7821c41
Author: RideoCos
Date: Thu Oct 11 10:02:36 2018 +0800
本次提交说明
可以看到两次的操作都记录相关信息,现在再次重复上面步骤进行第三次提交操作。在a.txt文本内容添加“你好”。
$ git diff a.txt
$ git add a.txt
$ git commit -m "第三次修改说明"
$ git log
commit 86d38d7a8c0e09ddb6aac7d12c59fbcb7fdf85c1 (HEAD -> master)
Author: RideoCos
Date: Thu Oct 11 10:29:50 2018 +0800
第三次修改说明
commit d8f41954f5298870fe6ed48fce2987f7f564a7c2
Author: RideoCos
Date: Thu Oct 11 10:25:23 2018 +0800
修改后提交说明
commit 0d35e3bad423ec2f3d6042f5fee5cf73a7821c41
Author: RideoCos
Date: Thu Oct 11 10:02:36 2018 +0800
本次提交说明
现在版本库已经有三条记录了,方便直观的进行Git的"时光穿梭"了。
- 为了方便显示,现在只看这三次提交的commit id
$ git log --pretty==oneline
86d38d7a8c0e09ddb6aac7d12c59fbcb7fdf85c1 (HEAD -> master) 第三次修改说明
d8f41954f5298870fe6ed48fce2987f7f564a7c2 修改后提交说明
0d35e3bad423ec2f3d6042f5fee5cf73a7821c41 本次提交说明
可以看到,第三次提交即最新版本的commit id后面有一个(HEAD ->master)这句话,如何理解这句话可以参考分支-廖雪峰
- 获得当前最新版本信息,即当前master指向
$ git reset --hard HEAD
HEAD is now at 86d38d7 第三次修改说明
- 版本回退
$ git reset --hard HEAD^
$ git reset --hard HEAD
HEAD is now at d8f4195 修改后提交说明
git reset --hard HEAD^ 表示回到当前版本的上一个版本,HEAD^^表示上两个,当想回到的版本较前时,有两种方法。
- 方法一,HEAR~n,--n表示当前版本前n个版本
$ git reset --hard HEAD~2
HEAD is now at 0d35e3b 本次提交说明
这里我先回到第三次的版本后,才执行的回退前两个到第一个版本。
- 方法二 --hard + commit id 推荐
1.首先查看commit id
$ git log --pretty=oneline
86d38d7a8c0e09ddb6aac7d12c59fbcb7fdf85c1 (HEAD -> master) 第三次修改说明
d8f41954f5298870fe6ed48fce2987f7f564a7c2 修改后提交说明
0d35e3bad423ec2f3d6042f5fee5cf73a7821c41 本次提交说明
2.使用commit id 指定回退的版本 commit id 一般只用前几位即可
$ git reset --hard 0d35e3b
HEAD is now at 0d35e3b 本次提交说明
在经过方法二的操作,已经回到了最开始的版本,即第一次的添加
- 查看版本库日志
$ git log
commit 0d35e3bad423ec2f3d6042f5fee5cf73a7821c41 (HEAD -> master)
Author: RideoCos
Date: Thu Oct 11 10:02:36 2018 +0800
本次提交说明
现在看到,版本库只有第一次的添加信息,第二三次找不到信息了。那么如何通过版本回退方法回到第二三版本?
- git reflog 查看所有操作日志
$ git reflog
0d35e3b (HEAD -> master) HEAD@{0}: reset: moving to 0d35e3b
86d38d7 HEAD@{1}: reset: moving to 86d38d7
0d35e3b (HEAD -> master) HEAD@{2}: reset: moving to HEAD~2
86d38d7 HEAD@{3}: reset: moving to 86d38d7
d8f4195 HEAD@{4}: reset: moving to HEAD
d8f4195 HEAD@{5}: reset: moving to HEAD^
86d38d7 HEAD@{6}: reset: moving to HEAD
86d38d7 HEAD@{7}: commit: 第三次修改说明
d8f4195 HEAD@{8}: commit: 修改后提交说明
0d35e3b (HEAD -> master) HEAD@{9}: commit (initial): 本次提交说明
可以看到,上面的日志记录了当前所有的操作记录,包括commit id 和 master分支的时间线。时间线是从左到右进行的,最后一次HEAD@{9}即当前时间线下的操作。
- 通过git reflog 的记录信息中的commit id 进行版本回退
$ git reset --hard 86d38d7
HEAD is now at 86d38d7 第三次修改说明
查看
$ git log
commit 86d38d7a8c0e09ddb6aac7d12c59fbcb7fdf85c1 (HEAD -> master)
Author: RideoCos
Date: Thu Oct 11 10:29:50 2018 +0800
第三次修改说明
commit d8f41954f5298870fe6ed48fce2987f7f564a7c2
Author: RideoCos
Date: Thu Oct 11 10:25:23 2018 +0800
修改后提交说明
commit 0d35e3bad423ec2f3d6042f5fee5cf73a7821c41
Author: RideoCos
Date: Thu Oct 11 10:02:36 2018 +0800
本次提交说明
- 查看文件内容
$ cat a.txt
good bye
你好
- 丢掉工作区上的修改
$ git checkout a.txt
注意 : 只能删除在工作区上的操作,如果已经提交到暂存区就不能删除。
- 删除版本
$ git rm a.txt
$ git commit -m "删除版本库"
Part four 远程仓库
- 远程克隆仓库到本地 http
$ git clone https://gitee.com/rideocos/Study.git
git clone后,就可以对本地仓库进行修改,修改后提交到版本库再git push到远程仓库同步更新
- 本地更新同步到远程
$ git push
git push 到远程仓库需要输入远程仓库的登录名与密码