用Git进行版本控制(四)向仓库中添加commit

前言:
教程来源于Udacity的免费教程-用Git进行版本控制,这里仅是个人的笔记,参考使用。

用Git进行版本控制(四)向仓库中添加commit_第1张图片
image.png

git add:
将文件从工作目录添加到暂存区中。
git commit:
将文件从暂存区中取出,并存储到仓库(repo)中。即实际要提交的地方
git diff:
可以显示两个版本之间的代码差异。与git log -p输出的内容是一致的。

*这里的add和commit和SVN里的概念是一样的

移至正确的项目

如果你一直跟着操作,那么现在你的计算机中,应该在两个目录下有 git 项目:

new-git-project - 使用 git init 转换为 git 仓库的空目录

course-git-blog-project - 使用 git clone 获得的现有博客项目

为了避免与已有的 commit 产生混淆,我们将向 new-git-project 仓库提交 commit。

在终端上,确保使用 cd 命令转到 new-git-project 目录中。如果你没有 new-git-project 目录,现在创建一个。位于该目录中后,运行 git init 命令。如果你之前已经运行了 git init,没关系。多次运行 git init 不会导致任何问题,因为它只是重新初始化 Git 目录。

切换到new-git-project下:
cd
cd new-git-project

用Git进行版本控制(四)向仓库中添加commit_第2张图片
image.png

git status 输出总结
以下是输出:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)
注意最后一行 – nothing to commit (create/copy files and use "git add" to track)。注意到它推荐使用的 git add 命令了吗?这很有帮助!git status 的输出结果将给出下一步应该怎么做的建议或提示。

我们根据反馈的建议操作,并创建一些文件。

创建 HTML 文件
首先,创建一个叫做 index.html 的文件,并添加一些起始代码:




    
    Blog Project
    
    
    



    


注意,代码引用了 CSS 文件和 JavaScript 文件。

现在创建这些 CSS 和 JavaScript 文件。你可以让这两个文件留空。稍后我们将向文件中添加内容。

用Git进行版本控制(四)向仓库中添加commit_第3张图片
image.png

整体回顾
很酷吧?我们尚未对 git 执行任何特殊操作,但是它已经在观察这个目录(因为它是 git 项目),并且知道我们创建了几个新的文件。git status 命令的输出同样十分简洁地告诉我们 git 没有跟踪这些文件。

我们快速回顾一下正在进行的操作以及将要执行的操作:

我们新建了几个希望 git 开始跟踪的文件

为了让 git 能跟踪文件,需要将该文件提交到仓库中

要提交文件,需要将该文件放入暂存区

可以使用 git add 命令将文件从工作目录移到暂存区

工作目录中目前有三个未跟踪文件

index.html

css 目录下的 app.css

js 目录下的 app.js

要将所有文件提交到仓库中,首先需要将这些文件从工作目录移到暂存区。我们将使用 git add 命令将这三个文件移到暂存区。

用Git进行版本控制(四)向仓库中添加commit_第4张图片
image.png

暂存文件
是时候行动了!在终端上运行以下命令,使用 git add 将 index.html 添加到暂存区:

$ git add index.html
注意:我们仅添加了 index.html 文件。稍后我们将添加 CSS 和 JavaScript 文件。

用Git进行版本控制(四)向仓库中添加commit_第5张图片
image.png

Changes to be committed
输出结果中现在出现了全新的区域:"Changes to be committed"区域!这一新的"Changes to be committed"区域显示了位于暂存区的文件!目前只显示了 index.html 文件,因此暂存区只有这个文件。继续这一思路,如果我们现在提交 commit,则只有 index.html 文件会被提交。

提示:你注意到"Changes to be committed"下方的帮助文本了吗?它提示 (use "git rm --cached ..." to unstage),也就是当你不小心运行了 git add 并提供了错误文件,它会提示你应该怎么操作。

顺便提下,git rm --cached 与 shell 的 rm 命令不同。git rm --cached 不会破坏任何属于你的文件,它只是从暂存区删掉了文件。

用Git进行版本控制(四)向仓库中添加commit_第6张图片
image.png

如果我们误添加了一文件,我们可以使用
git rm --cache file name
来将文件从暂存区(staging)中移出

暂存剩余的文件

index.html 文件已暂存。我们再暂存另外两个文件。现在我们可以运行以下命令:

$ git add css/app.css js/app.js
但是要输入的内容好多啊。我们可以使用一个特殊的命令行字符:

句点 .
句点指代当前目录,可以用来表示所有文件和目录(包括所有嵌套文件和目录!)。

  $ git add css/app.css js/app.js
  # 等同于
  $ git add .

唯一要注意的是,你可能会不小心包含多余的文件。现在,我们希望同时暂存 css/app.css 和 js/app.js,因此运行该命令没问题。现在假设你向 img 目录添加了一些图片,但是暂时不想暂存这些图片。运行 git add . 将暂存这些图片。如果你暂存了不想暂存的文件,git status 会告诉你撤消暂存需要用到的命令。

暂存剩余的文件
我们使用以下简写命令暂存剩余的文件:

$ git add .
然后运行 git status:

用Git进行版本控制(四)向仓库中添加commit_第7张图片
image.png

git add 小结
git add 命令用于将文件从工作目录移到暂存区。

$ git add
此命令:

可接受多个文件名(用空格分隔)

此外,可以使用句点 . 来代替文件列表,告诉 git 添加当前目录至暂存区(以及所有嵌套文件)

提交 Commit
我们开始提交吧!

要在 git 中提交 commit,你需要使用 git commit 命令,但是先别运行这条命令。运行这条命令将会打开你在第一节课配置的代码编辑器。如果你尚未运行以下命令:

$ git config --global core.editor
回到 git 配置步骤并让 git 使用你所选的编辑器。

我这里使用的vim编辑器,也可以使用其它的,参考用Git进行版本控制(一)配置中有具体的说明。

输入 git commit 会打开配置好的编辑器。

类似下面这样:(我给提前了,忘记截图)

用Git进行版本控制(四)向仓库中添加commit_第8张图片
image.png

第一段精确地告诉了我们需要执行的操作 - 我们需要为该 commit 提供一条消息。此外 ,任何以字符 # 开头的行将被忽略。在后面还提示:这将是初始 commit。最后,给出了将提交 commit 的文件列表。

我们需要添珈一条“commit消息说明”即可。

用Git进行版本控制(四)向仓库中添加commit_第9张图片
image.png

如果是VIM,输入完成以后,按ESC,然后在命令处输入 :wq,保存退出VIM,回到Git Shell窗口。

现在回到终端,你应该能看到类似于以下内容的界面:

用Git进行版本控制(四)向仓库中添加commit_第10张图片
image.png

终于提交了第一个 commit,恭喜!

使用 -m 选项绕过编辑器
提示:如果你要编写的提交说明很简短,不想等打开代码编辑器后再输入信息,可以直接在命令行中使用 -m 选项传入信息:

$ git commit -m "Initial commit"
在上述示例中,文本"Initial commit"被作为提交说明信息。但是注意,不能为 commit 提供信息的描述(description),只能提供信息部分(message)。

第二个 commit - 添加更改
我们已经短暂休息了一下,现在提交第二个 commit!将以下内容添加到 index.html 中的 body 标记中:

Expedition

下一步是什么?没错,运行 git status!

用Git进行版本控制(四)向仓库中添加commit_第11张图片
image.png

具有多个作用的 git add

我们修改了文件。git 看到该文件已被修改。到目前为止,一切正常。注意,要提交 commit,待提交的文件必须位于暂存区。要将文件从工作目录移到暂存区,我们应该使用哪个命令?答对了,是 git add!

我们使用 git add 向暂存区添加了新建的文件,同样的,我们也能使用同一命令将修改的文件暂存。

现在使用 git add 命令将文件移到暂存区,并使用 git status 验证文件是否位于暂存区。

*即便是修改的文件,也要使用git add命令将修改的文件放在暂存区域。

用Git进行版本控制(四)向仓库中添加commit_第12张图片
image.png

执行了git add 文件变成绿色,这时候就可以commit了,使用-m跳过编辑器。

git commit -m "Add header to blog"

image.png

这时候通过git log 可以查看提前的信息:

用Git进行版本控制(四)向仓库中添加commit_第13张图片
image.png

git commit 小结
git commit 命令会取出暂存区的文件并保存到仓库中。

$ git commit
此命令:

将打开配置中指定的代码编辑器

(请参阅第一节课中的 git 配置流程,了解如何配置编辑器)

在代码编辑器中:

必须提供提交说明

以 # 开头的行是注释,将不会被记录

添加提交说明后保存文件

关闭编辑器以进行提交

然后使用 git log 检查你刚刚提交的 commit!

git diff

The git diff 命令可以用来查看已被加入但是尚未提交的更改。

$ git diff

查看待提交的内容和线上版本的差异。

要查看 git diff 的实际运行效果,我们需要一些未经提交的更改!在 index.html 中,我们重新组织标题的措辞。将标题从"Expedition"改为"Adventure"。保存文件,然后在终端上运行 git diff。

你应该会看到以下结果:

用Git进行版本控制(四)向仓库中添加commit_第14张图片
image.png

哇,看起来是不是很熟悉啊?和运行 git log -p 的结果一样!告诉你个秘密,git log -p 其实就是在后台使用了 git diff。所以你实际上已经知道如何阅读 git diff 的输出结果!

git diff 小结
总结下,git diff 命令用来查看已经执行但是尚未 commit 的更改:

$ git diff
此命令会显示:

已经修改的文件

添加/删除的行所在的位置

执行的实际更改

让 git 忽略某些文件

为何要忽略文件
还记得在几个章节之前学习的 git add 吗?我们可以使用一个特殊的字符来表示当前目录和所有子目录,而不用一个个地添加文件。还记得是什么字符吗?

没错,是句点 (.)!

问题
假设你向项目所在目录添加了一个 Word 文档等文件,但是不希望将该文件添加到仓库中。git 会看到这个新文件,所以在你运行 git status 时,它将显示在文件列表中。

用Git进行版本控制(四)向仓库中添加commit_第15张图片
image.png

在项目中包含此文件存在的潜在问题是,因为 git add . 会添加所有文件,因此该 Word 文档可能会不小心 commit 到仓库。

gitignore
如果你想将某个文件保留在项目的目录结构中,但是确保它不会意外地提交到项目中,可以使用名称特殊的文件 .gitignore(注意文件名开头的点,很重要!)。将此文件添加到 new-git-project项目根目录。你只需列出希望 git ignore(忽略,不跟踪)的文件名,git 将忽略这些文件。

我们用"project.docx"文件试一下。将以下行添加到 .gitignore 文件中:(在根目录新建.gitignore文件,没有扩展名)

project.docx
现在运行 git status 并查看输出结果:

用Git进行版本控制(四)向仓库中添加commit_第16张图片
image.png

*.gitignore无法直接在文件系统中新建,可以通过命令行进行重命名:

mv .gitignore.txt .gitignore

git 知道查看名称为 .gitignore 的文件的内容。因为它在其中看到"project.docx",所以忽略了该文件,并且没有在 git status 的输出结果中显示该文件。

通配符速成课程

假设你向项目中添加了 50 个图片,但是希望 git 忽略所有这些图片。这样的话,是否需要将每个文件名都列在 .gitignore 文件中呢?当然不用了,要不然太可怕了!相反,你可以采用一个叫做 通配符(英 的概念。

通配符允许你使用特殊的字符来表示某些格式/字符。在 .gitignore 文件中,你可以使用:

空白行作为空格

- 将行标记为注释

    • 与 0 个或多个字符匹配
      ? - 与 1 个字符匹配
      [abc] - 与 a、b 或 c 匹配
      ** - 与嵌套目录匹配 - a/**/z 与以下项匹配
      a/z
      a/b/z
      a/b/c/z
      因此如果所有 50 个图片都是 JPEG 图片,并且位于"samples"文件夹中,那么我们可以向 .gitignore 中添加以下行,使 git 忽略所有这 50 个图片。

samples/*.jpg

gitignore 小结
总结下,.gitignore 文件用来告诉 git 不应跟踪的文件。该文件应该放在 .git 目录所在的目录。

你可能感兴趣的:(用Git进行版本控制(四)向仓库中添加commit)