要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:git
$ git init
若是当前目录下有几个文件想要归入版本控制,须要先用 git add
命令告诉 Git 开始对这些文件进行跟踪,而后提交:github
$ git add *.c $ git add README $ git commit -m 'initial project version'
若是想对某个开源项目出一份力,能够先把该项目的 Git 仓库复制一份出来,这就须要用到 git clone
命令。若是你熟悉其余的 VCS 好比 Subversion,你可能已经注意到这里使用的是 clone
而不是checkout
。这是个很是重要的差异,Git 收取的是项目历史的全部数据(每个文件的每个版本),服务器上有的数据克隆以后本地也都有了。实际上,即使服务器的磁盘发生故障,用任何一个克隆出来的客户端均可以重建服务器上的仓库,回到当初克隆时的状态(虽然可能会丢失某些服务器端的挂钩设置,但全部版本的数据仍旧还在,有关细节请参考第四章)。正则表达式
克隆仓库的命令格式为 git clone [url]
。好比,要克隆 Ruby 语言的 Git 代码仓库 Grit,能够用下面的命令:shell
$ git clone git://github.com/schacon/grit.git
这会在当前目录下建立一个名为grit
的目录,其中包含一个 .git
的目录,用于保存下载下来的全部版本记录,而后从中取出最新版本的文件拷贝。若是进入这个新建的 grit
目录,你会看到项目中的全部文件已经在里边了,准备好后续的开发和使用。若是但愿在克隆的时候,本身定义要新建的项目目录名称,能够在上面的命令末尾指定新的名字:服务器
$ git clone git://github.com/schacon/grit.git mygrit
惟一的差异就是,如今新建的目录成了 mygrit
,其余的都和上边的同样。ui
Git 支持许多数据传输协议。以前的例子使用的是 git://
协议,不过你也能够用 http(s)://
或者user@server :/path.git
表示的 SSH 传输协议。咱们会在第四章详细介绍全部这些协议在服务器端该如何配置使用,以及各类方式之间的利弊。url
使用命令 git add
开始跟踪一个新文件。因此,要跟踪 README 文件,运行:spa
$ git add README
通常咱们总会有些文件无需归入 Git 的管理,也不但愿它们总出如今未跟踪文件列表。一般都是些自动生成的文件,好比日志文件,或者编译过程当中建立的临时文件等。咱们能够建立一个名为 .gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:.net
$ cat .gitignore *.[oa] *~
第一行告诉 Git 忽略全部以 .o
或 .a
结尾的文件。通常这类对象文件和存档文件都是编译过程当中出现的,咱们用不着跟踪它们的版本。第二行告诉 Git 忽略全部以波浪符(~
)结尾的文件,许多文本编辑软件(好比 Emacs)都用这样的文件名保存副本。此外,你可能还须要忽略 log
,tmp
或者 pid
目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore
文件的习惯,以避免未来误提交这类无用的文件。版本控制
文件 .gitignore
的格式规范以下:
#
开头的行都会被 Git 忽略。/
)说明要忽略的是目录。!
)取反。所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?
)只匹配一个任意字符;若是在方括号中使用短划线分隔两个字符,表示全部在这两个字符范围内的均可以匹配(好比 [0-9]
表示匹配全部 0 到 9 的数字)。
咱们再看一个 .gitignore
文件的例子:
# 此为注释 – 将被 Git 忽略 # 忽略全部 .a 结尾的文件 *.a # 但 lib.a 除外 !lib.a # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO /TODO # 忽略 build/ 目录下的全部文件 build/ # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt # ignore all .txt files in the doc/ directory doc/**/*.txt
A **/
pattern is available in Git since version 1.8.2.