版本控制工具Git简单教程

一、Git安装

二、创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 创建文件目录

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir learngit
$ cd learngit
$ pwd
/d/git/lenarngit

pwd命令用于显示当前目录。在我的Mac上,这个仓库位于/d/git/lenarngit

如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

  • 初始化目录
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
$ ls -ah 
./  ../  .git/

瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用 ls -ah 命令就可以看见。

  • 添加文件到版本库

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

使用Windows的童鞋要特别注意:

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。

当然也可以直接使用git bush有的vi编辑功能,如果当前目录下没有readme.txt则vi之后会新建文件。

$ vi readme.txt

//之后输入文件内容之后保存
Git is a version control system.
Git is free software.

然后输入 增加命令  git add

$ git add readme.txt

执行上面的命令后,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

然后执行commit命令

$ git commit readme.txt -m "add a readme.txt file"

[master (root-commit) e05c76c] add a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

-m是给本次提交备注。

git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。

可以一次commit多个文件

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

三、版本管理

  • 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

no changes added to commit (use "git add" and/or "git commit -a")
  • git diff 查看相对于上次修改了那些内容
$ git diff
diff --git a/readme.txt b/readme.txt
index 922efd3..03f1ae6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
 Git is a version control system.
 Git is free software.
 Git is good.
-Git Git Git.
+Git
  • git log  (带参数  --pretty=oneline)查看操作记录
$ git log
commit 0278e7d6bd8add3d4635441b89d010a2df5e5157 (HEAD -> master)
Author: chenwuai <674939055@qq.com>
Date:   Wed Oct 10 13:43:19 2018 +0800

    test git status

commit 2229ddddaab79026065fdaaea2534bd2ed77fec4
Author: chenwuai <674939055@qq.com>
Date:   Wed Oct 10 10:55:46 2018 +0800

    change readme file

commit e05c76cfb50a741e4f5e046c27a61987fceb060a
Author: chenwuai <674939055@qq.com>
Date:   Wed Oct 10 10:53:10 2018 +0800

    add a readme file

//或者简单的log

$ git log --pretty=oneline
0278e7d6bd8add3d4635441b89d010a2df5e5157 (HEAD -> master) test git status
2229ddddaab79026065fdaaea2534bd2ed77fec4 change readme file
e05c76cfb50a741e4f5e046c27a61987fceb060a add a readme file

你看到的一大串类似0278e7d…2229ddd…commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

版本回退

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交0278e7d…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

我们使用git reset命令

  • git reset 回退到某个版本
$ git reset --hard HEAD^
HEAD is now at e05c76c add a readme file

这时候再去查看readme.txt文件里面内容就已经变化了。这时候在驶入命令 git log 会发现上个操作记录找不到了,这个时候突然又想该回去了,怎么办呢?找到刚才的操作记录,查看你想会到的操作的commit id,然后使用下面的命令。

$ git reset --hard 2229d
HEAD is now at 2229ddd change readme file

对,把HEAD^ 替换为 commit id(前五六位就可以了)就可以了,单还是有另外一种情况,如果你这个窗口关闭了,找不到之前的记录了,这是可以使用 git reflog 显示你的每一次命令。这时候就能找到你当时想要回的的版本的commit id了。

$ git reflog
2229ddd (HEAD -> master) HEAD@{0}: reset: moving to 2229d
0278e7d HEAD@{1}: commit: test git status
2229ddd (HEAD -> master) HEAD@{2}: reset: moving to 2229
e05c76c HEAD@{3}: reset: moving to HEAD^
2229ddd (HEAD -> master) HEAD@{4}: commit: change readme file
e05c76c HEAD@{5}: commit (initial): add a readme file

  • 工作区和暂存区

链接:工作区和暂存区

链接:管理修改

  1. 撤销修改

未完待续...

参考:廖雪峰Git教程

发布了13 篇原创文章 · 获赞 8 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览