第 1 章:起步
1.1 初次运行 Git 前的配置
-
/etc/gitconfig 文件:
系统中对所有用户都普遍适用的配置。使用
--system
选项读写。 -
~/.gitconfig 文件:
用户目录下的配置文件只适用于该用户。使用
--global
选项读写。在 Windows 下路径为:C:\Documents and Settings\$USER\.gitconfig。
-
.git/config 文件:
这里的配置仅仅针对当前项目有效。
配置用户信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
配置文本编辑器
$ git config --global core.editor code
配置差异分析工具
$ git config --global merge.tool code
查看配置信息
$ git config --list
1.2 获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
第2章 Git 基础
2.1 获取项目的 Git 仓库
在工作目录初始化新仓库
$ git init
从现有仓库克隆
$ git clone https://github.com/schacon/grit.git
2.2 记录每次更新到仓库
文件状态的变化周期
image检查当前文件状态
$ git status
跟踪新文件或暂存已修改文件
$ git add [file or folder path]
忽略某些文件
.gitignore 文件的格式规范:
- 空行和注释(#)被 Git 忽略
- 可以使用标准的 glob 模式匹配
- 匹配模式最后跟 / 说明要忽略的是目录
- 要忽略指定模式模式意外的文件或目录,可以在模式前加上 !取反。
.gitignore 文件例子:
# 忽略以 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略根目录下的 TODO 文件,但不包括子目录下的 TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
查看已暂存和未暂存的更新
$ git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:
$ git diff --cached
$ git diff --staged # 效果一样,但更好记。
提交更新
$ git commit -m "Fix benchmarks for speed"
跳过使用暂存区域
在提交的时候,添加 -a
选项,则可以跳过使用暂存区,直接提交。
$ git commit -a -m "Fix benchmarks for speed"
# 相当于(只对修改过的文件有效)。
$ git add .; git commit -m "Fix benchmarks for speed"
删除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(从暂存区域移除),然后提交。
$ git rm hello.txt
移动文件
$ git mv old-filepath new-filepath
2.3 查看提交历史
$ git log
默认不用任何参数的话,git log
会按提交时间列出所有的更新,最近的更新排在最上面。
git log
的一些选项:
-
-p
展示每次提交内容的差异
-
-2
仅显示最近两次的提交
-
--stat
显示监要的增改函数的统计
-
--pretty=oneline
将每个提交放在一行显示(完整哈希)
-
--pretty=format:"%h - %an, %ar : %s"
以格式化的方式显示提交信息
-
--graph
以图的方式显示
-
--oneline
将每个提交放在一行显示(简短哈希)
限制记录范围
使用一下一些选项,可以限制记录的范围:
-
--since, --after
仅显示指定时间之后的提交
-
--until, --before
仅显示指定时间之前的提交
-
--author
仅显示指定作者的提交
-
--committer
仅显示指定提交者的提交
-
--grep
仅显示包含选项关键字的提交
$ git log --since=2.weeks
$ git log --pretty="%h - %s" --author=gister --since="2008-01-15" --before="2008-11-01"
2.4 撤销操作
修改最后一次提交
有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend
选项重新提交:
$ git commit -amend -m "message"
取消已经暂存的文件
$ git reset HEAD <file>...
取消对文件的修改
$ git checkout <file>...
2.5 远程仓库的使用
查看当前的远程库
$ git remote -v
$ git remote --verbose
添加远程仓库
$ git remote add [remote-name] [remote-repo-url]
从远程仓库抓取数据
$ git fetch [remote-name]
如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。
$ git fetch origin
推送数据到远程仓库
$ git push [remote-name] [branch-name]
$ git push origin master # 默认就是 origin 和 master
查看远程仓库信息
$ git remote show [remote-name]
远程仓库的删除和重命名
$ git remote remove <remote-name>
$ git remote rename <remote-old-name> <remote-new-name>
2.6 打标签
列显已有的标签
$ git tag
新建标签
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。
轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。
含附注的标签(使用 -a)
$ git tag -a v1.4 -m "version 1.4"
轻量级标签
$ git tag v1.4-lightweight # 不用 -a 即创建轻量级的标签
后期加注标签(从以前的提交创建标签)
git tag -a v1.2 9fceb02
可以使用 git show
命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
$ git show v1.4
分享标签
默认情况下,git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。
$ git push origin v1.4 # 将 v1.4 推送到远程
$ git push origin --tags # 将所有的新增的标签推送到远程
第 3 章 Git 分支
3.1 何谓分支
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针,它是一个指向你正在工作中的本地分支的指针。
image3.2 分支的新建与合并
新建分支
# 新建分支
$ git branch <branch>
# 切换到分支
$ git checkout <branch>
# 新建并切换到分支
$ git checkout -b <branch>
删除分支
$ git branch -d <branch>
合并分支
$ git merge <branch>
3.3 分支的管理
显示前所有分支的清单
$ git branch
$ git branch -v # 查看最后一个提交对象的信息
显示已合并或未合并的分支
$ git branch --merged
$ git branch --no-merged
3.5 远程分支
拉取远程数据
$ git fetch [remote-name]
推送本地分支
$ git push [remote-name] [branch-name]
跟踪远程分支
跟踪分支是一种和某个远程分支有直接联系的本地分支。
# 创建跟踪分支
$ git checkout -b [branch-name] [remote-name]/[branch-name]
$ git checkout --track [remote-name]/[branch-name]
删除远程分支
推送时分支名前面加冒号,可以删除远程分支。
$ git push [remote-name]:[branch-name]
3.6 rebase
rebase
命令,可以把在一个分支里提交的改变移到另一个分支里重放一遍。
$ git rebase <branch-name>
image
rebase 的风险
一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
网友评论