文件状态

你工作目录下的每一个文件只有两种状态:tracked 或 untracked

tracked

  • 已跟踪 tracked 的文件是指那些被纳入了版本控制的文件
  • 在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改unmodified、已修改modified 或已放入暂存区staged
  • 简单来说,已跟踪 tracked 的文件就是 Git 知道的文件

untracked

  • 工作目录中除 tracked 文件外的其它所有文件都属于 untracked 文件
  • 它们既不存在于上次快照的记录中,也没有被放入暂存区
  • 初次 clone 某个仓库的时候,工作目录中的所有文件都属于 tracked 文件,并处于 unmodified
  • 编辑文件后,Git 将它们标记为 modified 文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改

文件的状态变化周期

 

检查当前文件状态

可以用 git status 命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:

git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

可以获取到的内容

  • 所有 tracked 件在上次提交后都未被更改过
  • 当前目录下没有出现任何 untracked 的新文件,否则 Git 会在这里列出来
  • 还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离,现在,分支名是“master”,这是默认的分支名

在项目下创建一个新的 README 文件,使用 git status 命令,将看到一个新的 untracked 文件

echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)

可以获取到的内容

  • README 文件出现在 Untracked files 下面
  • untracked 的文件意味着 Git 在之前的快照(提交)中没有这些文件

如何跟踪

git add 文件名

# 更新目录下所有文件
git add .

后面会再详细讲这个命令

跟踪新文件

使用命令 git add 开始跟踪一个文件。 所以,要跟踪 README 文件,运行:

git add README

此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于 staged

git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage) new file: README

可以获取到的内容

  • 只要在 Changes to be committed 这行下面的,就说明是 staged 状态
  • 如果此时提交,那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中

暂存已修改的文件

如果修改了一个名为 CONTRIBUTING.md 的已被 tracked 的文件,然后运行 git status 命令,会看到下面内容

git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: README 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: CONTRIBUTING.md

可以获取到的内容

  • CONTRIBUTING.md 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区
  • 要暂存这次更新,需要运行 git add 命令

再次运行 git add 命令

运行 git add 将“CONTRIBUTING.md”放到暂存区,然后再看看 git status 的输出:

$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: README
modified: CONTRIBUTING.md

再次修改文件内容

编辑 CONTRIBUTING.md,再运行 git status 看看

$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: README
modified: CONTRIBUTING.md 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: CONTRIBUTING.md

可以获取到的内容

  • CONTRIBUTING.md 文件同时出现在暂存区和非暂存区
  • 实际上 Git 只不过暂存了运行 git add 命令时的版本
  • 如果你现在提交代码,CONTRIBUTING.md 的版本是你最后一次运行 git add 命令时的那个版本,而不是当前版本
  • 所以,运行了 git add 之后又编辑了文件,需要再次 git add 把最新版本暂存
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: README
modified: CONTRIBUTING.md
 

真实的实际操作栗子

 

状态简述

  • git status 命令的输出十分详细,但其用语有些繁琐
  • git status -s 或 git status --short ,输出结果更加简洁
git status -s
M markers.py
M test.py
D test_func01.py
D test_login.py
?? text.txt

查看已暂存和未暂存的修改

修改 README 文件后暂存,然后编辑 CONTRIBUTING.md 文件后先不暂存, 运行 status 命令将会看到:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) modified: README 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: CONTRIBUTING.md

初次使用 git diff

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines. If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's

实际栗子

git diff 的作用

  • 比较的是当前文件和暂存区快照之间的差异,也就是修改之后还没有暂存起来的变化内容
  • 若要查看已暂存且要添加到下次提交里的内容,可以用 git diff --staged 命令
  • 会比较已暂存文件与最后一次提交的文件差异
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

git diff

git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动,所以有时候一下子暂存了所有更新过的文件,运行 git diff 后却什么也没有

像之前说的,暂存 CONTRIBUTING.md 后再编辑,可以使用 git status 查看已被暂存的修改或未被暂存的修改。 如果我们的环境(终端输出)看起来如下:

$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) modified: CONTRIBUTING.md 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: CONTRIBUTING.md

现在运行 git diff 看暂存前后的变化:

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
## Starter Projects See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line

然后用 git diff --cached 查看已经暂存起来的变化( --staged 和 --cached 是同义词):

$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines. If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's

实际栗子

提交更新

  • 现在的暂存区已经准备就绪,可以提交了
  • 在此之前,请务必确认还有什么已修改或新建的文件还没有 git add 过, 否则提交的时候不会记录这些尚未暂存的变化
  • 这些已修改但未暂存的文件只会保留在本地磁盘
  • 所以,每次准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit
git commit -m "test"

可以获取到的内容

  • commit 之后 git status 可以看到本地是干净的
  • 提交后会显示当前是在哪个分支(master)提交的
  • 本次提交的完整 SHA-1 校验和是什么(9a8c6b3
  • 以及在本次提交中,有多少文件修订过,多少行添加和删改过

重点

  • 提交时(git commit)记录的是放在暂存区域的快照
  • 每一次运行提交操作,都是对项目作一次快照,以后可以回到指定快照版本,或者进行比较

跳过使用暂存区域

  • Git 提供了一个跳过使用暂存区域的方式
  • git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

-a 选项使本次提交包含了所有修改过的文件,但是要小心,有时这个选项会将不需要的文件添加到提交中

移除文件

两种情况

  • 直接删除文件(从本地删除):-f 参数
  • 只是将文件从 Git 的暂存区移除,并不会删除本地文件:--cached

直接看栗子

已跟踪的文件(出现在暂存区)的文件被执行 git rm --cached 命令后,它会被移出暂存区,重新变成一个未跟踪的文件

移动文件

在 Git 中对文件改名

$ git mv file_from file_to

查看状态信息,也会看到关于重命名操作的说明

文件会自动提交到暂存区,且不需要手动执行 git add

其实,运行 git mv 就相当于运行了下面三条命令

$ mv README.md README
$ git rm README.md
$ git add README

Git 系列教程(5)- 记录每次更新到仓库的更多相关文章

  1. Git(6)-- 记录每次更新到仓库(git clone、status、add、diff、commit、rm、mv命令详解)

    @ 目录 1.克隆现有仓库:git clone 2.检查当前文件状态 :git status 3.跟踪新文件:git add 4.暂存已修改的文件:git add 5.状态简览: git status ...

  2. git学习——记录每次更新到仓库

    记录每次更新到仓库 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或 ...

  3. 2.1获取Git仓库-2.2记录每次更新到仓库

    2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...

  4. git杂记-记录每次更新到仓库

    git status 和 git diff的运用 git status 记录的是关于仓库文件是否有变更,例如是否被修改,是否被添加到暂村区.至于文件更改了什么内容该命令并不关心: git status ...

  5. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  6. Git 系列教程(8)- 远程仓库的使用

    查看远程仓库 如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令,它会列出你指定的每一个远程服务器的名称 如果是刚 clone 下来的自己的库,能看到 origin,这是 Gi ...

  7. Git 系列教程(6)- 查看 commit 提交历史

    查看提交历史 在提交了若干更新,又或者克隆了某个项目之后,如何查看提交历史 git log 官方栗子 运行下面的命令获取该项目: git clone https://github.com/scha 运 ...

  8. Git系列教程一 入门与简介

    一.版本控制引入 可能我们都会有这样的经历:创建了一个文件,并对它做了多次更改,当我们想回到其中的某一次更改的时候,由于时间太长记不得那次更改的内容,于是我们在每次大的更改的时候,会创建一个文件的副本 ...

  9. Git系列教程二 基础介绍

    一.存储方式 如果让我们设计一个版本控制系统,最简单的方式就是每做一次更改就生成一个新的文件. 这样的方式太占用空间,所以传统的版本控制系统都是保存一个文件的某个版本的全部内容以及其他版本相对于这个版 ...

随机推荐

  1. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  2. 003-Java中的变量和数据类型

    @ 目录 一.变量 1.什么变量 2.变量的三要素 3.变量的命名规范 4.变量的分类 5.变量的作用域 6.变量的注意事项 二.数据类型 1.什么是数据类型 2.数据类型有什么用 3.数据类型的分类 ...

  3. 学习C#第二天

    变量 变量是什么? 在数学中,我们对变量的概念有一定的了解和认识,如y=x^2,其中,x,y都是变量. 定义 一个变量就是存储区(内存)中的一个存储单元 变量的声明及初始化 使用变量的步骤 声明一个变 ...

  4. python3使用kivy生成安卓程序

    技术背景 虽然现在苹果占据了很大一部分的市场,但是从销量数据来看,安卓还是占据了人口的高地.这里我们介绍一个用python的kivy+buildozer来进行安卓APP开发的简单教程,从整个过程中来看 ...

  5. 你真的了解Innodb存储引擎?

    前言 前几篇记录了如何查看SQL执行计划.数据库事务相关的知识点 除了这两个,数据库还有两个是非常重要的,必须要考的 就是存储引擎和索引 今天先记录以下InnoDB存储引擎相关的知识点 MySQL存储 ...

  6. C#补位函数PadLeft和PadRight

    左边补位 PadLeft 用法: string str = "100"; str.PadLeft(5,'0') 输出:00100 右边补位 PadRight 用法: str.Pad ...

  7. kali 2019-4中文乱码解决方法

    1.更换阿里源 编辑源,apt-get update && apt-get upgrade && apt-get clean ,更新好源和更新软件 #阿里云deb ht ...

  8. 字节、位、bit、byte、KB、B、字符之间的关系

    一.bit 位bit就是位,也叫比特位,是计算机表示数据最小的单位,例如 1b ,2b,3b..... 说白了就是0或者1:计算机内存中的存储都是01这两个东西. 二.byte 字节byte就是字节 ...

  9. JVM学习笔记(一):JVM初探

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第一章 本文是第一章的一些笔记整理. 2 Java里程碑 2.1 Java起源 1990年Sun公司决定开发一 ...

  10. Spring(11) - Introductions进行类扩展方法

    Introductions(引用),在 Aspect 中称为类型间的声明,使切面能够声明被通知的对象(拦截的对象)实现给定的接口,并提供该接口的实现. 简单点说可以将一个类的实现方法复制到未实现的类中 ...