git中,文件的状态

我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本。 通常,你会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到到仓库。
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。

git中常用的一个命令便是,git status,该命令的作用是查看哪些文件处于什么状态.
可以用 git status 命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean. 这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是“master”,这是默认的分支名. 此时,新增一个文件,git add readme.txt 此时,运行git status命令 会出现如下的状态: 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)

在状态报告中,可以看到,出现了一个untracked files文件,readme.未跟踪的文件意味着在之前的快照(提交)中没有这些文件,git不会自动的将这些文件纳入可追踪的范围,除非需要明确的指出我要跟踪做这些文件.此时,可以执行:
git add readme.txt
再运行git status
$ 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
可以看到readme文件处于被追踪的状态中,是被暂存的状态.但是仍然没有commit.

此时,如果我们做了修改,对于一个被追踪的文件,进行了修改,如果你修改了一个CONTRIBUTING.md的已经被追踪的文件,然后运行:
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已经跟踪的文件发生了变化.但是还没有被放入暂存区,如需要暂存本次修改,需要运行git add命令.
git add命令是一个多命令,可以使用将其从未追踪文件变为已追踪文件,还可以将已追踪文件未修改的内容,变为已追踪文件暂存.还能用户合并时将冲突文件标记为已解决的状态等.
此时,运行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

可以看到,此时输出的意思为:两个文件都已经暂存,在下次commit时,会一起提交到仓库.

假设此时,需要继续在修改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 add文件只是暂存了上次执行git add命令时文件的暂存,如若继续暂存,需要继续运行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

如果我们需要查看当前工作区文件和暂存区文件的差异,可以使用git diff命令.若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异.

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

现在你已经创建了第一个提交! 可以看到,提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过。

提交记录的是放在暂存区域的快照.任何还未暂存的文件仍然保持已修改的状态,可以在下次提交时纳入版本管理,每次运行一次git commit都是对项目做一次快照,以后可以回到这个状态,或者进行比较.

跳过使用暂存区域
尽管使用暂存区域的方式可以静心准备要提交的细节,但是,有个问题就是繁琐,git提供了一个暂存区域的方式,只要提交的时候,git commit -a,则git会将已经跟踪过的文件暂存起来一起提交.从而省略一次git add,省略的步骤是,将那些已被追踪的文件改为暂存.这是因为 -a 选项使本次提交包含了所有修改过的文件。 这很方便,但是要小心,有时这个选项会将不需要的文件添加到提交中。

查看git提交历史,使用git log命令.会出现下面输出:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon schacon@gee-mail.com
Date: Mon Mar 17 21:52:11 2008 -0700

changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon schacon@gee-mail.com
Date: Sat Mar 15 16:40:33 2008 -0700

removed unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon schacon@gee-mail.com
Date: Sat Mar 15 10:31:28 2008 -0700

first commit

在不传入任何参数的前提下,git log会按照时间顺序列出所有的提交,按照时间顺序倒排,commit之后是每次提交的SHA-1校验和(是一个十六位的长度为四十的哈希值),以及作者信息和提交说明.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工作区和暂存区 工作区 在我们自己电脑中,里面有.git文件夹的那个目录,我们一般叫做git工作区,但是请注意.g...
    程序淡然阅读 2,463评论 0 1
  • 因为原文太长超出字数,Lesson 3 就放在另一篇文章里 How to Use Git and GitHub 标...
    赤乐君阅读 10,682评论 1 5
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 5,299评论 0 3
  • 一、Git学习总结的命名 初始化一个Git仓库。 添加文件到Git仓库步骤分两步:使用命令git add <fil...
    Cheriez阅读 3,247评论 0 1
  • 1.在子线程中更新UI Android中更新UI元素,必须在主线程中进行,否则就会出现异常。 运行以上程序,你会发...
    郑在学_blog阅读 5,915评论 0 4