pro git读书笔记

pro git读书笔记

起步

三种区域以及三种状态

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

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

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

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

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

用户信息vim

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

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

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

文本编辑器

Git 会使用操做系统默认的文本编辑器,一般是 Vim。 若是你想使用不一样的文本编辑器,例如 Emacs,可使用以下配置:bash

$ 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 的某一项配置less

$ 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)

    README

nothing 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:   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 命令

查看已暂存

而后运行 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:   README
    modified:   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:   README
    modified:   CONTRIBUTING.md

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 文件同时出如今暂存区和非暂存区。 此时的操做是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:   README
    modified:   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:   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
查看未暂存的修改

要查看还没有暂存的文件更新了哪些部分,不加参数直接输入 `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 contributing
 in 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 PR
 that 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.txt

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:   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 speed
 2 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.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        11tt.txt

no 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 step
 1 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.txt

nothing 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 +0800

    commit 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.py

hello@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] delete
 1 file changed, 1 deletion(-)
 delete mode 100644 123.txt

hello@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.py

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git mv aaa.txt s1/123.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)

        renamed:    aaa.txt -> s1/123.txt

# eg.2
hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m 'move action'
[master 63475c1] move action
 1 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.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)

        renamed:    tt.txt -> tt1.txt

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m'mv rename'
[master e56502a] mv rename
 1 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 +0800

    mv rename

diff --git a/tt.txt b/tt1.txt
similarity index 100%
rename from tt.txt
rename to tt1.txt

commit 63475c1e79f00f0b11c153a01bcb6fba26985d8a
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:21:42 2017 +0800

    move action

diff --git a/aaa.txt b/s1/123.txt
similarity index 100%
rename from aaa.txt
rename to s1/123.txt


hello@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 +0800

    mv rename

 tt.txt => tt1.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 63475c1e79f00f0b11c153a01bcb6fba26985d8a
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:21:42 2017 +0800

    move action

 aaa.txt => s1/123.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b627e58c45f055b6e64dcf79096cf802cbe982a3
Author: hello <123456789@qq.com>
Date:   Thu Dec 28 15:20:46 2017 +0800

    213213

 s1/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.txt

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit -m 'add mmm123.txt'
[master a575e22] add mmm123.txt
 1 file changed, 1 insertion(+)
 create mode 100644 mmm123.txt

hello@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 +0800

    add 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 file

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git commit --amend -m'add mmm123.txt hello'    # 修改提交的信息
[master c97ccc3] add mmm123.txt hello
 Date: Thu Dec 28 17:18:20 2017 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 mmm123.txt


hello@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 +0800

    add 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.txt
        pt.txt

nothing 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.txt
        new file:   pt.txt


hello@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.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        mg.txt

hello@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.txt
        new file:   pt.txt


hello@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.txt
        pt.txt

nothing 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.txt

nothing 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 123456
 1 file changed, 1 insertion(+)
 create mode 100644 sg.txt

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:   sg.txt

no changes added to commit (use "git add" and/or "git commit -a")

hello@PC-HELLO MINGW64 /e/Codes/gittest (master)
$ git checkout sg.txt

hello@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 -0700

    changed 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 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed 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 基础 - 打标签

相关文章
相关标签/搜索