分布式版本控制系统 version control system
Git跟踪并管理的是修改,而非文件。

版本库 repository

创建一个版本库

  1. $ mkdir learngit
  2. $ cd learngit
  3. $ pwd
  4. /Users/michael/learngit

pwd 命令用于显示当前所在的工作目录的绝对路径名称

通过git init命令把这个目录变成可以管理的仓库

  1. $ git init
  2. Initialized empty Git repository in /Users/michael/learngit/.git/

git add添加文件到仓库

  1. $ git add readme.txt

git commit把文件提交到仓库

  1. $ git commit -m "wrote a readme file"
  2. [master (root-commit) eaadf4e] wrote a readme file
  3. 1 file changed, 2 insertions(+)
  4. create mode 100644 readme.txt

-m后面输入的的是这次提交的说明,有利于下次查找
提交命令执行成功后会告诉你,那些文件被改动。
可以add多个文件,然后commit一次性提交。

版本控制

git status命令查看仓库当前的状态

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. modified: readme.txt
  7. no changes added to commit (use "git add" and/or "git commit -a")

上面的输出可得readme.txt被修改过,但没提交。

git diff命令就是查看修改内容,可以知道做了什么修改

  1. $ git diff readme.txt
  2. diff --git a/readme.txt b/readme.txt
  3. index 46d49bf..9247db6 100644
  4. --- a/readme.txt
  5. +++ b/readme.txt
  6. @@ -1,2 +1,2 @@
  7. -Git is a version control system.
  8. +Git is a distributed version control system.
  9. Git is free software.

版本回退

git log命令查看历史记录

  1. $ git log
  2. commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
  3. Author: Michael Liao <askxuefeng@gmail.com>
  4. Date: Fri May 18 21:06:15 2018 +0800
  5. append GPL
  6. commit e475afc93c209a690c39c13a46716e8fa000c366
  7. Author: Michael Liao <askxuefeng@gmail.com>
  8. Date: Fri May 18 21:03:36 2018 +0800
  9. add distributed
  10. commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
  11. Author: Michael Liao <askxuefeng@gmail.com>
  12. Date: Fri May 18 20:59:18 2018 +0800
  13. wrote a readme file

也可以git log --pretty=online简易输出

  1. $ git log --pretty=oneline
  2. 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
  3. e475afc93c209a690c39c13a46716e8fa000c366 add distributed
  4. eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

说明前一大串的是commit id版本号

使用git reset回退版本

  1. $ git reset --hard HEAD^
  2. HEAD is now at e475afc add distributed

HEAD^就是上个版本,HEAD^^就是上上个版本,以此类推。
也可以利用版本号来回退。git reset --hard commit_id

  1. $ git reset --hard 1094a
  2. HEAD is now at 83b0afe append GPL

git reflog命令来记录每一次命令

  1. $ git reflog
  2. e475afc HEAD@{1}: reset: moving to HEAD^
  3. 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
  4. e475afc HEAD@{3}: commit: add distributed
  5. eaadf4e HEAD@{4}: commit (initial): wrote a readme file

工作区和暂存区

工作区(Working Directory)

就像learngit这个文件夹

版本库(Repository)

就是工作区的隐藏目录.git,这个就是Git的版本库。

暂存区

Git - 图1
Git - 图2
Git - 图3

撤销修改

git checkout -- file命令可以丢弃工作区的修改:

  1. $ git checkout -- readme.txt

上面的意思是,把readme.txt文件在工作区的修改全部撤销

  • 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git reset HEAD <file>命令可以把暂存区的修改撤销掉,重新放回工作区。

  1. $ git reset HEAD readme.txt
  2. Unstaged changes after reset:
  3. M readme.txt

删除文件

rm命令删除文件,也可以在文件管理器中把没用的文件删了。

  1. $ rm test.txt

删除后也需要git commit,这样文件就从版本库中被删除了
删错了可以用git checkout -- test.txt恢复回来。

远程仓库

git push把本地库的东西推送到远程。