前言:
今日打算重新学习下git的使用方法及常用命令,记录如下。经过半天的学习,终于把git官文档第二章又重新过了一遍了,完结撒花~
0、git的三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)
、已修改(modified)
和已暂存(staged)
。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
Git 仓库目录
是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
Working Directory工作目录
是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
Staging Area暂存区域
是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
- 1)在工作目录中修改文件。
- 2)暂存文件,将文件的快照放入暂存区域。
- 3)提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
1、获取git仓库:
//初始化本地仓库
git init
//克隆远程仓库
git clone [url]
//比如克隆 Git 的链接库 libgit2
git clone https://github.com/libgit2/libgit2
2、记录每次更新到仓库:
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪
。
已跟踪文件:那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能是未修改(Unmodified)
,已修改(Modified)
或已放入暂存区(Staged)
。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
未跟踪文件(Untracked):工作目录中除已跟踪文件以外的所有其它文件
都属于未跟踪文件,它们既不存在于上次快照的记录
中,也没有被放入暂存区
。
查看当前文件的状态:
$ 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)
若显示Untracked files
,则表示未跟踪文件
,我们需要将其添加到暂存区即可。
跟踪新文件:
$ git add 文件名/文件路径
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
若显示Changes to be committed
,则表明是已暂存状态
,也就是该文件是已被跟踪的文件
了。
git add是一个多功能命令:可以用来跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
暂存已修改的文件:若修改了以被跟踪的.md文件,然后查看文件的状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
若出现了CONTRIBUTING.md文件出现在Changes not staged for commit
这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区
。
//现在两个文件都已暂存,下次提交时就会一并记录到仓库。
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
忽略文件:
创建一个名为 .gitignore
的文件,来忽略一些日志文件或者编译过程中创建的临时文件呀,因为我们不希望这些文件总出现在未跟踪文件列表。
glob 模式:指 shell 所使用的简化了的正则表达式。
- 1)星号(*)匹配零个或多个任意字符
- 2)[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c)
- 3)问号(?)只匹配一个任意字符
- 4)如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)
- 5)使用两个星号(*) 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z , a/b/z 或 a/b/c/z 等。
查看已暂存和未暂存的修改:
git diff的作用:当前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好下次提交?
git diff
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged 命令。
请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。
提交更新:
git commit -m"备注"
跳过使用暂存的区域:
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。
git commit -a -m"备注"
移除文件:
要想从git中移除某个文件,就需要把已跟踪文件清单中移除(更加准确的来说,是从暂存区移除),然后提交。
git rm 工作目录中删除指定的文件
强制删除
git rm -f 工作目录中删除指定的文件
删除github中的文件,不删除磁盘中的文件
git rm --cached README
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached 选项:
$ git rm --cached README
git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。 比方说
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件
git rm log/\*.log
该命令为删除以 ~ 结尾的所有文件
git rm \*~
移动文件:
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。 不过 Git 非常聪明,它会推断出究竟发生了什么,至于具体是如何做到的,我们稍后再谈。
git mv file_from file_to
3、git之查看提交历史
使用以下命令来回顾提交历史
git log
git log 有许多选项可以帮助你搜寻你所要找的提交, 下面我们会介绍几个最常用的选项。
使用-p来获取每次提交所引入的差异,使用-2来表示最近的两次提交:
git log -p -2
使用--stat选项来获得每次提交的简略统计信息:
git log --stat
使用--pretty来用不同于默认格式的方式展示提交历史,比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short,full 和 fuller 选项,它们展示信息的格式基本一致,但是详尽程度不一:
git log --pretty=online
使用format来定制要显示的记录格式
git log --pretty=format:"%h - %an, %ar : %s"
4、git的撤销操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:
git commit --amend
这个命令会将暂存区中的文件提交
。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息
。换句话说,这个命令将 git add 将文件放在暂存区的文件提交,而此命令主要是修改提交信息。
取消暂存的文件:
取消暂存 CONTRIBUTING.md 文件:
git reset HEAD CONTRIBUTING.md
撤销对文件的修改:
git checkout -- CONTRIBUTING.md
你需要知道 git checkout – [file] 是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失——你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
5、远程仓库的使用
查看远程仓库:
查看远程仓库服务器的简写:
git remote
查看远程仓库的URL:
git remote -v
添加远程仓库:
添加一个新的远程 Git 仓库:
git remote add <shortname> <url>
举例:
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
使用git fetch pb来获取paul仓库中有但是本地仓库中没有的信息:
$ git fetch pb
从远程仓库中抓取与拉取:
从远程仓库中获取数据:
git fetch [remote-name]
使用git pull
命令来自动的抓取后合并远程分支到当前分支,运行git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
推送到远程仓库:
git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。== 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。==
查看某个远程仓库:
git remote show origin
远程仓库的移除和重命名:
值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master
想要将 pb 重命名为 paul:
git remote remote pb paul
git remote
移除与远程仓库的绑定:
git remote rm paul
git remote
6、git之打标签
打标签:
查看所有标签,注意出现的标签是按字母顺序排列的,不是按时间顺序排列:
git tag
创建标签:
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支——它只是一个特定提交的引用。
然而,附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。
附注标签:
最简单的方式是当你在运行 tag 命令时指定 -a 选项,-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息:
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
删除标签:
删除掉本地仓库上的标签
git tag -d <tagname>