Git学习笔记(二)

一.时光机穿梭

Git命令简介

cat readme.txt 用于打开一个文件,并可以查看其中的内容。

$ cat readme.txt
Git is a version control system
Git is free software

vi readme.txt 打开文件并进入vi编辑器的命令模式。
git status 用于查看当前仓库的状态。
git diff虽然git status能告诉我们文件被修改过了,但是具体修改了什么内容,我们不知道。通过dit diff可以得知。

$ git diff readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
diff --git a/readme.txt b/readme.txt
index 89253dd..71ee8b8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,3 @@
-Git is a version control system
+Git is a distributed version control system
Git is free software

git log 用于显示从最近到最远的提交日志

$ git log
commit 8d75e5c56f8e14d688b67e66ed39f361a0f5a9a5 (HEAD -> master)
Author: AFeng521web <AFeng521web@163.com>
Date:   Tue Jan 23 13:23:21 2018 +0800

    append GPL

commit c91839144365233c387b37b5178bd53931bd119a
Author: AFeng521web <AFeng521web@163.com>
Date:   Tue Jan 23 13:07:55 2018 +0800

    add distributed

commit 597ca77c274dd6571f629bc1546d56d7b99cfcfd
Author: AFeng521web <AFeng521web@163.com>
Date:   Mon Jan 22 22:08:18 2018 +0800

    wrote a readme file

每提交一个版本,实际上Git就会自动把他们串成一条时间线。

时光穿梭

在Git中,用HEAD表示当前版本,用HEAD^表示上一个版本,用HEAD^^表示上上一个版本,往上100个版本用HEAD~100表示。

回退到上一个版本
$ git reset --hard HEAD^
HEAD is now at c918391 add distributed
查看版本日志
$ git log
commit c91839144365233c387b37b5178bd53931bd119a (HEAD -> master)
Author: AFeng521web <AFeng521web@163.com>
Date:   Tue Jan 23 13:07:55 2018 +0800

    add distributed

commit 597ca77c274dd6571f629bc1546d56d7b99cfcfd
Author: AFeng521web <AFeng521web@163.com>
Date:   Mon Jan 22 22:08:18 2018 +0800

    wrote a readme file

后悔了,如何回到未来
寻找要回到未来的那个版本的版本号(commit ID)

$ git reset --hard 8d75e5c
HEAD is now at 8d75e5c append GPL

当不容易找到版本号时,使用git reflog,这条命令用于记录每一次命令。

$ git reflog
8d75e5c (HEAD -> master) HEAD@{0}: reset: moving to 8d75e5c
c918391 HEAD@{1}: reset: moving to HEAD^
8d75e5c (HEAD -> master) HEAD@{2}: commit: append GPL
c918391 HEAD@{3}: commit: add distributed
597ca77 HEAD@{4}: commit (initial): wrote a readme file
能顺利时光穿梭的原理

Git的版本回退速度之所以快,是因为Git内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL 改为指向add distributed,然后顺便把工作区的文件更新了,所以让HEAD指向那个版本号,当前版本就定位到哪里。
这里写图片描述

这里写图片描述

工作区和暂存区

工作区就是电脑里能看到的目录,像afeng这样的文件夹就是一个工作区。
版本库(Repository)工作区中有一个隐藏目录.git,就是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
这里写图片描述
文件添加进版本库(2步)
第一步:用git add把文件添加进去,实际上就是把文件添加到暂存区。
第二步:用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
这里写图片描述
这里写图片描述

管理修改

Git之所以比其余的版本控制软件设计的优秀是因为Git跟踪管理的是修改,而不是文件。
验证过程:

$ vi readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git add readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt


赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ vi readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ cat readme.txt
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 of files.

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git commit -m "git tracks chances"
[master 3382f2a] git tracks chances
 1 file changed, 4 insertions(+), 1 deletion(-)

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ 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 db28b2c..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.
\ No newline at end of file
+Git tracks changes of files.
撤销修改

git checkout – readme.txt命令意思就是把readme.txt文件在工作区的修改全部撤销。(2种情况)
一种是readme.txt自修改后还没有被放到暂存区,现在修改就回到和版本库一模一样的状态。也就是相当于编辑时发现错误,直接手动修改。
另一种是readme.txt已经添加进暂存区,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。

一个简单的实验

假设把错误的修改提交到了暂存区,如何撤销。
第一步:用git reset HEAD file可以把暂存区的修改撤销掉,重新放回工作区。
第二步:用git checkout – file把工作区的修改撤销。

$ cat readme.txt
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 of files.
My stupid boss still prefers SVN

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git add readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt


赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git reset HEAD readme.txt
Unstaged changes after reset:
M       readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ 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")

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git checkout -- readme.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git status
On branch master
nothing to commit, working tree clean

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ cat readme.txt
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中,删除也是一个修改操作。
直接在文件管理器中把没有的文件删了,或者用rm命令删除。
现在,有两种选择。
一种是确实要从版本库删除文件,就git rm file
另一种是删除错了,因为版本库还有,可以直接恢复。
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

$ vi test.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git add test.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git commit -m "test remove"
[master 642ee15] test remove
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ rm test.txt

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ 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")

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ git rm test.txt
rm 'test.txt'

赵亚峰@DESKTOP-0JOAFKG MINGW64 ~/Desktop/afeng (master)
$ cd test.txt
bash: cd: test.txt: No such file or directory

参考资料:廖雪峰老师官网Git教程

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值