Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

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

Open Qingquan-Li opened 7 years ago

Qingquan-Li commented 7 years ago

检查当前文件状态

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

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


忽略文件

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

示例:

$ cat > .gitignore
*.[oa]
*~

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

$ cat >> .gitignore
.DS_Store

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


提交更新

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

参考下篇:远程仓库的使用(以 GitHub 为例)https://github.com/FatliTalk/blog/issues/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 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。


实例:


移动文件(重命名)

在 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