git基础
获取git仓库
两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
初始化仓库
1 | git init |
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。项目里的文件还没有被跟踪。
开始追踪这些文件并进行初始提交。
1 | git add * |
克隆仓库
执行 git clone
命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
1 | git clone https://github.com/libgit2/libgit2 |
记录每次更新到仓库
对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库。
工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。
检查当前文件状态
1 | git status |
使用 git status -s
命令或 git status --short
命令,你将得到一种格式更为紧凑的输出。
新添加的未跟踪文件前面有 ??
标记,新添加到暂存区中的文件前面有 A
标记,修改过的文件前面有 M
标记。 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。
1 | git status -s |
跟踪新文件
1 | git add |
git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
忽略文件
创建一个名为 .gitignore
的文件,列出要忽略的文件的模式。
星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。 使用两个星号(**
)表示匹配任意中间目录,比如 a/**/z
可以匹配 a/z
、 a/b/z
或 a/b/c/z
等。
1 | cat .gitignore |
查看已暂存和未暂存的修改
想知道具体修改了什么地方,用 git diff
命令。
git diff
比较的是当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
git diff --staged
这条命令将比对已暂存文件与最后一次提交的文件差异。
提交更新
每次准备提交前,先用 git status
看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit
。
1 | git commit -m "" |
移除文件
从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 git rm
命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。
1 | git rm --cached README |
移动文件
在 Git 中对文件改名
1 | git mv file_from file_to |
查看提交历史
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。
-p
或--patch
,它会显示每次提交所引入的差异(按 补丁 的格式输出)。--stat
,每次提交的简略统计信息。可以使用在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。--pretty
, 这个选项可以使用不同于默认格式的方式展示提交历史。format
,可以定制记录的显示格式。--graph
,添加了一些 ASCII 字符串来形象地展示你的分支、合并历史。
1 | git log --pretty=format:"%h - %an, %ar : %s" |
选项 | 说明 |
---|---|
%H |
提交的完整哈希值 |
%h |
提交的简写哈希值 |
%T |
树的完整哈希值 |
%t |
树的简写哈希值 |
%P |
父提交的完整哈希值 |
%p |
父提交的简写哈希值 |
%an |
作者名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 –date=选项 来定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期(距今多长时间) |
%s |
提交说明 |
作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
撤消操作
提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令来重新提交:
提交后发现忘记了暂存某些需要的修改
1 | git commit -m 'initial commit' |
第二次提交将代替第一次提交的结果。
取消暂存的文件
使用 git reset HEAD <file>…
来取消暂存
1 | git reset HEAD CONTRIBUTING.md |
撤消对文件的修改
撤消修改——将它还原成上次提交时的样子
1 | git checkout -- CONTRIBUTING.md |
那些被删除的分支中的提交或使用 --amend
选项覆盖的提交也可以恢复
远程仓库的使用
管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
查看远程仓库
git remote
命令。 它会列出你指定的每一个远程服务器的简写。
-v
,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
1 | git remote -v |
表示能拉取,可以拥有向他们推送的权限。
添加远程仓库
运行 git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:
1 | git remote add pb https://github.com/paulboone/ticgit |
拉取 Paul 的仓库中有但你没有的信息,可以运行 git fetch pb
:
1 | git fetch pb |
从远程仓库中抓取与拉取
1 | git fetch <remote> |
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
使用 clone
命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin
会抓取克隆(或上一次抓取)后新推送的所有工作。
默认情况下,git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master
分支。运行 git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
推送到远程仓库
将 master
分支推送到 origin
服务器
1 | git push origin master |
必须先抓取他们的工作并将其合并进你的工作后才能推送。
查看某个远程仓库
使用 git remote show <remote>
命令。
远程仓库的重命名与移除
运行 git remote rename
来修改一个远程仓库的简写名。
想要移除一个远程仓库使用 git remote remove
或 git remote rm
使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
标签
Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0
、 v2.0
等等)。
列出标签
在 Git 中列出已有的标签非常简单,只需要输入 git tag
创建标签
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
创建附注标签十分简单。 最简单的方式是当你在运行 tag
命令时指定 -a
。
1 | git tag -a v1.4 -m "my version 1.4" |
-m
选项指定了一条将会存储在标签中的信息。
使用 git show
命令可以看到标签信息和与之对应的提交信息:
1 | git show v1.4 |
轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a
、-s
或 -m
选项,只需要提供标签名字:
1 | git tag v1.4-lw |
在标签上运行 git show
,你不会看到额外的标签信息。 命令只会显示出提交信息。
后期打标签
1 | git tag -a v1.2 9fceb02 # 在命令的末尾指定提交的校验和 |
共享标签
git push
命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行 git push origin <tagname>
。
一次性推送很多标签,也可以使用带有 --tags
选项。
1 | git push origin --tags |
Git 别名
如果不想每次都输入完整的 Git 命令,可以通过 git config
文件来轻松地为每一个命令设置一个别名。
1 | git config --global alias.co checkout |
当要输入 git commit
时,只需要输入 git ci
。