git学习笔记(2)
在git学习笔记(1)中已经学过了Git的下载,安装和基本使用,接下来学习怎样使用Git进行工作。
1、 Git基础应用
(1)学会使用 git status 命令
上一节中提交了一个名为“readme.txt”的文件,现在对该文件进行修改,增加“this is my first file”字样,这样仓库里的readme.txt文件就和改过后的readme.txt文件不一致了,那怎样查看到readme.txt是否别修改过呢?使用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")
上述文件表示readme.txt被修改过了,但还没有准备提交的修改。
(2)学会使用 git diff xxx
通过 git status 已知readme.txt被修改了,但有时候会忘了上次的修改内容,如果能查看具体修改了什么内容,自然是很好的,可以通过 git diff readme.txt 查看具体修改的内容。
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index e5ac053..0358421 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
-111111111111111111111
\ No newline at end of file
+111111111111111111111
+this is my first git file
\ No newline at end of file
(3)已知修改的内容后,进行提交
(4)小结
-
要随时掌握工作区的状态,使用
git status命令。 -
如果
git status告诉你有文件被修改过,用git diff可以查看修改内容。
2、版本回退
通过上面的学习已经掌握了修改文件并上传到Git版本库的方法,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘。但是,如果某一关没过去,你还可以选择读取前一关的状态,Git也能做到这点,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit(存档点)恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
(1)查看历史提交版本记录 git log
$ git log commit 14e410c8a3ad0b4fcaa0b7faee9653b23d3e4485 Author: Allen Su <allen_su0611@126.com> Date: Wed Jun 14 10:00:09 2017 +0800 second commit 77e0ca3028b2c03df7de08a44d695b32ef36ed09 Author: Allen Su <allen_su0611@126.com> Date: Tue Jun 13 17:48:46 2017 +0800 add new word commit 0714f2ce3777563e901ac616cf83b86b265d3195 Author: Allen Su <allen_su0611@126.com> Date: Tue Jun 13 17:43:06 2017 +0800 wrote a readme file
上述命令显示从近到远的提交日志,一共提交了三个版本,分别是“second”,“add new Word”和“wrote a readme file”。其中commit后面的一长串数字与字母组合是commit id(版本号)这是一个通过SHA1计算出来的非常大的数字,用十六进制表示,因为Git是分布式的版本控制系统,会有很多人在同一个版本库里工作,为了防止冲突,每一个版本号必须唯一。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具(TortoiseGit)查看Git历史,就可以更清楚地看到提交历史的时间线。
(2)回退到上一个版本 git reset -hard HEAD^
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,再上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。现在试着回退到上个版本“add new word”,版本号是77e0ca3...36ed09:
$ git reset --hard 77e0ca3
HEAD is now at 77e0ca3 add new word
上述命令可以退回到版本“add new word”,其中77e0ca3是版本号缩写,Git会自动找到该版本。Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从当前版本指向指定的版本,如:head->second变为head->add new word。
(3)现在查看readme.txt文件,看看是否回到“add new word”的状态 cat readme.txt 。
$ cat readme.txt
this is my first git file
现在可以再看看版本库的状态日志 git log ,可以发现最新的状态“second”已经消失了。
(4)但是,如果反悔了想恢复到回退前的状态,那么也是有办法的,可以直接 git reset --hard xxx 加上回退前最新的版本号缩写,就可以直接恢复了。如果忘了这个版本号了,怎么处理呢?Git有很多反悔的机制,你可以通过 git reflog 命令,查看自己的每一次命令,从这里就能够查看到:
$ git reflog
77e0ca3 HEAD@{0}: reset: moving to 77e0ca3
0714f2c HEAD@{1}: reset: moving to HEAD^
77e0ca3 HEAD@{2}: reset: moving to head^
14e410c HEAD@{3}: commit: second
77e0ca3 HEAD@{4}: commit: add new word
0714f2c HEAD@{5}: commit (initial): wrote a readme file
上述命令第五行显示了“add new word”版本的commit id是77e0ca3,这样就能回到回退前了。
(5)小结
-
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。 -
穿梭前,用
git log可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog查看命令历史,以便确定要回到未来的哪个版本。
3、管理修改
(1)这里有一个很重要的概念:Git跟踪并管理的是修改,而非文件。修改包括内容上的增删改,还有文件上的增删改。下面是一个例子证明Git管理的是修改,步骤如下:
- 第一次修改readme.txt,增加“Git tracks of changes”;
- 然后, git add ;
- 第二次修改readme.txt,修改“Git tracks changes”为“Git tracks changes of files”;
- 最后, git commit -m "Git tracks changes" 。
查看状态如下,表明了第二次的修改没有被提交,只提交了第一次修改的内容:
$ 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管理的是修改,当你用 git add 命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以, git commit 只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用 git diff HEAD -- readme.txt 命令可以查看工作区和版本库里面最新版本的区别:
$ git diff head -- readme.txt
diff --git a/readme.txt b/readme.txt
index ed76a76..8e2a449 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
111111111111111111111
this is my first git file
second modify
-Git tracks changes
\ No newline at end of file
+Git tracks changes of files
\ No newline at end of file
从上面的命令可以看出,第二次的修改没有被提交,如果想提交的话,可以再次 git add 和 git commit ;如果觉得麻烦的话,那可以在一开始的时候, git add 两个修改,然后在一起提交即可:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
(2)撤销修改
- 丢弃工作区的修改git checkout -- file
当你修改了readme.txt后,有两种情况:
(1)修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;(2)已经添加到暂存区后,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近的 git add 或是 git commit 时的状态。 - 丢弃暂存区的修改 git reset HEAD file
如果想把已经添加到暂存区的修改撤销掉(UNstage),可以使用 git reset HEAD file 撤销暂存区的修改,重新回到工作区,然后再利用 git checkout -- file 撤销工作区的修 改。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
$ 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
$ git checkout -- readme.txt
(3)删除文件
先添加一个新文件test.txt到Git并且提交,测试删除文件的功能。
- rm test.txt 删除工作区里的文件,Git知道你删除了文件,因此,工作区和版本库就不一致了。这时,如果 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 test.txt 从版本库中删除test.txt文件,并且 git commit 这样实际上test.txt文件就被完全删除了。
- git checkout -- test.txt 另一种情况是删错了,因为版本库里的test.txt文件还在,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
(4)小结
Git是跟踪修改的时候,每次修改,如果不add到暂存区,那就不会加入到commit中。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file 。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

浙公网安备 33010602011771号