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指令很类似。
最后的最后:来一个所有可用选项的汇总: