Git参考简介
本站是Git帮助网站。主要提供最重要,最常用的Git命令,便于学习记忆。命令按照操作类型分类,你可能会尝试做,将目前常用的选项和需要完成这些常见任务的命令。
每一节都有下一节的连接,可以看作一个完整教程。每一页有深入链接,比如官方手册页,以及Pro Git book一书的有关章节,这样你就可以从少数的关键命令深入到其他所有命令。首先,让我们开始像Git一样思考源代码管理。
像Git一样思考
头一件重要的事,是要明白,Git的版本控制,不同于之前用的Subversion,Perforce,或其他SCM。如果你能忘掉自己对版本控制的臆想猜测,并以Git的方式思考Git,学起来应该更容易。
让我们从头开始。假定你在设计新的源代码管理系统。如果没有版本控制工具,如何控制版本?只用复制项目文件夹,保存,像这样:
$ cp -R project project.bak
这样,一旦代码搞砸,就可以轻松地恢复文件,还是看你有什么项目看起来比较像现在看上去是什么样子,当您复制的改变。如果你真的很偏执,可以在backup前加上日期:
$ cp -R project project.2010-06-01.bak
这样一来,就会有一堆项目副本,用来检查对比。你甚至可以使用这种模式相当有效地与他人共享更改。如果你把项目打包成zip,并放在自己的网站,其他开发人员就很容易下载,修改,并发回给你补丁。
$ wget http://sample.com/project.2010-06-01.zip
$ unzip project.2010-06-01.zip
$ cp -R project.2010-06-01 project-my-copy
$ cd project-my-copy
$ (change something)
$ diff project-my-copy project.2010-06-01 > change.patch
$ (email change.patch)
现在,原始开发者可以把修改应用到项目副本。很多开源项目已经合作了好几年。
实际运行起来相当不错,我们写个工具,使操作更简单快捷。和Subversion每个版本都要复制所有文件不同,我们觉得备份不用复制整个目录。
这就是Git的核心。通过git commit命令告诉Git,要保存的项目快照,它记录了项目清单的所有文件。大部分命令与这些舱单看到它们之间的区别或拉的内容,其中,等等。
获取并创建项目
有两种方式获得Git仓库。一是从现有目录初始化新项目或新源代码控制。二是从公共Git仓库克隆,如果你想和他人做同一项目的话。下面分别介绍。
$ cd konichiwa
$ ls
README hello.rb
$ git init
Initialized empty Git repository in /opt/konichiwa/.git/
现在可以看到有个.git子目录在项目中。这就是你的Git仓库,以后项目备份的所有数据都放到这。
$ ls -a
. .. .git README hello.rb
恭喜你,现在有Git仓库的骨架,可以开始项目备份了。
简而言之,用git init,使之成为一个新的Git仓库现有目录的内容。你可以在任何时候的任何目录中,完全在本地。
git clone复制一个Git仓库,再添加新文件
$ git clone git://github.com/schacon/simplegit.git
Initialized empty Git repository in /private/tmp/simplegit/.git/
remote: Counting objects: 100, done.
remote: Compressing objects: 100% (86/86), done.
remote: Total 100 (delta 35), reused 0 (delta 0)
Receiving objects: 100% (100/100), 9.51 KiB, done.
Resolving deltas: 100% (35/35), done.
$ cd simplegit/
$ ls
README Rakefile lib
基础备份
一个重要的概念是,Git有“索引”,作为备份的临时区域排序。让你建立工作目录下一系列修改过的文件,而不是一次提交所有文件的变化备份。
简言之,先用 git add 启动跟踪。接着用 git state 和git diff 看修改了哪些东西,最后用 git commit 记录历史。这就是基本工作流程。
git add 把文件放到暂存区
Git中,必须先把文件放到暂存区,然后才能提交。如果文件是新的,运行git add 把文件放到暂存区,如果文件已经“跟踪”——就是说,你最近已经提交了这个文件 - 还是要调用git add,把修改放到暂存区。让我们来看看这几个例子。
让我们回到Hello World的例子,一旦启动项目,现在用 git add 添加文件。用 git status 看看项目状态。
$ git status -s
?? README
?? hello.rb
所以 git add 现在我们有两个未跟踪文件。现在,我们可以添加它们。
这也是常见的递归添加一个新的项目中的所有文件,像这样通过指定当前的工作目录:git的添加..由于Git会递归添加你给它一个目录下的所有文件,如果你给它的当前工作目录,它会简单地开始追踪每一个文件有。在这种情况下,添加一个git。会做同样的事情,作为一个git添加自述hello.rb,或为此事GIT添加*,但这只是因为我们没有有*不会递归到子目录。
好了,现在如果编辑这些文件,并再次运行git status,会看到一些奇怪的东西。
$ vim README
$ git status -s
AM README
A hello.rb
'AM'状态,是指上次添加后文件已被修改。如果现在就提交快照,将记录上次git add 时的文件版本,而不是我们磁盘上的版本。Git不会把磁盘上的文件当成你想要的快照 -你要告诉 git add 命令。
简而言之,在文件上运行git add ,当你想包括任何变化,你在下次提交快照。将不包括任何你改变,是不添加 - 这意味着你可以多一点比大多数其他的SCM系统的精度与工艺快照。
如果你感兴趣,想保持灵活,一次只保存部分修改的文件,参见《ProGit book》一书的 GIT add 的“- P”选项。
git statue查看您的文件的状态,在工作目录和临时区域
正如你看到git add,才能看到什么暂存区域的地位相比,在您的工作目录的代码,你可以运行git status命令的。我演示了使用- s选项,它给你短输出。没有标志的git status命令会给你更多的背景和提示。这里是- S与不相同的状态输出。简短的输出看起来像这样。
git diff 显示哪些保存了,哪些修改了,但没有保存
git diff 命令有两个主要用途,一个这里讲,另一个在“检验和比较”一节讲。这里用它的方式来描述保存的变化,上演或磁盘上的修改,但没有保存。
git 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 diff 显示没有保存的不同
因此,git diff --cached 命令告诉你哪些文件已经保存,上演自您上次提交,所以,如果你已经保存了hello.rb的修改。git diff 会显示实际上还没有保存的修改。它通常是一个良好的后续命令git的状态。
$ git status -s
M hello.rb
$ git add hello.rb
$ git status -s
M hello.rb
$ git diff
$
如果你想看到保存修改了哪些部分,运行git diff -- cached。