Git命令行笔记

来源:互联网 发布:sql2012还原数据库 编辑:程序博客网 时间:2024/05/17 22:14

对一些命令行的整理,原文:http://blog.jobbole.com/25808/

楼楼自己的博客:http://blog.csdn.net/taotao6039


1、取得项目的Git仓库

1)在工作目录中初始化新仓库

$ git init

2)从现有仓库克隆

$ git clone git://github.com/schacon/grit.git

这会再当前目录下创建一个名为“grit”的目录,其中包含一个.git目录。

自定义目录名称:

$ git clone git://github.com/schacon/grit.git mygrit


2、记录每次更新到仓库

1)检查当前文件状态

$ git status

# On branch master nothing to commit (working directory clean)

出现这句话说明你现在工作目录相当干净。也就是说当前没有任何任何跟踪着的文件,也没有任何文件在上次提交后更改过。

# Untracked files

表明该文件出现在未跟踪文件列表中。Git不会自动将之纳入跟踪范围。

2)跟踪新文件

$ git add README

此时再运行git status,会看到README文件已被跟踪,并处于暂存状态。

【其实git add 的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area,同时未曾跟踪过的文件标记为需要跟踪。】

# Changes to be committed

说明该文件已暂存。如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。

3)暂存已修改文件

$ git status benchmarks.rb

# Changed but not updated

说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行git add 命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)。

下面我们运行git add将benchmarks.rb放到暂存区。

假设此时,我们需要在benchmarks.rb里加一条注释,重新编译存盘后,运行git status看此刻状态:

# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   README
#   modified:   benchmarks.rb
#
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#   modified:   benchmarks.rb

我们可以看到benchmarks.rb文件出现了两次。一次算未暂存,一次已暂存。

实际上 Git 只不过暂存了你运行 git add 命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工作目录中的版本。所以,运行了git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来

4)忽略某些文件

我们可以创建一个名为.gitignore的文件,列出了要忽略的文件模式。

$ cat .gitignore *.[oa] *~

这行命令的意思是告诉Git忽略所有以.o或者.a结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。

文件 .gitignore 的格式规范如下: 

所有空行或者以注释符号 # 开头的行都会被 Git 忽略。可以使用标准的 glob 模式匹配。匹配模式最后跟反斜杠(/)说明要忽略的是目录。 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式:

星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。


5)查看已暂存和未暂存的更新

实际上git status的显示比较简单,仅仅是列出了修改过的文件。

如果要查看具体修改了什么地方,可以用git diff命令。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。请注意,单单 git diff 不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。

若要看已经暂存起来的文件,和上次提交时的快照之间的差异,可以用gif diff -- cached命令。(或者git diff -- staged)

6)提交更新

$ git commit

在提交的时候一定要用git status看看还有什么文件没有git add过,否则提交的时候就不会记录这些还没有暂存起来的变化。

这种方式会启动文本编辑器以便输入本次提交的说明。默认为vim或者emacs。

另外可以使用-m 参数后跟提交说明的方式:

$ git commit -m"Story 182: Fix benchmarks for speed"

7)跳过使用暂存区域

觉得使用暂存区域比较繁琐,可以跳过add步骤:

$ git commit -a -m "add new files."

8)移除文件

$ git rm

要从git中移除某个文件,就必须要从已跟踪文件清单中移除,也就是从暂存区域移除,然后提交。

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changed but not updated” 部分(也就是_未暂存_清单)看到

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆.a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补

使用:$ git rm --cached README

又比如:$ git rm log/\*.log

9)重命名文件

$ git mv file_from file_to

【fatal:当文件未暂存,这条命令会提示错误,此文件不在版本控制里面。】

其实,运行 git mv 就相当于运行了下面三条命令:$mvREADME.txt README  $ git rmREADME.txt $ git add README


3、查看提交历史

1)查看提交历史

$ git log

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。

2)log的选项

-p :展开每次提交的内容差异

-2:仅显示最近两次的更新

如:$ git log -p -2

--stat:仅显示简要的增/改行数统计

如:$ git log --stat

每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计。

--pretty:可以指定使用完全不同于默认格式的方式展示提交历史

如:$ git log -pretty=oneline  将每一个提交放在一行显示,主要显示提交所写的备注

$ git log -pretty=format:"%h - %an, %ar : %s"  可以定制要显示的记录格式,这样的输出便于后期变成提取分析

还有short,full,fuller,分别显示不同容量的内容。

附format中常用占位符写法及其意义:

%H 提交对象(commit)的完整哈希字串

%h 提交对象的简短哈希字串

%T  树对象(tree)的完整哈希字串

%t  树对象的简短哈希字串

%P  父对象(parent)的完整哈希字串

%p  父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用 -date= 选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd提交日期

%cr 提交日期,按多久以前的方式显示

%s  提交说明

3)限制输出长度

除了定制输出格式的选项之外,git log 还有许多非常实用的限制输出长度的选项,也就是只输出部分提交信息。之前我们已经看到过 -2 了,它只显示最近的两条提交,实际上,这是 选项的写法,其中的 n 可以是任何自然数,表示仅显示最近的若干条提交。不过实践中我们是不太用这个选项的,Git 在输出所有提交时会自动调用分页程序(less),要看更早的更新只需翻到下页即可。

另外还有按照时间作限制的选项,比如 --since 和 --until

如:$ git log --since=2.weeks

你可以给出各种时间格式,比如说具体的某一天(“2008-01-15”),或者是多久以前(“2 years 1 day 3 minutes ago”)。

还可以给出若干搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。(请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用--all-match 选项。

如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。因为是放在最后位置上的选项,所以用两个短划线(--)隔开之前的选项和后面限定的路径名。

附其他常用选项:

-(n)    仅显示最近的 n 条提交

--since, --after 仅显示指定时间之后的提交。

--until, --before 仅显示指定时间之前的提交。

--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。




4、撤销操作

1)修改最后一次提交

$ git commit --amend

如果想要撤销刚才的提交操作,我们可以使用此操作。此命令将使用当前的暂存区快照提交。

如果刚才提交信息写错,而提交完没有任何改动,直接运行此命令,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

如果刚才提交时忘了暂存某些修改,可以补上暂存操作,然后再运行 --amend提交:

$ git commit -m "initial commit"

$ git add forgotten_file

$ git commit --amend

2)取消已暂存的文件

比如有两个修改过的文件,我们想分开提交,但不小心使用git add . 全部提交到暂存区域。如何撤销其中的一个文件呢?

$ git reset HEAD bench.txt

现在bench.txt回到了已修改未暂存的状态。

3)取消对文件的修改

$ git checkout -- bench.txt

可以看到,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险,所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过 来重写了此文件。所以在用这条命令前,请务必确定真的不再需要保留刚才的修改。



5、远程仓库的使用

1)查看当前的远程库

$ git remote

此命令会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库。

2)添加远程仓库

$ git remote add pb git://github.com/paulboone/ticgit.git

现在可以用字串 pb 指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb

3)从远程仓库抓取数据

$ git fetch [remote-name]

【etc.】

4)推送数据到远程仓库

$ git push [remote-name] [branch-name]

【etc.】

5)查看远程仓库信息

$ git remote show [remote-name]

6)远程仓库的删除和重命名

重命名:$ git remote rename oldname newname

删除:$ git remote rm [remote-name]



6、打标签

同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做。本节我们一起来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别。

1)列显已有标签

$ git tag

2)新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特 定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标 签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

3)含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

$ git tag -a v1.4 -m 'my version 1.4'

-m为指定对应的标签说明。

4)签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

$ git tag -s v1.5 -m 'my version 1.5'

5)轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a-s 或 -m 选项都不用,直接给出标签名字即可:

$ git tag v1.4-lw

运行 git show 查看此标签信息,就只有相应的提交对象摘要

6)验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

$ git tag -v v1.4.2.1

7)后期加注标签

你甚至可以在后期对早先的某次提交加注标签。

我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

$ git tag -a v1.2 9fceb03

8)分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行git push origin [tagname] 即可:

$ git push origin v1.5

或者一次性推送本地所有新增标签:$ git push origin --tags

现在,其他人克隆共享仓库或拉取数据同步后,也会看到这些标签。




0 0