Git学习笔记

 

参考链接

Git学习笔记

Git是什么

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

创建版本库(Repository)

创建一个空目录,并使用命令行进入当前目录:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

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

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

把文件添加到版本库

用命令git add告诉Git,把文件添加到仓库:

$ git add readme.txt

用命令git commit告诉Git,把文件提交到仓库:

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

Note: 可以多次使用git add添加文件,最后再使用git commit一次性提交。

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

显示工作树的状态

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 readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

版本回退

每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

git log命令查看可以查看查看提交历史记录:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:

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

当你回退版本的时候,Git仅仅是把HEAD从指向该版本,然后把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

若想回到最新版本append GPL,需要通过git reset命令,但是如何找回新版本的commit id

  1. 只要上面的命令行窗口还没有被关掉,就可以顺着往上找到那个append GPLcommit id1094adb...,于是就可以指定回到更新的某个版本:

     $ git reset --hard 1094a
     HEAD is now at 83b0afe append GPL
    
  2. 窗口已关,可通过git reflog找到commit id git reflog用来查看分支的所有操作记录,从而找回commit id

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

工作区和暂存区

管理修改

git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。

Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库) 工作区»»暂存区»»仓库 git add把文件从工作区»»暂存区,git commit把文件从暂存区»»仓库, git diff查看工作区和暂存区差异, git diff –cached查看暂存区和仓库差异, git diff HEAD 查看工作区和仓库的差异, git add的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区, git commit的反向命令git reset HEAD,就是把仓库最新版本转移到暂存区。

撤销修改

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

$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

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

总之,就是让这个文件回到最近一次git commitgit add时的状态。

Note:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

Git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

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

Note: 对比git reset HEAD <file>git reset --hard

  • git reset HEAD <file>指的是从库恢复暂存区某一个文件
  • git reset --hard指的是恢复某一个库。git reset --hard HEAD^是向前回退版本,其中HEAD后面跟几个^就是往回退几个版本,如果回退100个版本,可以写成HEAD~100

小结

工作区、暂存区和版本库

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

在Git中,删除也是一个修改操作。

一般情况下,你通常直接把没用的文件删了:

$ rm test.txt

git status命令会立刻告诉你哪些文件被删除了:

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

现在你有两个选择:

  • 确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

      $ git rm test.txt
      rm 'test.txt'
    
      $ git commit -m "remove test.txt"
      [master d46f35e] remove test.txt
      1 file changed, 1 deletion(-)
      delete mode 100644 test.txt
    
  • 另一种情况是删错了,使用git checkout,用版本库里的版本替换工作区的版本:

      $ git checkout -- test.txt