一在工作目录中初始化新仓库:
git init
初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录下不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中任何一个文件。
$git add *.c #git add 开始跟踪文件,begin to tracking a new file $git add README $git commit -m 'initial project version'二从现有仓库克隆
Git clone收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。克隆仓库的命令格式:git clone [url]
$git clone git://github.com/schacon/grit.git当前目录下创建一个名为grit的目录,其中包含一个.git的目录, 用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygritGit 支持许多数据传输协议。之前的例子使用的是 git:// 协议,不过你也可以用 http(s):// 或者user @server :/path.git 表示的 SSH 传输协议。
检查当前文件状态(Checking the Status of Your Files)
$git status On branch master nothing to commit,working directory clean#master branch所有文件上次提交后未更改跟踪新文件(Tracking new files)
$ vim README $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track) $git add README #开始跟踪文件 $$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README #README已暂存,如果提交后,将会记录在版本历史暂存已修改文件
修改之前已跟踪过的文件benchmarks.rb,然后再次运行status
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: benchmarks.rb
$ git add benchmarks.rb #git add 把已跟踪的文件放到暂存区 $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: benchmarks.rbgit add还可以用于合并时把有冲突的文件标记为已解决状态。
忽略某些文件(Ignoring Files)
有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常一些自动生成的文件,比如日志文件或者编译过程中创建的临时文件等。我们可以创建名为.gitignorede的文件,列出要忽略的文件模式,文件格式规范如下:
所有空行或者以注释符号 # 开头的行都会被 Git 忽略。 可以使用标准的 glob 模式匹配。 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。查看已暂存和未暂存的跟新(Viewing your Staged and Unstaged Changes)
要查看尚未暂存的文件更新了哪些部分,不加入参数直接输入git diff,此命令比较是工作目录中当前文件和暂存区域快照之间的差异,也就是修改后还没暂存起来的内容。
$ git diff diff --git a/benchmarks.rb b/benchmarks.rb index 3cb747f..da65585 100644 --- a/benchmarks.rb +++ b/benchmarks.rb @@ -36,6 +36,10 @@ def main @commit.parents[0].parents[0].parents[0] end + run_code(x, 'commits 1') do + git.commits.size + end + run_code(x, 'commits 2') do log = git.commits('master', 15) log.size
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用git diff --cached命令(Git 16.1及更高版本还可使用git diff --staged)
提交更新(Committing Your Changes)
若暂存区已经准备妥当就可以提交啦,通过git status查看确认后运行提交命令git commit提交。这会启动文本编辑器以便输入本次提交的说明。(默认会启用shell的环境变量$EDITOR所指定的软件,一般是vim或emacs,或使用git config --global core.editor命令设定你喜欢的编辑器)编辑器会显示如下内容:
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # new file: README # modified: benchmarks.rb # ~ ~ ~ ".git/COMMIT_EDITMSG" 10L, 283C
默认的提交消息包含最后一次运行git status的输出,放在注释行里,退出编辑器时,Git会丢掉注释行,将说明内容和本次跟新提交到仓库。
可以用-m参数后跟提交说明,在一行命令中提交更新
$ git commit -m "Story 182: Fix benchmarks for speed" [master 463dc4f] Story 182: Fix benchmarks for speed 2 files changed, 3 insertions(+) create mode 100644 README
#本次提交是在哪个分支提交的,完整SHA-1校验,有多少文件修订过,多少行添加和删除过。提交时记录的事放在暂存区的快照,任何还未暂存的仍然保持修改状态。
跳过使用暂存区域(Skipping the Staging Area)
有时候使用暂存区域会显得繁琐,Git提供了跳过暂存区域的方式,只要在提交的时候,给git commit 加上-a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤。
移除文件(Removing File)
要从Git中移除某文件,就必须从已跟踪文件清单(确切说是暂存区域)中移除,然后提交,可以用git rm完成,并连带从工作目录中删除指定文件。
如果删除之前修改过并且已经放到暂存区,则必须使用强制删除选项-f,以防误删除文件后丢失修改内容。
如果想把文件从Git仓库中删除(亦即从暂存区移除),但仍然希望保留在当前工作目录中。比如一些大型日志或者一堆.a的文件不小心纳入到仓库,要移除跟踪但不删除,以便稍后在.gitignore文件中不上,用--cached选项即可
$git rm --cached readme.txt #或 git rm log/\*.log
移动文件(Moving Files)
不像其他的VCS系统,Git并不跟踪文件移动操作。如果在Git中重命名了某个文件,仓库存储元数据并不能体现出这次改名操作,但可以推断出来。
$ git mv README.txt README $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.txt -> README其实运行git mv相当于运行了下面三条命令:
$ mv README.txt README $ git rm README.txt $ git add README
$ git log commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <[email protected]> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <[email protected]> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test code commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <[email protected]> Date: Sat Mar 15 10:31:28 2008 -0700 first commit
--word-diff进行单词层面,显示默认上下文默认三行,-U1改为上下文默认一行。
--stat,仅显示简要的增改行数统计。
--pretty,指定使用完全不同于默认格式的方式展示提交历史