赞
踩
目录
已提交表示数据已安全地保存到本地数据库中
已修改表示修改了文件,但还没有保存到数据库中
已暂存表示对一个已修改文件地当前版本做了标记,使之包含在下次提交地快照中
- git status #文件状态查询
- git status -s 或者 git status --short #状态报告更紧凑
- git diff # 看暂存前后的变化
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使 用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟 踪过的文件暂存起来一并提交,从而跳过 git add 步骤,在提交时,可以给本次的修改添加说明,方便后续查看,例如:git commit -m "182: add note "
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提 交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
如果删除之前修改过并且已经放到暂存区域的话,则必须 要用强制删除选项 -f (译注:即 force 的首字母)。这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作 目录中。换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有 用。为达到这一目的,使用 --cached ,例如
要在 Git 中对文件改名,可以这么做:
git mv file_from file_to
git mv 就相当于运行了下面三条命令:
- mv README.md README #重命名文件
- git rm README.md #删除老文件名
- git add README #添加新文件名
git log 会按提交时间列出所有的更新,最近的更新排在最上面。
git log 有许多选项可以帮助你搜寻你所要找的提交,接下来我们介绍些最常用的。
一个常用的选项是 -p ,用来显示每次提交的内容差异。你也可以加上 -2 来仅显示最近两次提交。
如果你想看到每次提交的简略的统计信息,你可以使用 --stat 选项。
另外一个常用的选项是 --pretty 。这个选项可以指定使用不同于默认格式的方式展示提交历史。这个 选项有一些内建的子选项供你使用。比如用 oneline 将每个提交放在一行显示,查看的提交数很大时 非常有用。另外还有 short , full 和 fuller 可以用,展示的信息或多或少有些不同。
但最有意思的是 format,可以定制要显示的记录格式。这样的输出对后期提取分析格外有用 — 因为你知 道输出的格式不会随着Git的更新而发生改变
下表为常用的格式占位符写法及其代表的意义
git log 的常用选项
另外还有按照时间作限制的选项,比如 --since 和 --until 也很有用。例如,下面的命令列出所有 最近12年内的提交
这个命令可以在多种格式下工作,比如说具体的某一天 "2008-01-15" ,或者是相对地多久以前 "12 years 1 day 3 minutes ago" 。
还可以给出若干搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选 项搜索提交说明中的关键字。(请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用 --all-match 选项。否则,满足任意一个条件的提交都会被匹配出来)
另一个非常有用的筛选选项是 -S ,可以列出那些添加或移除了某些字符串的提交。比如说,你想找出添 加或移除了某一个特定函数的引用的提交,你可以这样使用:
$ git log -Sfunction_name
最后一个很实用的 git log 选项是路径(path),如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。因为是放在最后位置上的选项,所以用两个短划线(--)隔开之前的选 项和后面限定的路径名。
限制 git log 输出的选项
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有 --amend 选项的提交命令尝试重新提交,最终你只会有一个提交 , 第二次提交将代替第一次提交的结果。
你已经修改了两个文件并且想要将它们作为两次独立的修改提交,像下面这样,你意外地输入了 git add * 暂存了它们两个。如何只取消暂存两个中的一个呢?
在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD <file>... 来取消暂存。所以,我们可以这样来取消暂存 a.c 文件
如果你并不想保留对 a.c 文件的修改怎么办?你该如何方便地撤消修改,将它还原成上 次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 可以使用 git checkout -- [file] 命令,但这是一个危险的命令,除非你确实清楚不想要那个文件了,否则不要使用这个命令。
如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。它会列出你指定的每一个远程 服务器的简写。如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服 务器的默认名字.也可以指定选项 -v ,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简 写。所以, git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。当准备好时 你必须手动将其合并入你的工作。
使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。这对你来说可能是一个更简单或更舒服的 工作流程;默认情况下, git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。运行 git pull 通常会从最初克隆的服务器上抓取数据并自动 尝试合并到当前所在的分支。
当你想分享你的项目时,必须将其推送到上游。这个命令很简单: git push [remote-name] [branch-name] 。当你想要将 master 分支推送到 origin 服务器时 (再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服 务器:
git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同 一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先将他们 的工作拉取下来并将其合并进你的工作后才能推送。
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。如 果想以一个特定的缩写名运行这个命令,例如 origin ,会得到像下面类似的信息
如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。例如,想 要将 pb 重命名为 pa,可以用 git remote rename pb pa
如果因为一些原因想要移除一个远程仓库, 你已经从服务器上搬走了或不再想使用某一个特定的镜像了, 又或者某一个贡献者不再贡献了 ,例如,移除pa,可以使用 git remote rm pa
在 Git 中 用 git tag 列出已有的标签
也可以使用特定的模式查找标签。例如,Git 自身的源代码仓库包含标签的数量超过 500 个。如果只对 1.8.5 系列感兴趣,可以运行: git tag -l 'v1.8.5*'
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。然而,附注标签是存储在 Git 数据库中的一个完整对象。它们是可以被校验的;其中包含打标签者的名 字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与 验证。通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或 者因为某些原因不想要保存那些信息,轻量标签也是可用的。
最简单的方式是当你在运行 tag 命令时指定 -a 选项,如: git tag -a v1.4 -m 'my version 1.4'
-m 选项指定了一条将会存储在标签中的信息。如果没有为附注标签指定一条信息,Git 会运行编辑器要 求你输入信息。
通过使用 git show 命令可以看到标签信息与对应的提交信息
另一种给提交打标签的方式是使用轻量标签。轻量标签本质上是将提交校验和存储到一个文件中 - 没有保 存任何其他信息。创建轻量标签,不需要使用 -a 、 -s 或 -m 选项,只需要提供标签名字:git tag v1.4-lw
现在我们运行git show v1.4-lw不会看到打标签者的相关信息,只会显示出提交信息
可以对过去的提交打标签。假设提交历史是这样的:
现在,假设在 v1.2 时你忘记给项目打标签,也就是在 “removed unnecessery test code” 提交。你可以在之后补上标 签。要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):
现在可以看到那一次的提交打上了标签
默认情况下, git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送 标签到共享服务器上。这个过程就像共享远程分支一样 - 你可以运行 git push origin [tagname] 。如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。这将会把所有不在 远程仓库服务器上的标签全部传送到那里( git push origin --tags)
1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
在现有项目地目录下输入
$ git init
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生 成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。文件格式如下,要忽略其它日志、编译的临时文件可以按照这个格式编写
- *.[oa] //告诉Git忽略所有以.o 或.a结尾的文件
- *~ //告诉Git忽略所有以波浪符(~)结尾的文件
文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式可以以( / )开头防止递归。
匹配模式可以以( / )结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号( * )匹配零个或多个任意字符; [abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号( ? )只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字 符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。使用两个星号( * ) 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z , a/b/z 或 a/b/c/z 等。
https://github.com/github/gitignore 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表。
本文参考书目:Pro+Git+第二版(中文版)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。