..." to">
赞
踩
本文续上一篇的学习
上一节中我们创建提交了一个readme.txt文件,现在我们将其进行更改
Git is a distributed version control system.
Git is free software.
运行git status查看结果
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index d8036c1..013b5bc 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.
\ No newline at end of file
知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add。
第二步git commit之前,我们再运行git status
git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了
提交后,我们再用git status命令看看仓库的当前状态
修改readme.txt文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后提交
$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)
现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:
在Git中,我们用git log命令查看:
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上**–pretty=oneline**参数:
$ git log --pretty=oneline
e356c9dcb902b82c3559d24463df8e7297a64520 (HEAD -> master) append GPL
e8c48bd44ded0d2fb1f0670863a4ab34cbd4c971 add distributed
8c67971a6e0d697a5ad4b40d977e036c7a311a0c wrote a readme file
现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是add distributed的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交e356c…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100
现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命
$ git reset --hard HEAD^
HEAD is now at e8c48bd add distributed
看看readme.txt的内容是不是版本add distributed:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
还可以继续回退到上一个版本wrote a readme file,不过且慢,让我们用git log再看看现在版本库的状态:
最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是e356c
$ git reset --hard e356c
HEAD is now at e356c9d append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再次查看readme.txt
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
在Git中,总是有后悔药可以吃的。当你用**$ git reset --hard HEAD^**回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
$ git reflog
e356c9d (HEAD -> master) HEAD@{0}: reset: moving to e356c
e8c48bd HEAD@{1}: reset: moving to HEAD^
e356c9d (HEAD -> master) HEAD@{2}: commit: append GPL
e8c48bd HEAD@{3}: commit: add distributed
8c67971 HEAD@{4}: commit (initial): wrote a readme file
现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
前面我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
license.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在,使用两次命令git add,把readme.txt和LICENSE都添加后,用git status再查看一下:
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: license.txt
modified: readme.txt
现在,暂存区的状态就变成这样了:
所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"
[master 039364d] understand how stage works
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 license.txt
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的
本文用于记录博主学习Git的日志,文章内容摘自《廖雪峰官方文档》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。