1. 版本回退
修改之前readme.txt的内容,运行git status命令查看结果
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
Git status命令可以时刻掌握仓库当前状态。以上结果表明,teadme.txt已经被改动了,但还没有准备提交的修改。
如何查看修改内容呢,使用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 diff(查看difference),了解到修改详情后,需要重新提交文件到仓库
$ git add readme.txt
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后查看仓库状态:
$ git status
On branch master
nothing to commit, working tree clean
总结:
Git status查看文件是否被修改,查看仓库状态。
Git diff查看修改内容。
2. 版本回退
在Git中,我们可以用git log命令查看版本历史纪录:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline
c585e4a6ae21136fddf3fe6e447aa8427b31fc78 (HEAD -> master) recommit
1f60bf7e092fd94c9445d2a0743654e6603ad30e recommit
9b6fa8aef3e22b607e03d8c0821e24f1581465b6 there is 4 files
29b5091840a99a2cd7bf5681bd9c66ff704b0d58 wrote a readme file
提示:前面那一串数字是commit id的版本号。
每次提交一个新版本,实际上Git就会把他们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚的看到时间线。
如何将文件回退到上一个版本呢?
首先,git得需要知道版本号。在git中,用HEAD表示当前版本,上一个就是HEAD^,上上一个就是HEAD^^,上上上一个就是HEAD^^^,往上100个版本HEAD~100。
现在要回退到上一个版本,就可以用git reset命令
student30@CN01VRIAPC30 MINGW64 /g/learngit (master)
$ git reset --hard HEAD^
HEAD is now at 9b6fa8a there is 4 files
如果想回溯到转换之前的版本呢?
那得找到那一串数字的号码,然后通过reset版本号就可以了。
$ git reset --hard c585e4a6ae21136fddf3fe6e447aa8427b31fc78
HEAD is now at c585e4a recommit
如果版本号丢失了,找不到怎么办呢?
在Git中,提供了一个命令git reflog用来记录你的每一次命令:
student30@CN01VRIAPC30 MINGW64 /g/learngit (master)
$ git reflog
c585e4a (HEAD -> master) HEAD@{0}: reset: moving to c585e4a6ae21136fddf3fe6e447aa8427b31fc78
9b6fa8a HEAD@{1}: reset: moving to HEAD^
1f60bf7 HEAD@{2}: reset: moving to HEAD^
c585e4a (HEAD -> master) HEAD@{3}: commit: recommit
1f60bf7 HEAD@{4}: commit: recommit
9b6fa8a HEAD@{5}: commit: there is 4 files
29b5091 HEAD@{6}: commit (initial): wrote a readme file
总结:
HEAD指向的版本就是当前版本,因此可以用命令git reset --hard commit_id来版本穿梭
穿梭前,用git log查看提交历史,确定回到哪个版本
要重返穿梭前,可以采用git reflog查看命令历史,以便找到回到的版本
3. 工作区和暂存区
工作区(working directory),就是电脑里能看到的目录,比如learngit文件夹就是一个工作区。
版本库(Repository),工作区中一个隐藏目录.git,这个不算工作区,他是Git的版本库。
版本库中很多重要的东西,其中最重要的称为index(或stage)的暂存区,还有Git为我们自动创价的第一这分支master,以及指向master的一个指针叫HEAD。
之前往git版本库中添加文件时是分两步执行的:
第一步git add添加文件,实际上是把文件修改添加到暂存区;
第二步使用git commit提交更改,实际是把暂存区内容提交到当前分支。
所以说,git add命令实际上十八要提交的所有修改放到暂存区(index),然后执行git commit就可以一次性把暂存区的所有修改提交到分支。
4. 管理修改
Git比其他版本控制器优秀的一大原因是,Git跟踪的是修改记录而并非文件。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
5.撤销修改
当修改了文件后,查看当前status你会发现,Git告诉你,git checkout --file可以丢弃工作取得修改:
$ git checkout -- readme.txt
以上命令意为,把readme.txt文件在工作区的修改全部撤销,有两种情况:
1. readme.txt自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态。
2. readme.txt已经添加到暂存区后,又做了修改,现在撤销修改就回到添加到暂存区后的状态。
如果已经把readme.txt加入暂存区怎么办?
1.用命令git reset HEAD 可以把暂存区的修改撤销(unstage),重新放回工作区。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
2. 然后用checkout丢弃工作区的修改
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
总结:
1. 如果该乱了工作区某个文件内容,想直接丢弃工作区的修改时,用命令git checkout -- file
2. 当你不仅该乱了内容,还添加到了暂存区时,还想丢弃修改。有两步:
1. 用命令git reset HEAD , 就回到了场景一
2. 用命令git checkout -- file恢复
3.已经提交了不合适的修改到版本库时,想要撤销本次提交,只能版本回退,前提是没有推送到远程库。
6. 删除文件
利用rm file可以删除文件。
删除后用git commit确认删除,误删用git checkout恢复