一.版本回退
duankun@ubuntu:~/learngit$ git log
commit 8e749cbd2e6be927c4aa6ffcd8e56df142457654
Author: duankun <18301357323@613.com>
Date: Wed Sep 26 00:41:24 2018 -0700
second develop
commit 7ff8d82010e32d0d4790550fa61486795c7e3dcc
Author: duankun <18301357323@613.com>
Date: Wed Sep 26 00:26:02 2018 -0700
wrote a readme file
现在有已经有两个版本被提交到Git仓库里了。
duankun@ubuntu:~/learngit$ git log --pretty=oneline
bc2f19ab6dcbd2b1dbede906c9a79bc885666a0b third develop wrote
8e749cbd2e6be927c4aa6ffcd8e56df142457654 second develop
7ff8d82010e32d0d4790550fa61486795c7e3dcc wrote a readme file
duankun@ubuntu:~/learngit$
这里的一大串字符串就是commit id ,因为 Git是分布式的版本控制系统。
现在Git需要知道当前版本是哪个版本,在Git中, 用HEAD表示当前版本,上一版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易说不过来,所以写成HEAD~100。
duankun@ubuntu:~/learngit$ git reset --hard HEAD^
HEAD is now at 8e749cb second develop
duankun@ubuntu:~/learngit$ git reset --hard HEAD
HEAD is now at 8e749cb second develop
duankun@ubuntu:~/learngit$ git log
commit 8e749cbd2e6be927c4aa6ffcd8e56df142457654
Author: duankun <18301357323@613.com>
Date: Wed Sep 26 00:41:24 2018 -0700
second develop
commit 7ff8d82010e32d0d4790550fa61486795c7e3dcc
Author: duankun <18301357323@613.com>
Date: Wed Sep 26 00:26:02 2018 -0700
wrote a readme file
如果要回到以前的版本,git 提供了一个命令git reflog用来记录你的每一次命令,可以看到每一个版本的commit id, 然后通过命令
$ git reset --hard commit_id
回到制定的版本。
总结:
1.1 HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令 git reset --hard commit_id。
1.2 穿梭前,使用git log 可以查看提交的历史,以便确定要回退到哪个版本。
1.3 要重返回来,用git reflog 查看命令历史,以便确定要回到未来的哪个版本。
二. 工作区(work directory)和暂存区(repository),
工作区就是你在电脑里能看到的目录,比如我创建的learngit文件夹就是一个工作区。
版本库就是工作区有一个隐藏目录.git ,这个不算是工作区,而是Git的版本库。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交但当前分支;
在创建git版本库的时候,git 自动为我们创建了唯一一个master 分支,所以现在git commit 就是往master分支上提交更改 ,也就是需要提交的文件修改通通放在暂存区,然后,一次性提交暂存区的所有修改。
git diff HEAD -- readme.txt 命令可以查看工作区与版本库里面最新版本的区别:
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
第一次修改->git add->第二次修改->git add-> git commit
二.撤销修改
场景1:当你改乱了工作区的某个文件的内容,想直接工作区的修改时,用命令 git checkout -- file
场景2:当你不但改乱了工作区的某个文件的内容,还添加到了暂存区时,想丢弃修改,第一步用命令git reset HEAD file, 返回了场景1,第二步按场景1操作
场景3: 已经提交了不合适的修改到版本库时, 想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
三. 删除文件
命令 git rm file 用于删除一个文件。 如果一个文件已经被提交到版本库, 那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改动内容。