Pro Git"> Pro Git"> Pro git 笔记 – SakuNight
Pro git 笔记

历史

本地版本控制系统

最流行的称为 rcs(MacOS 依然可以使用),保存并管理文件补丁(patch)记录文件的改动。所以通过不停打补丁计算各个版本的文件内容。

集中化的版本控制系统(CVCS)

诸如 CVS,Subversion 以及 Perforce 等,使用单一的集中管理的服务器,保存文件修订版本。开发者连接到服务器取出文件或提交更新。

分布式版本控制系统(DVCS)

像 Git, Mercurial, Darcs 等。开发者把整个仓库镜像下来。

三个目录

文件拥有三种状态:已提交(committed), 已修改(modified)和已暂存(staged)。

有三个目录:工作目录(working directory), 暂存目录(staging area), git 目录(git directory(repository)).

如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

运行前

安装

编译安装

安装编译依赖

curl zlib openssl expat libiconv

编译

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

下载地址:http://git-scm.com/download

直接安装

Windows:http://msysgit.github.com/

Linux:yum install git-core apt-get install git

Max:http://code.google.com/p/git-osx-installer

配置以及配置文件

Linux

对所有用户适用:/etc/gitconfig 使用 --system 修改

对当前用户:~/.gitconfig 使用 --global 修改

对当前项目:.git/config 不添加上述的两个参数即可修改

Windows

Git 会找寻 用户主目录下的 .gitconfig 文件,此外还会找寻 /etc/gitconfig ,此时以 Git 的安装目录作为根目录。

配置命令

使用 git config 进行配置,可以呼叫 git-config 命令。

用户信息

使用以下命令以配置自己的用户信息,提交的时候会一并提交。

$ git config --global user.name "name"
$ git config --global user.email mail

默认编辑器

git config --global core.editor emacs

差异分析工具

用于合并冲突的时候分析比较

git config --global merge.tool vimdiff

查看配置文件

git config --list

有时候会看到相同的变量,是由于 Git 输出了来自不同文件的配置信息,不过默认采用最后一个。

如果需要单独看某一项变量的话,可以使用以下命令(以 user.name 为例)

git config user.name

帮助文件

三种方法查看 <verb> 的帮助

$git help <verb>
$git <verb> --help
$man git-verb

该命令无需联网

Git 基础操作

创建仓库

$git init
$git clone [url]

注意 [url] 有三种协议:

# git://协议(在末尾添加的是本地新建的文件夹名字)
$git clone git://github.com/schacon/grit.git mygrit
# http(s) 协议
$git clone https://github.com/schacon/grit.git
# ssh 协议
$git clone user@server:/path.git

git status

可以查看目录状态,显示出未跟踪的文件,未提交的文件。

工作目录下面的所有文件有两种状态:已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。

Git 不会自动跟踪刚新建的文件,除非手动 git add(此命令的功能除此之外还可以把已跟踪的文件放到暂存区,还能把合并时的冲突文件标记为已解决等)。

忽略的文件(.gitignore)

在工作目录下创建 .gitignore 文件可以指定需要忽略的文件类型,该文件的语法如下:

  • 空行和 # 开头的行会被忽略
  • 可以使用标准的 glob 模式(Shell 采用的匹配模式)匹配
  • 最后跟反斜杠 / 表示忽略目录
  • 可以使用 ! 表示取反,但是若父目录被忽略,则取反不起作用。

glob 模式

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

git diff

可以显示还没有暂存的变化,而不是比较文件。

加上 --cached 或者 --staged 参数可以比较暂存区和上一次提交的快照的变化。

git commit

用于提交文件,输入后会使用默认编辑器(一般是系统环境变量 EDITOR 所指定,默认 Vim 或者 Emacs,也可以用 git config --global core.editor 修改)打开文件 .git/COMMIT_EDITMSG。开头会有注释行,是 git status 的内容,随后有一空行,用于输入提交信息。推出后 Git 会去掉注释行,将说明内容和本次更新提交到仓库。另外也可以用 -m 参数后跟提交说明的方式,在一行命令中提交更新:

跳过使用暂存区域

git commit 加上 -a,git 会自动把跟踪的文件全部提交。

git rm

用于删除暂存区的文件,使文件称为未跟踪状态。工作目录的文件会一并删除。

如果删除之前修改过(未暂存),则需要加上 -f

如果仅删除暂存的文件,不删除本地文件(例如不小心提交的日志文件),则加上 --cached

注意在 Shell 中的 *,前面加上 \ 转义表示使用 git 的匹配模式,会递归进入子文件夹,不加 \ 表示使用 Shell 的匹配模式,不会进入子文件夹。

git mv

mv 差不多,不过有时候用其他工具批处理改名的话,要记得在提交前删除老的文件名,再添加新的文件名。

git log

#选项 说明
#    -p 按补丁格式显示每个更新之间的差异。
#    --stat 显示每次更新的文件修改统计信息。
#    --shortstat 只显示 --stat 中最后的行数修改添加移除统计。
#    --name-only 仅在提交信息后显示已修改的文件清单。
#    --name-status 显示新增、修改、删除的文件清单。
#    --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

pretty

--pretty 可以修改不同的显示方式,oneline 使每次提交放在一行,还有 short full fuller 等。

$git log --pretty=oneline

还有 format 指定格式

$ git log --pretty=format:"%h - %an, %ar : %s"
    ca82a6d - Scott Chacon, 11 months ago : changed the version number
    085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
    a11bef0 - Scott Chacon, 11 months ago : first commit
#选项 说明
#    %H 提交对象(commit)的完整哈希字串
#    %h 提交对象的简短哈希字串
#    %T 树对象(tree)的完整哈希字串
#    %t 树对象的简短哈希字串
#    %P 父对象(parent)的完整哈希字串
#    %p 父对象的简短哈希字串
#    %an 作者(author)的名字
#    %ae 作者的电子邮件地址
#    %ad 作者修订日期(可以用 -date= 选项定制格式)
#    %ar 作者修订日期,按多久以前的方式显示
#    %cn 提交者(committer)的名字
#    %ce 提交者的电子邮件地址
#    %cd 提交日期
#    %cr 提交日期,按多久以前的方式显示
#    %s 提交说明

用 oneline 或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。

限制输出长度

#选项 说明
#    -(n) 仅显示最近的 n 条提交
#    --since, --after 仅显示指定时间之后的提交。
#    --until, --before 仅显示指定时间之前的提交。
#    --author 仅显示指定作者相关的提交。
#    --committer 仅显示指定提交者相关的提交。

实际例子

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
    --before="2008-11-01" --no-merges -- t/
    5610e3b - Fix testcase failure when extended attribute
    acd3b9e - Enhance hold_lock_file_for_{update,append}()
    f563754 - demonstrate breakage of detached checkout wi
    d1a43f2 - reset --hard/read-tree --reset -u: remove un
    51a94af - Fix "checkout --track -b newbranch" on detac
    b0ad11e - pull: allow "git pull origin $something:$cur
#如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试脚本(位于项目的 t/ 目录下的文件)

撤销

撤销上一次的提交

$git commit --amend

撤销某一文件的暂存

$git reset HEAD <file>

撤销对文件的修改

$git checkout -- <file>

远程仓库

git remote

可以查看当前的仓库,加上 -v 显示详细(verbose)信息,还可以使用 git remote show [remote-name] 查看详细信息。

git remote add [shortname] [url]

shortname 可以定义不同的名字(可以使用 git remote rename name_1 name_2 修改名字),随后使用 git fetch shortname 拉取数据。删除操作使用 git remote rm name

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

注意若别人已经有提交了,需要先更新本地的仓库再提交。

标签

列出标签

运行 git tag 可以加上 -l ... 以特定的模式搜索,例如 git tag -l 'v1.4.2.*'

新建标签

共有两种标签,一种轻量(lightweight)标签,实际是指向分支,一种是含附注(annotated)的标签,有自身的校验和信息,允许用 GPG 签署和验证。

对于 annotated,使用 git tag -a ... -m ...,第一个 ... 填入标签名,第二哥 ... 填入标签说明。将 -a 换成 -s 以签署自己的私钥(使用 git tag -[taga-name] 以验证私钥,如果有公钥存放在 keyring 的话)。在后面还可以加上某一次提交的 SHA-1 码来给历史的提交增加标签。

对于 lightweight,直接运行 git tag ... 即可。

小技巧

如果安装了自动补全,则可以按两次 <tab> 以显示匹配的可用命令建议。

可以使用 git config 定义别名,例如 git config --global alias.br branch git config --global alias.unstage 'reset HEAD --'。若在最后的内容中加上前缀 !,则可以启动外部程序而非 git 子程序。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇