Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Git_5 记录每次更新到仓库(git add、commit) #65

@qingquan-li

Description

@qingquan-li

检查当前文件状态

Git 文件状态:已修改( modified )、已暂存( staged )、已提交( committed )

  • git status :查看文件状态
  • git status <fileName> :查看某个文件状态,例如: git status CONTRIBUTING.md

如果在克隆仓库 git clone 后立即 cd 到此仓库下使用 git status 命令,会看到类似这样的输出:

$ git status
On branch master
nothing to commit, working directory clean

这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。

现在,让我们在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件 README :

$ echo 'My Project' > README
$ git status
On branch 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)

注: $ echo 'My Project' > README 新建 README 文件并输入内容为 My Project 。

在状态报告中可以看到新建的 README 文件出现在 Untracked files 下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪 git add 该文件”, 这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来。


跟踪新文件

使用命令 git add 开始跟踪一个文件。

将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。

  • git add 是一个多功能命令:
    • 可以用它开始跟踪新文件
    • 或者把已跟踪的文件放到暂存区
    • 还能用于合并时把有冲突的文件标记为已解决状态等。

git add README 跟踪 README 文件后,再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:

$ 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 to be committed 这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。


暂存已修改文件

现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 README 的已被跟踪的文件,运行 git status 命令,文件 README 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。

要暂存这次更新(修改),需要运行 git add 命令。

注意:运行了 git add (跟踪文件)之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来。


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

如果 git status 命令的输出对于你来说过于模糊,你想知道具体修改了什么地方,可以用 git diff 命令。

git diff 命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。

示例:Mac 环境下,查看 WangyiCrawler 文件中未暂存的修改:

liqingquandeMacBook-Air:WangyiCrawler fatli$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 17cbc16..4419ac3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1 +1,3 @@
-WangyiCrawler
+hello, git
+Git is great!!!
+haha

注: git diff 命令本身只显示在工作目录中,尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

  • 查看已暂存的修改(将要添加到下次提交里的内容):
    • 可以用 git diff --cached 命令
    • Git 1.6.1 及更高版本还允许使用 git diff --staged ,效果是相同的,但更好记些

附: Git Diff 的插件版本
我们使用 git diff 来分析文件差异。 但是,如果你喜欢通过图形化的方式或其它格式输出方式的话,可以使用 git difftool 命令来用 Araxis ,emerge 或 vimdiff 等软件输出 diff 分析结果。 使用 git difftool --tool-help 命令来看你的系统支持哪些 Git Diff 插件。


忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

示例:

$ cat > .gitignore
*.[oa]
*~
  • 第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。
  • 第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。

Mac 环境下还需要忽略 .DS_Store 属性文件:

$ cat >> .gitignore
.DS_Store

注:GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表:https://github.com/github/gitignore


提交更新

git commit 提交时记录的是放在暂存区域的快照,即将暂存区的文件提交到本地 Git 仓库。

  • 每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit 这种方式会启动文本编辑器以便输入本次提交的说明。
  • 也可以在 git commit 命令后添加 -m 选项,将提交信息与命令放在后面,示例: git commit -m ‘first commit’

参考下篇:远程仓库的使用(以 GitHub 为例)#65


取消提交

$ git log --oneline  # 查看所有的 commit 提交
2d4d11a (HEAD -> master, origin/master) second commit: add weather and optimization
8c16fb7 first commit
(END)
$ git reset HEAD^  # 取消上一次(2d4d11a)的提交
Unstaged changes after reset:
M	wepost.py
M	wepost_dev.py
M	wepost_test.py

跳过使用暂存区域直接提交

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


移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。

  • rm 文件名 :在 Git 文件中,只是删除了本地文件(即只是删除了工作目录中的文件),文件依然存在于 Git 的暂存区域

  • git rm 文件名 :删除了本地文件(即删除了工作目录中的文件),并且从已跟踪文件清单中移除(即从暂存区域移除)

  • git rm -f 文件名 :如果删除之前,文件被修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复

  • git rm —cached 文件名 :只是从已跟踪文件清单中移除(即从暂存区域移除),文件依然存在本地于(即工作目录中)

  • 批量删除示例

    • git rm log/\*.log :删除 log/ 目录下扩展名为 .log 的所有文件
    • git rm \*~ :删除以 ~ 结尾的所有文件

实例:

  • 删除本地仓库 demo (从 GitHub 上 clone 下来)
    • rm -rf demor 用于删除文件夹,加 f 不会收到确认提示)
  • 删除本地仓库 fatli ( gh-pages 分支 )中的所有文件(从 GitHub 上 clone 下来),删除后 fatli 仓库中只剩下 .git 文件夹
    • /Users/fatli/Documents/GitHub/fatli git:(gh-pages) $ git rm -rf .

移动文件(重命名)

在 Git 中对文件改名: git mv file_from file_to

示例:

$ git mv README.md README

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions