[git学习:Pro git(2)]Git基础

Getting a Git Repository(取得项目的Git仓库)

一在工做目录中初始化新仓库: git

git init

初始化后,在当前目录下会出现一个名为.git的目录,全部Git须要的数据和资源都存放在这个目录下不过目前,仅仅是按照既有的结构框架初始化好了里边全部的文件和目录,但咱们尚未开始跟踪管理项目中任何一个文件。 github

$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的目录, 用于保存下载下来的全部版本记录,而后从中取出最新版本的文件拷贝

若是但愿在克隆的时候,本身定义要新建的项目目录名称,能够在上面的命令末尾指定新的名字: shell

$ git clone git://github.com/schacon/grit.git mygrit
Git 支持许多数据传输协议。以前的例子使用的是 git://  协议,不过你也能够用 http(s)://  或者user @server :/path.git  表示的 SSH 传输协议。

Recording changes to the Repository(记录每次更新到仓库)

检查当前文件状态(Checking the Status of Your Files) vim

$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.rb
git 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,此命令比较是工做目录中当前文件和暂存区域快照之间的差别,也就是修改后还没暂存起来的内容。 url

$ 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) spa

提交更新(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



注意到星号 *  以前的反斜杠 \ ,由于 Git 有它本身的文件模式扩展匹配方式,因此咱们不用 shell 来帮忙展开(译注:实际上不加反斜杠也能够运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子原本就指定了目录,因此效果等同,但下面的例子就会用递归方式匹配,因此必须加反斜杠。)。此命令删除全部 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


Viewing the Commit History (查看提交历史)


$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit



默认git log  会按提交时间列出全部的更新,每次更新都有一个 SHA-1 校验和、做者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。 经常使用选项-p选项展开显示每次提交的内容差别,-2则仅显示最近的两次更新。

--word-diff进行单词层面,显示默认上下文默认三行,-U1改成上下文默认一行。

--stat,仅显示简要的增改行数统计。

--pretty,指定使用彻底不一样于默认格式的方式展现提交历史

相关文章
相关标签/搜索