..." to">
当前位置:   article > 正文

Git版本管理--上_on branch master changes not staged for commit: (u

on branch master changes not staged for commit: (use "git add ..." to


前言

本文续上一篇的学习


一、时光机穿梭

上一节中我们创建提交了一个readme.txt文件,现在我们将其进行更改

Git is a distributed version control system.
Git is free software.
  • 1
  • 2

运行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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

知道了对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.
  • 1
  • 2

然后提交

$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)
  • 1
  • 2
  • 3
  • 4

现在,我们回顾一下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
  • 1
  • 2
  • 3
  • 4

现在我们启动时光穿梭机,准备把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
  • 1
  • 2

看看readme.txt的内容是不是版本add distributed:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
  • 1
  • 2
  • 3

还可以继续回退到上一个版本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
  • 1
  • 2

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再次查看readme.txt

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
  • 1
  • 2
  • 3

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

现在总结一下:
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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

现在,使用两次命令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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

现在,暂存区的状态就变成这样了:
在这里插入图片描述

所以,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
  • 1
  • 2
  • 3
  • 4

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的

本文用于记录博主学习Git的日志,文章内容摘自《廖雪峰官方文档》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/264760
推荐阅读
相关标签
  

闽ICP备14008679号