pro git读书笔记

起步

三种区域以及三种状态

Git 项目有三个工作区域的概念:工作目录,暂存区域以及Git 仓库

  • 工作目录是我们用来修改文件的目录,是对项目的某个版本独立提取出来的内容
  • 暂存区域是用来记录快照的地方,暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中,但是有必要单独提出来,因为其和仓库又有明显的区别, 也被称作`‘索引’'
  • Git仓库是存储文件的地方,这个地方有一系列的快照,记录了文件的状态,是 Git 用来保存项目的元数据和对象数据库的地方

Git之中的文件有三种状态,文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 这三种状态其实并不重要,重要的是三个工作区域的概念,已提交表示git commit -m'xxx',文件保存到仓库了,已暂存表示文件已经执行了git add file,已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中,已修改表示对于本地工作目录之中的文件,进行了修改,是我们普通创作的基本操作

基本的 Git 工作流
  • 在工作目录中修改文件
  • 暂存文件,将文件的快照放入暂存区域
  • 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录
初次运行 Git 前的配置

成功安装git后,会有一个 git config 的文件控制 Git 外观和行为的配置变量

用户信息

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 每一次 Git 提交都会使用这些信息,并且它会写入到每一次提交中,不可更改,需要说明的是,如下的配置都是在bash命令行之中执行的,而不是在git config文件之中

$ git config --global user.name "hello"
$ git config --global user.email 123456789@qq.com

如果使用了 --global 选项,那么该命令只需要运行一次,这样是一种全局配置,如果要针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置

文本编辑器

Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以使用如下配置:

$ git config --global core.editor emacs
检查配置信息

如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

$ git config --list
user.name=hello
user.email=123456789@qq.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

可以通过输入 git config <key>: 来检查 Git 的某一项配置

$ git config user.name
hello

获取帮助

若使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

例如,要想获得 config 命令的手册,执行

$ git help config

Git 基础

获取 Git 仓库

有两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。

在现有目录中初始化仓库

使用 Git 来对现有的项目进行管理,需要进入该项目目录并输入:

$ git init

该命令将创建一个名为 .git 的子目录,这个子目录含有初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。此时仅仅是做了一个初始化的操作,项目里的文件还没有被跟踪。在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,应该开始跟踪这些文件并提交。 可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交

$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
克隆现有的仓库

如果想获得一份已经存在了的 Git 仓库的拷贝,比如说github上面的某一个项目,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 克隆仓库的命令格式是 git clone [url] 。 比如,要克隆 Git 的可链接库 libgit2,可以用下面的命令

$ git clone https://github.com/libgit2/libgit2

这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 以上命令得到的本地仓库和远程仓库名称相同,如果想在克隆远程仓库的时候,自定义本地仓库的名字,可以使用如下命令

$ git clone https://github.com/libgit2/libgit2 mylibgit

这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。

文件状态

工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。编辑过某些文件之后,由于自上次提交后对它们做了修改,Git 将它们标记为已修改文件。 我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。所以使用 Git 时文件的生命周期如下:

要查看哪些文件处于什么状态,可以用 git status 命令。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出

$ git status
On branch master
nothing to commit, working directory clean

这说明所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,该命令还显示了当前所在分支,分支名是 “master”,这是默认的分支名。

现在在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件

$ echo 'My Project' > README
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)READMEnothing added to commit but untracked files present (use "git add" to track)

在状态报告中可以看到新建的 README 文件出现在 Untracked files 下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非使用git add README来说明我需要跟踪该文件, 次吃才会将此文件纳入到跟踪范围之中,并且,此时此文件在暂存区,是一个快照,并未保存到Git 本地仓库之中永久存储

通常,我们使用git status得到的文件状态比较复杂,我们可以使用git status -s来获取简略的信息,通常有A和M两种,A表示新添加的文件,M表示修改过的文件

跟踪/暂存新文件

使用命令 git add 开始跟踪一个文件。 所以,要跟踪 README 文件,可以运行如下命令行

$ git add README

此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态

$ 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后文件存放在暂存区, git add是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。这个命令可以理解为“添加内容到下一次提交中”。

查看已暂存/未暂存已修改的文件

现在我们来修改一个已被跟踪的文件。 如果修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运行 git status 命令,就可实现对已经暂存的文件的状态查看

$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   READMEChanges 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 命令

查看已暂存

然后运行 git add 将"CONTRIBUTING.md"放到暂存区,现在两个文件都已暂存,下次提交时就会一并记录到仓库。输入 git status 可看到

$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   READMEmodified:   CONTRIBUTING.md

假设此时,需要在 CONTRIBUTING.md 里加条注释, 然后保存,再运行 git status ,则有如下输出

$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   READMEmodified:   CONTRIBUTING.mdChanges 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 文件同时出现在暂存区和非暂存区。 此时的操作是1.刚git add过一次,2.然后立即又修改了文档,3.再又运行git status命令。实际上此时的 Git 只不过暂存了运行 git add 命令时的版本(1处的版本), 如果此时提交,CONTRIBUTING.md 的版本是你最后一次运行 git add 命令时的那个版本(1处的版本),而不是在工作目录中的当前版本(2处的版本)。 所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来

$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   READMEmodified:   CONTRIBUTING.md
查看已暂存和未暂存的修改

虽然,现在我们可以使用git status来查看文档的状态,但是这只是针对与文档的,也就是说,我们可以看见那些文档是新增的,那些是修改的,但是具体文档之中修改了什么,新增了什么,我们无法知道,这种情况下,我们需要使用git diff命令来完成查看,尽管 git status 已经通过在相应栏下列出文件名的方式回答了这个问题,git diff 将通过文件补丁的格式显示具体哪些行发生了改变

  • git status: 文件的增减,修改
  • git diff: 文件内容的增加和修改

    • 查看未暂存修改:git diff,也就是比较运行git add前后,修改的文件之间的差别
    • 查看已暂存修改:git diff --cached,这个是比较同一个文件,在本次git add和前一次git add,两次git add之间的差别,cached表示两个快照之间的差别

假如再次修改 README 文件后暂存,然后编辑 CONTRIBUTING.md 文件后先不暂存, 运行 status 命令将会看到:

$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified:   READMEChanges 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
查看未暂存的修改

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 `git diff

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.Please include a nice description of your changes when you submit your PR;if we have to read the whole diff to figure out why you're contributingin the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.If you are starting to work on a particular area, feel free to submit a PRthat highlights your work in progress (and note in the PR title that it's

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容

若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。也就是比较同一个文件,在本次git add和前一次git add,两次git add之间的差别,cached表示两个快照之间的差别,Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些)

$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因

查看已暂存的修改

引入新的例子,新建一个仓库,加入aaa.txt文档在其中,将其引入跟踪,运行一次git add aaa.txt,其中的内容为aaa ,然后修改aaa.txt,在第6行加入bbb,此时运行 git status ,但是此时并未『再次运行』git add命令,此时运行 git status 会看到暂存前后的两个版本。此处要查看的是未暂存的修改,效果如下

$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   aaa.txtChanges 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:   aaa.txt

现在运行 git diff 看暂存前后的变化,此时查看的是未暂存的修改

$ git diff
diff --git a/aaa.txt b/aaa.txt
index 7c4a013..6dad95f 100644
--- a/aaa.txt
+++ b/aaa.txt
@@ -1 +1,6 @@
-aaa
\ No newline at end of file
+aaa
+
+
+
+
+bbb
\ No newline at end of file

然后用 当运行了git add命令后,再次运行git diff --cached ,查看的就是已暂存的修改,比较前后两个stage(暂存)之间的修改和变化,--staged 和 --cached 是同义词

$ git diff --cached
diff --git a/aaa.txt b/aaa.txt
new file mode 100644
index 0000000..6dad95f
--- /dev/null
+++ b/aaa.txt
@@ -0,0 +1,6 @@
+aaa
+
+
+
+
+bbb
\ No newline at end of file
提交更新

当暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 所以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit

$ git commit

如果想要更详细的对修改了哪些内容的提示,可以用 -v 选项,这会将所做的改变的 diff 输出放到编辑器中从而使你知道本次提交具体做了哪些修改。退出编辑器时,Git 会丢掉注释行,用你输入提交附带信息生成一次提交。

另外,也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:

$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed2 files changed, 2 insertions(+)create mode 100644 README

可以看到,提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过。

提交时记录的是放在暂存区域的快照。任何已经修改,但还未暂存(放到快照区(使用git add提交))的文件,在本次提交之中其所作的修改不会保存其中,而在下次添加到缓存区之后,才可以纳入版本管理。 每一次运行提交操作,都是对项目作一次快照,以后可以回到这个状态,或者进行比较

跳过使用暂存区域

使用暂存区域的方式略显繁琐,Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,而直接提交,但是,这种操作只是针对已经加入追踪的文件,对于从未加入追踪的文件,是不会加入追踪的,所以仍然需要git add xxx。如下,111.txt早已加入到追踪,修改之后,并未使用git add,而是直接使用git commit -a -m'commit without add step',而11tt.txt文件从未加入过追踪,所以直接提交的时候,对其不起作用,只能先加入追踪,以后才可以使用直接提交的命令,为了保险起见,建议使用add步骤,然后提交

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
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:   111.txtUntracked files:(use "git add <file>..." to include in what will be committed)11tt.txtno changes added to commit (use "git add" and/or "git commit -a")hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -a -m'commit without add step'
[master 9d5b684] commit without add step1 file changed, 3 insertions(+)hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)11tt.txtnothing added to commit but untracked files present (use "git add" to track)hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git log
commit 9d5b6842302a0b7d3fcb4d58f694cf19a9530972 (HEAD -> master)
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 14:38:07 2017 +0800commit without add step
移除文件

要从 Git 仓库中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,在下一次提交之后,删除的文档就不会出现在跟踪文件清单中,但是当删除文件未提交时,仍然受跟踪,并且是deleted状态。注意的一点是,当使用了git rm 命令删除了某一文件之后,其会立即进入已追踪等待提交的状态,经过实验有无git add .都是可以的,『.』表示当前目录的所有文件,。如下例子中,删除了123.txt文件,并且提交之后显示此分支是clean的

hello@PC-HELLO  MINGW64 /e/Codes/gittest (master)
$ ls
11tt.txt  123.txt  aaa.txt  odf.txt  ppp.txt  tt.pyhello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git rm 123.txt
rm '123.txt'hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m'delete'
[master 72d0b8b] delete1 file changed, 1 deletion(-)delete mode 100644 123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
nothing to commit, working tree clean
移动文件

git中的移动文件,其实也就是改名字+移动两个功能,使用mv命令来完成,格式是$ git mv file_from file_to,可以同一层级改名,也可以不同层级改名+移动,运行 git mv 就相当于运行了如下3条命令

$ mv README.md README
$ git rm README.md
$ git add README

下面两个例子分别是不同层级的移动和同级移动,s1是git仓库下的一个文件夹

# eg.1
hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ ls
11tt.txt  aaa.txt  hello.c  p1.txt  s1/  tt.py  tt.txt  wqe.pyhello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git mv aaa.txt s1/123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)renamed:    aaa.txt -> s1/123.txt# eg.2
hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m 'move action'
[master 63475c1] move action1 file changed, 0 insertions(+), 0 deletions(-)rename aaa.txt => s1/123.txt (100%)hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git mv tt.txt tt1.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)renamed:    tt.txt -> tt1.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m'mv rename'
[master e56502a] mv rename1 file changed, 0 insertions(+), 0 deletions(-)rename tt.txt => tt1.txt (100%)
查看提交历史

最基本的查看提交历史的命令就是git log了,它会显示所有的历史,此时进入文本read-only模式(VIM),需要使用基本的进入,退出等操作,这个不在话下。git log命令常有很多 的参数,一个常用的选项是 -p,用来显示每次提交的内容差异。 加上 -2 来仅显示最近两次提交;--stat 选项在每次提交的下面列出所有文件的增删改和文件内容的增删改情况,这是基本常用的命令,其他命令可以查询

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git log -p -2
commit e56502a144d8f157dfc60296636089ee3235337b (HEAD -> master)
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:24:04 2017 +0800mv renamediff --git a/tt.txt b/tt1.txt
similarity index 100%
rename from tt.txt
rename to tt1.txtcommit 63475c1e79f00f0b11c153a01bcb6fba26985d8a
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:21:42 2017 +0800move actiondiff --git a/aaa.txt b/s1/123.txt
similarity index 100%
rename from aaa.txt
rename to s1/123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git log --stat -3
commit e56502a144d8f157dfc60296636089ee3235337b (HEAD -> master)
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:24:04 2017 +0800mv renamett.txt => tt1.txt | 01 file changed, 0 insertions(+), 0 deletions(-)commit 63475c1e79f00f0b11c153a01bcb6fba26985d8a
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:21:42 2017 +0800move actionaaa.txt => s1/123.txt | 01 file changed, 0 insertions(+), 0 deletions(-)commit b627e58c45f055b6e64dcf79096cf802cbe982a3
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:20:46 2017 +0800213213s1/qqq.txt | 1 +1 file changed, 1 insertion(+)

git log 的常用选项

选项 说明
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

撤消操作

提交后(未修改快照),修改提交信息

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交

$ git commit --amend

这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而修改的只是提交信息。如果提交后发现忘记了暂存某些需要的修改,可以像下面这样操作,(暂时没有演示,只展示命令)

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最终只会有一个提交,也就是第二次提交将代替第一次提交的结果,如下

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git add mmm123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m 'add mmm123.txt'
[master a575e22] add mmm123.txt1 file changed, 1 insertion(+)create mode 100644 mmm123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git log -p -1
commit a575e2225c1b35411d133b1115bca6393290766e (HEAD -> master)
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 17:18:20 2017 +0800add mmm123.txt     # 提交的信息diff --git a/mmm123.txt b/mmm123.txt
new file mode 100644
index 0000000..6e9e156
--- /dev/null
+++ b/mmm123.txt
@@ -0,0 +1 @@
+1232132112312
\ No newline at end of filehello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit --amend -m'add mmm123.txt hello'    # 修改提交的信息
[master c97ccc3] add mmm123.txt helloDate: Thu Dec 28 17:18:20 2017 +08001 file changed, 1 insertion(+)create mode 100644 mmm123.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git log -p -1
commit c97ccc30c76e148bbc3ab2c07b64d10da9944f3e (HEAD -> master)
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 17:18:20 2017 +0800add mmm123.txt hello    # 修改了提交的信息diff --git a/mmm123.txt b/mmm123.txt
new file mode 100644
index 0000000..6e9e156
--- /dev/null
+++ b/mmm123.txt
@@ -0,0 +1 @@
+1232132112312
\ No newline at end of file
取消暂存文件

取消暂存文件,说明此时,文件已经被暂存起来了,也就是已经运行过了git add xxx命令,此时需要取消这次add,那么就需要使用git reset HEAD <file>命令,而且可如果一次存了多个文件,可以使用具体的文件名,一个一个的取消,使用例子如下

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)mg.txtpt.txtnothing added to commit but untracked files present (use "git add" to track)hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git add .renjiaxin@PC-RENJIAXIN MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   mg.txtnew file:   pt.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git reset HEAD mg.txt  # 取消单个文件hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   pt.txtUntracked files:(use "git add <file>..." to include in what will be committed)mg.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git add .hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   mg.txtnew file:   pt.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git reset HEAD .    # 取消多个文件hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)mg.txtpt.txtnothing added to commit but untracked files present (use "git add" to track)
撤消对文件的修改

此处所讲的撤销对文件的修改指的是本地的工作目录中的文件,此时工作目录中的文件已经修改,但是此时还未提交到git仓库之中,此时如果我们想撤销所有对于工作目录中文件的修改,一个方法就是使用仓库中的文件,因为仓库中的文件没有修改过,所以我们可以使用它覆盖本地文件,但是这是一个很危险的动作,因为这样会让我们的工作成果,在不经意之间化为乌有,所以一定要谨慎!撤销的命令为git checkout <file>,运行了此命令,本地文档的修改就被撤销。比如,文档sg.txt的内容本来如下123456,提交之后,又修改pt.txt的内容,在第3行添加654321 hello

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)sg.txtnothing added to commit but untracked files present (use "git add" to track)hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git add .renjiaxin@PC-RENJIAXIN MINGW64 /e/Codes/gittest (master)
$ git commit -m'sg 123456'
[master 5257ed3] sg 1234561 file changed, 1 insertion(+)create mode 100644 sg.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
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:   sg.txtno changes added to commit (use "git add" and/or "git commit -a")hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git checkout sg.txthello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git status
On branch master
nothing to commit, working tree clean
远程仓库的使用

获取远程的仓库,可以使用git clone giturl来将远程的仓库复制到本地,查看远程仓库使用的是git remote,使用git remote -v,可以获取得到需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。 origin是 Git 给克隆的仓库服务器的默认名字。添加一个远程Git仓库使用git remote add <shortname> <url> 命令,同时还可以指定一个轻松引用的简写,设定好简写之后,可以在命令行中使用设定的字符串来代替整个 URL,从远程服务器抓取仓库数据,可以使用git fetch [remote-name],这样会访问远程仓库,并且从中拉取本地还没有的数据,获取其所有分支。如果使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 注意 git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作。有获取也有推送,当我们更新了本地代码,就可以将其推送到远程仓库,使用git push [remote-name] [branch-name],比如想要将 master 分支推送到 origin 服务器时,那么运行git push origin master命令就可以将本地修改推送到远程服务器。如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。如果想要重命名引用的名字可以运行 git remote rename oldname newname 去修改一个远程仓库的简写名,远程删除仓库的分支可以使用git remote rm [branch-name]

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.$ git remote
origin$ git remote -v
origin    https://github.com/schacon/ticgit (fetch)
origin    https://github.com/schacon/ticgit (push)$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
pb    https://github.com/paulboone/ticgit (fetch)
pb    https://github.com/paulboone/ticgit (push)$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit* [new branch]      master     -> pb/master* [new branch]      ticgit     -> pb/ticgit$ git remote rename pb paul
$ git remote
origin
paul$ git remote rm paul
$ git remote
origin
标签

Git 可以给历史中的某一个提交打上标签,以示重要。列出标签只需要输入 git tag。Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。一个轻量标签很像一个不会改变的分支,它只是一个特定提交的引用。附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样就可以拥有以上所有信息;但是如果只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。 轻量标签本质上是将提交校验和存储到一个文件中 , 没有保存任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字。创建附注标签最简单的方式是当你在运行 tag 命令时指定 -a 选项,-m 选项指定了一条将会存储在标签中的信息,通过使用 git show 命令可以看到标签信息与对应的提交信息

$ git tag
v0.1
v1.3$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700changed the version number$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700my version 1.4commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700changed the version number

ref:

1.1.3 起步 - Git 基础, 2.1.6 起步 - 初次运行 Git 前的配置, 3.1.7 起步 - 获取帮助, 4.2.1 Git 基础 - 获取 Git 仓库, 5.2.2 Git 基础 - 记录每次更新到仓库 6.2.3 Git 基础 - 查看提交历史, 7.2.4 Git 基础 - 撤消操作, 8.2.5 Git 基础 - 远程仓库的使用, 9.2.6 Git 基础 - 打标签

pro git读书笔记相关推荐

  1. Pro Git 读书笔记

    一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...

  2. Git 读书笔记(一)

    Git 同其他版本控制系统的主要区别 -- 直接快照,而非比较差异 Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异.这类 ...

  3. pro git 阅读笔记1 基本操作

    Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了.实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时 ...

  4. pro git学习笔记 4

    提交指南 首先,请不要在更新中提交多余的白字符(whitespace).Git 有种检查此类问题的方法,在提交之前,先运行 git diff --check,会把可能的多余白字符修正列出来.下面的示例 ...

  5. Git 读书笔记(二)

    运行 Git 前的配置 Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量.而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为.这些变量可以存 ...

  6. 廖雪峰git读书笔记--添加远程库

    最近又看了看廖雪峰的git教程,在看"添加远程库"这一节时遇到问题,谨记之. 添加远程库超时 在看"添加远程库"这一节时遇到问题, 我先输入 $ git rem ...

  7. got git 读书笔记(1)

    some note about the book "got git" (1) -chaper 2 git add -u 加入缓冲区所有的改动文件         -A 把所有增加/ ...

  8. pro mvvm 读书笔记

    一.分离关注点 目的是确保每一个模块值有单一的,明确的目的,不需要去负责其他的功能.单一的目的也称为关注点. 1.1依赖 引用程序集对于依赖来说不是必须的.依赖关系可能也存在于一个代码单元要知道另一个 ...

  9. 廖雪峰Git教程读书笔记

    因为多人协作导致的不确定因素太多,git需要处理各种各样的情况,除了在多人协作开发过程中用到的常用git命令之外,其它一些不常见的命令的原理和命令都能够在廖老师的教程中给予解答,光通过度娘看解决方法是 ...

最新文章

  1. 如何学习数据挖掘和数据科学的7个步骤
  2. java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
  3. [BZOJ] 3191 [JLOI2013]卡牌游戏
  4. mybatis的工作原理
  5. 问题一:使用AndroidDriver而非原来的AppiumDriver的原因
  6. 超微服务器电源短接启动图解_教你一招,让你的电脑启动速度秒杀别人
  7. java编译找不到符号_javac编译时找不到符号?
  8. Concurrent HTTP connections in Node.js
  9. 以需求管理为例,产品经理如何打造自己的需求分析能力
  10. 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
  11. 回车提交、连续点击、layer提示
  12. nginx 带宽_你知道服务器的带宽怎样设置吗?
  13. 什么是组播?让我们一起解密组播协议(IGMP、PIM)
  14. 如何查找求职简历模板及pdf编辑器去水印
  15. 学习shell的第二天
  16. 路由工作原理+DHCP+静态路由配置
  17. android webview实现拍照
  18. self和parent的用法
  19. strtotime那些事
  20. [架构之路-202]- 常见的需求获取技术=》输出=》用户需求、客户需求(As...., I want.....)、用例图

热门文章

  1. oracle 11g 的em启动不了
  2. JavaScript 方法传参
  3. linux常用命令1
  4. cron计划任务使用
  5. 忘记MySQL密码怎么办
  6. 浦发银行(600000.sh):与中国移动珠联璧合联姻
  7. 愿能与诸位关心的人及时保持互联
  8. 歌唱online活动目录数据库还原[为企业维护windows server 2008系列二]
  9. Day9-Postfix
  10. Java语言的循环控制结构