Git相关点

Git相关点_第1张图片
工作目录、暂存区域、Git仓库
Git相关点_第2张图片
文件的状态变化周期

1.   修改一个文件commit后,再次修改。此时已暂存和未暂存区都有该文件,只不过已暂存区保存的只是commit后的快照,而非最新的快照。

2.    git diff只显示未暂存的修改,而git diff --staged只显示已暂存的修改

3.    diff显示结果说明与示例:
      先来个栗子, 总行16行,删除2,3,14,15后:

    diff --git a/README.txt b/README.txt
    index 889b952..ad73234 100644
    --- a/README.txt
    +++ b/README.txt
    @@ -1,6 +1,4 @@
    1
    -2
    -3
    4
    5
    6
    @@ -11,6 +9,4 @@
    11
    12
    13
    -14
    -15
    16
    \ No newline at end of file

声明修改前(旧),修改后(新)的文件分别是什么:
--- a/from file
+++ b/to file
如下部分的含义:
@@ -/+某一个区域修改起始行,起始行开始所影响的行数 @@

        "-" 表示旧文件, "+" 表示新文件;此外还要注意@@开始到@@结尾的内容表示的是一块代码区域内的内容的修改,而不是指整个文件。
       因为很显然,一个文件有可能会有很多修改的区域。如上的例子就可以显示出:7到10之间的区域对于两者都是一样的,所以就不会显示出来;
       而当11到16的区域发生改变,则新开一个修改区域,用于说明。另外需要注意的是,删除14,15后,对于源文件影响的是从11行开始的6行;而对于新文件,影响是从第9行开始的4行。为什么是第9行?因为前面已经删除了2,3这两行。为什么是4行?因为后面删除了14,15这2行。
       如果没有 "," 比如"@@ -1 +1,3 @@"说明旧文件只影响了一行,并且该行是第一行。

再来个栗子:总行9行,删除第7行

    diff --git a/README.txt b/README.txt
    index 59edba0..a93362e 100644
    --- a/README.txt
    +++ b/README.txt
    @@ -4,6 +4,5 @@
    4
    5
    6
    -7
    8
    9
    \ No newline at end of file

由于新/旧文件的1 ~3行没有改变,所以就没必要显示出来。(这是当然的啊,如果一个类有1万行,就修改了1行,怎么可能会要把1万行都显示出来)
所以旧文件的修改区域是从第4行开始的6行,而新文件是从第4行开始的5行。

4.   假设有两个文件,一个文件已经commit过,而另外一个修改后没有commit,当执行git commit -m "descrption" .时,同样会把没有commit的文件一同提交上去。
如果不是加上 "." 则只会把暂存区的内容提交上去。
当然还有种方法git commit -a -m "descrption" -a会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤。

5.   手动删除文件,会在非暂存区显示

Changes not staged for commit:
  (use "git add/rm ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        deleted:    test1.txt

但使用git rm,则会物理删除文件的同时,并把该操作放到暂存区

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        deleted:    test1.txt

当然上面的操作,等同于:手动删除,然后git add手动添加该操作到暂存区。
如果想删除暂存区里的文件,则要加上-f强制删除,如果不加:

error: the following file has changes staged in the index:
    test1.txt
(use --cached to keep the file, or -f to force removal)

由于rm不加其他指令会物理删除,如果不想物理删除,只是不想被git跟踪,可以使用:
git rm --cached file

这时在暂存区和非暂存区都会看到该文件:

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        deleted:    test1.txt

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

        test1.txt

6.   git mv

不仅是移动,还可以重命名一个文件/文件夹/symlink

$ git mv README.md README
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
renamed: README.md -> README

上面那条指令相当于:

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

mv是linux的指令,这条指令本身也可以支持重命名/移动
但是没必要那么上述那么麻烦,直接git mv就可以了

7.    git log

选项情况一:
git log -p -2
-p 显示每次提交的内容差异
-2 仅显示最近两次提交

选项情况二:
git log --stat
显示到每次提交的简略的统计信息

选项情况三
git log --pretty=指令
简单的"指令"有:oneline,short,full 和 fuller
   "="后面直接接"指令",没有空格

下面重点介绍一个指令:format
情况三公式的"指令部分"替换为:
format:"样式字符串"

栗子:

$ git log --pretty=format:"%h - %an %ad , %cn %cd"
ca82a6d - Scott Chacon Mon Mar 17 21:52:11 2008 -0700 , Scott Chacon Fri Apr 17 21:56:31 2009 -0700
085bb3b - Scott Chacon Sat Mar 15 16:40:33 2008 -0700 , Scott Chacon Fri Apr 17 21:55:53 2009 -0700
a11bef0 - Scott Chacon Sat Mar 15 10:31:28 2008 -0700 , Scott Chacon Sat Mar 15 10:31:28 2008 -0700

format的参数有很多,自己查阅资料
上述:%an表示作者(author),%cn表示提交者(commiter)
区别是:
author指的是实际作出修改的人,commiter指的是最后将此工作成果提交到仓库的人。
所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。

最后:显然"样式字符串"的内容是随意的,跟很多语言的format指令很类似。

最后的最后:来一个所有可用选项的汇总:


Git相关点_第3张图片
image.png

你可能感兴趣的:(Git相关点)