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
:
-
只要上面的命令行窗口还没有被关掉,就可以顺着往上找到那个
append GPL
的commit id
是1094adb...
,于是就可以指定回到更新的某个版本:$ git reset --hard 1094a HEAD is now at 83b0afe append GPL
-
窗口已关,可通过
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
文件在工作区的修改全部撤销,这里有两种情况:
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;readme.txt
已经添加到暂存区后,又在工作区作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git 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