您的位置:首页 > 其它

二.基本快照(上)

2016-01-25 14:56 239 查看
二.基本快照(上)


Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目的快照的命令作介绍。

这里有个重要的概念,Git 有一个叫做“索引”的东东,有点像是你的快照的缓存区。这就使你能够从更改的文件中创建出一系列组织良好的快照,而不是一次提交所有的更改。

git add 添加文件到缓存

在 Git 中,在提交你修改的文件之前,你需要把它们添加到缓存。如果该文件是新创建的,你可以执行 git add 将该文件添加到缓存,但是,即使该文件已经被追踪了 —— 也就是说,曾经提交过了 —— 你仍然需要执行 git add 将新更改的文件添加到缓存去。让我们看几个例子:

回到我们的 Hello World 示例,初始化该项目之后,我们就要用 git add 将我们的文件添加进去了。 我们可以用 git status 看看我们的项目的当前状态。
$ git status-s

?? README ?? hello.rb


我们有俩尚未被追踪的文件,得添加一下。
$ git add README hello.rb


现在我们再执行 git status,就可以看到这俩文件已经加上去了。
$ git status-s

A README A hello.rb


新项目中,添加所有文件很普遍,可以在当前工作目录执行命令:git add .。 因为 Git 会递归地将你执行命令时所在的目录中的所有文件添加上去,所以如果你将当前的工作目录作为参数, 它就会追踪那儿的所有文件了。如此,git add . 就和 git add README hello.rb 有一样的效果。 此外,效果一致的还有 git add *,不过那只是因为我们这还木有子目录,不需要递归地添加新文件。

好了,现在我们改个文件,再跑一下 git status,有点古怪。

$ vim README

$ git status-s

AM README A hello.rb


“AM” 状态的意思是,这个文件在我们将它添加到缓存之后又有改动。这意味着如果我们现在提交快照, 我们记录的将是上次跑 git add 的时候的文件版本,而不是现在在磁盘中的这个。 Git 并不认为磁盘中的文件与你想快照的文件必须是一致的 —— (如果你需要它们一致,)得用 git add 命令告诉它。


git status 查看你的文件在工作目录与缓存的状态

正如你在 git add 小节中所看到的,你可以执行 git status 命令查看你的代码在缓存与当前工作目录的状态。我演示该命令的时候加了 -s 参数,以获得简短的结果输出。
若没有这个标记,命令 git status 将告诉你更多的提示与上下文欣喜。 以下便是同样状态下,有跟没有 -s 参数的输出对比

$ git status-s

AM README A hello.rb


而同样的状态,详细的输出看起来是这样的:
$ git status

# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
# new file:   README # new file:   hello.rb #
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:   README #


Git 还会告诉你在你上次提交之后,有哪些文件被删除、修改或者存入缓存了。
$ git status-s

M README D hello.rb


你可以看到,在简短输出中,有两栏。第一栏是缓存的,第二栏则是工作目录的。 所以假设你临时提交了 README 文件,然后又改了些,并且没有执行 git add,你会看到这个:
$ git status-s

MM README D hello.rb


git diff 显示已写入缓存与已修改但尚未写入缓存的改动的区别


git diff #尚未缓存的改动

如果没有其他参数,git diff 会以规范化的 diff 格式(一个补丁)显示自从你上次提交快照之后尚未缓存的所有更改。
$ vim hello.rb

$ git status-s

M hello.rb$ git diff

diff --git a/hello.rb b/hello.rb
index d62ac43..8d15d50 100644
--- a/hello.rb
+++ b/hello.rb @@ -1,7 +1,7 @@ class HelloWorld

def self.hello -    puts "hello world"+    puts "hola mundo"end

end


所以,git status显示你上次提交更新至后所更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。 通常执行完 git status 之后接着跑一下 git diff 是个好习惯。


git diff –cached #查看已缓存的改动

git diff --cached 命令会告诉你有哪些内容已经写入缓存了。 也就是说,此命令显示的是接下来要写入快照的内容。所以,如果你将上述示例中的 hello.rb 写入缓存,因为 git diff显示的是尚未缓存的改动,所以在此执行它不会显示任何信息。
$ git status-s

M hello.rb

$ git add hello.rb

$ git status-s

M hello.rb$ git diff$ 


如果你想看看已缓存的改动,你需要执行的是 git diff --cached。


git diff HEAD 查看已缓存的与未缓存的所有改动

如果你想一并查看已缓存的与未缓存的改动,可以执行 git diff HEAD —— 也就是说你要看到的是工作目录与上一次提交的更新的区别,无视缓存。 假设我们又改了些 ruby.rb 的内容,那缓存的与未缓存的改动我们就都有了。 以上三个 diff 命令的结果如下:
$ vim hello.rb 

$ git diff

diff --git a/hello.rb b/hello.rb
index 4f40006..2ae9ba4 100644
--- a/hello.rb
+++ b/hello.rb @@ -1,7 +1,7 @@ class HelloWorld+  # says hello def self.hello
puts "hola mundo"
end

end

$ git diff--cached 

diff --git a/hello.rb b/hello.rb
index 2aabb6e..4f40006 100644
--- a/hello.rb
+++ b/hello.rb @@ -1,7 +1,7 @@ class HelloWorld

def self.hello -    puts "hello world"+    puts "hola mundo"end

end

$ git diffHEAD 

diff --git a/hello.rb b/hello.rb
index 2aabb6e..2ae9ba4 100644
--- a/hello.rb
+++ b/hello.rb

@@ -1,7 +1,8 @@

class HelloWorld

+  # says hello def self.hello

-    puts "hello world"

+    puts "hola mundo"

end

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: