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

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

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

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 的文件,并添加一些起始代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Blog Project</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <link rel="stylesheet" href="css/app.css">
</head>
<body>

    <script src="js/app.js"></script>
</body>
</html>

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

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

image.png

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

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

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

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

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

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

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

index.html

css 目录下的 app.css

js 目录下的 app.js

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

image.png

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

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

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 <file>..." to unstage),也就是当你不小心运行了 git add 并提供了错误文件,它会提示你应该怎么操作。

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

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:

image.png

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

$ git add <file1> <file2> … <fileN>
此命令:

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

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

提交 Commit
我们开始提交吧!

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

$ git config --global core.editor <your-editor's-config-went-here>
回到 git 配置步骤并让 git 使用你所选的编辑器。

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

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

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

image.png

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

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

image.png

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

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

image.png

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

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

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

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

<header>
 <h1>Expedition</h1>
</header>

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

image.png

具有多个作用的 git add

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

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

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

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

image.png

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

git commit -m "Add header to blog"

image.png

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

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。

你应该会看到以下结果:

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 时,它将显示在文件列表中。

image.png

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

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

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

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

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 目录所在的目录。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,855评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,905评论 0 11
  • 下雨天, 音乐和巧克力更配哦! 香蕉和酸奶也很配哦! 剥香蕉 切香蕉 加点酸奶 加点奥利奥碎更好吃哦! 爸爸妈妈 ...
    西安卡乐咪阅读 274评论 0 0
  • 2017年11月20日 星期一 天气 晴 早上轮到婉婷同学做早餐了,可是2个小家伙有点赖床,起来的比较晚...
    言書9130阅读 250评论 3 13
  • 39 还是瞎子摸象 “有人打电话找我吗?”我问法兰。 出乎我意料之外,她居然回答:“有,是皮区,他想和你谈谈。”...
    发现好物阅读 475评论 0 0