导图社区 精通 Git 第二版(Pro Git )第二章 Git 基础
2.1 获取 GIt 仓库 2.2 在 Git 仓库中记录变更 2.3 查看提交历史 2.4 撤销操作 2.5 远程仓库的使用 2.6 标记 2.7 Git 别名 2.8 小结
编辑于2019-09-15 08:51:25科目三:广东省广州市天河区华观路考场考试笔记,本人考试满分通过写此笔记以供后人学习参考。笔记内容仅供学习参考,不可满目照搬因此造成的后果本人概不负责,考生因以实际考试要求为准。
2.1 获取 GIt 仓库 2.2 在 Git 仓库中记录变更 2.3 查看提交历史 2.4 撤销操作 2.5 远程仓库的使用 2.6 标记 2.7 Git 别名 2.8 小结
Git 仅用了几年时间就一跃成为了几乎一统商业及开源领域的版本控制系统。本思维导图全面介绍Git 进行版本管理的基础和进阶知识。全书共10 章,内容由浅入深,展现了普通程序员和项目经理如何有效利用Git提高工作效率,掌握分支概念,灵活地将Git 用于服务器和分布式工作流,如何将开发项目迁移到Git,以及如何高效利用GitHub。
社区模板帮助中心,点此进入>>
科目三:广东省广州市天河区华观路考场考试笔记,本人考试满分通过写此笔记以供后人学习参考。笔记内容仅供学习参考,不可满目照搬因此造成的后果本人概不负责,考生因以实际考试要求为准。
2.1 获取 GIt 仓库 2.2 在 Git 仓库中记录变更 2.3 查看提交历史 2.4 撤销操作 2.5 远程仓库的使用 2.6 标记 2.7 Git 别名 2.8 小结
Git 仅用了几年时间就一跃成为了几乎一统商业及开源领域的版本控制系统。本思维导图全面介绍Git 进行版本管理的基础和进阶知识。全书共10 章,内容由浅入深,展现了普通程序员和项目经理如何有效利用Git提高工作效率,掌握分支概念,灵活地将Git 用于服务器和分布式工作流,如何将开发项目迁移到Git,以及如何高效利用GitHub。
精通 Git 第二版(Pro Git )第二章 Git 基础
获取 Git 仓库
1. 把现有项目或者目录导入到 Git 中
git init
初始化 Git 仓库
会创建 .git 目录
该目录包括了构成 Git 仓库骨架的所有必须文件
但此时 Git 尚未跟踪项目中任何文件
git add *.c git add LICENSE git commint -m "init"
对现有文件(非空目录)进行版本控制
对需要跟踪的文件执行几次 git add 命令
然后输入 git commint 命令即可
2. 从服务器上克隆现有的 Git 仓库
git clone <URL>
是 “clone(克隆)” 而不是 “checkout(检出)”
clone 是对服务器仓库几乎所有的数据进行完整复制,而不是复制当前工作目录
HTTPS: git clone https://github.com/git/git.git SSH: git clone ssh://git@github.com/git/git.git SCP: git clone git@github.com:git/git.git
创建 git 目录并初始化里面的 .git 目录,然后将远程仓库所有数据克隆到本地,并检出所克隆的分支的最新状态。
HTTPS: git clone https://github.com/git/git.git mygit SSH: git clone ssh://git@github.com/git/git.git mygit SCP: git clone git@github.com:git/git.git mygit
创建 mygit 目录并初始化里面的 .git 目录,然后将远程仓库所有数据克隆到本地,并检出所克隆的分支的最新状态。
在 Git 仓库中记录变更
文件状态
已跟踪 (tracked)
未修改
已修改
已暂存
未跟踪 (untracked)
除去已跟踪的文件之外的所有文件
不在之前的快照中
不在暂存区中
文件状态的生命周期
未跟踪
未修改
已修改
已暂存
查看文件状态
git status
查看文件所处状态
Untracked files
未跟踪文件
列出的文件就是未跟踪的文件
Changes to be committed
等待提交的更改
列出的文件就是已暂存的文件
Changes not staged for committ
已更改但未添加到暂存区
列出的文件就是已修改未暂存的文件
想要暂存这些文件,需要使用 git add 不仅可以用来跟踪新文件,而且还可以用来暂存文件
显示所处分支
On branch master
master 分支
On branch dev
dev 分支
git status -s git status --short
显示简短状态
??
未跟踪文件标记
A
已暂存标记
M
已修改标记
MM
已修改并暂存,之后又被修改
跟踪新文件
git add README git add * git add src/* git add *.c
git add 添加需要跟踪的文件
支持明确文件
支持通配符
支持目录
支持文件类型筛选
暂存已修改的文件
git add 还可以把存在合并冲突的文件标记为已解决。
如果在执行了 git add 命令之后又对添加到暂存区的文件做了修改,就需要再执行一次 git add 将文件的最新版本添加到暂存区。
把 git add 看成 “添加内容到下一次提交中”而不是“把这个文件加入到项目中”会更容易理解这个命令
忽略文件
.gitignore
最好在开始工作前配置好 .gitignore 文件,这样就不会将不必要的文件提交进 Git 仓库
不希望 Git 自动添加
不想某些文件显示在未跟踪文件列表下
日志文件
自动生成文件
缓存文件
构建系统创建文件
匹配模式规则
空行或者以 # 开头的行会被忽略
支持标准的 glob(全局) 模式
类似 Shell 中的简化版正则表达式
星号(*)匹配零个或多个字符
还可以使用两个星号(*)匹配嵌套目录。 如:a/**/z,能够匹配:a/z,a/b/z 和 a/b/c/z 等
[acoh] 匹配方括号内的任意单个字符
在方括号内使用短划线分割两个字符(如:[0-9]),能够匹配在这两个字符范围的任何单个字符(及 0-9 中任何数字)
问号(?)匹配任意单个字符
以斜杆(/)开头的模式可用于禁止递归匹配
以斜杆(/)结尾的模式表示目录
以感叹号(!)开始的模式表示取反
$ cat .gitignore $ *.[oa] $ *~ $ !lib.a $ /TODO $ build/ $ doc/8.txt $ doc/**/*.pdf
忽略 .o 或 .a 结尾的文件
忽略所有以波浪号(~)结尾的文件
仍然跟踪 lib.a 即使上一行指令要忽略 .a 类型的文件
只忽略当前目录的 TODO 文件,而不忽略子目录下的 TODO
忽略 build 目录下的所有文件
忽略 doc/*.txt 文件而不忽略 doc/test/*.txt 文件
忽略 doc/ 目录下的所有 .pdf 文件
查看已暂存和未暂存的变更
git diff
输出的是补丁(patch)
那些变更还没有被暂存
那些已暂存的变更正待提交
git diff 并不会显示出自上一次提交以来的所有变更,自会显示出还没进入暂存区的变更,
如果你把所有变更提交到暂存区,git diff 不会有任何输出。
git diff --staged git diff --cached
将暂存的更改和上一次提交的内容相比较
外部工具中的 git diff
设置图形化或外部的 diff 查看程序
git difftool
emerge
vimdiff
其他商业软件(如:BC4 )等
git difftool --tool-help
查看系统中可用的 diff 工具
提交变更
git commint
所有未暂存的变更都不会进入到提交的内容中(包括编辑后没有执行 git add 命令添加到暂存区的新建或修改过的文件)
执行这条命令后就会打开你所选择的文本编辑器
默认会采用 shell 环境变量中的 $EDITOR 所指定的文本编辑器,一般是 Vim 或 Emacs。 可以使用 git config --global core.editor 命令配置 Git 使用的默认文本编辑器
默认提交信息会包括被注释掉的 git status 命令的最新输出结果
可以删掉这些注释信息并输入自己的提交信息,注释信息可以保留能帮助记住这次提交的内容。
想要记录详细信息可以使用 git commint -v 。在文本编辑器中显示这次提交的差异。
推出编辑器时,Git 会移除注释内容和差异对比,把剩下的提交信息记录到所创建的提交中。
完成这一过程还可以用 git commint -m "提交信息"
每次提交都记录了项目的快照,并于以后的对比和恢复
git commint -m "Add XXX file" git commint -m "创建 XXX 文件"
git commint -m "Update XXX file" git commint -m "更新 XXX 文件"
git commint -m "Fix XXX file" git commint -m "修复 XXX 文件"
...
提交后输出信息
提交到那个分支(master 、 dev 、future )
提交的 SHA-1 校验和时多少
改动了多少个文件以及源文件新增和删除多少行的统计信息
跳过暂存区
git commint -a
跳过暂存区直接提交
Git 自动把已跟踪的所有文件添加到暂存区然后再提交
提交前并不需要再执行 git add 来添加文件
git commint -am "提交内容"
Git 自动把已跟踪的所有文件添加到暂存区并提交
git commint -am "Add XXX file" git commint -am "创建 XXX 文件"
git commint -am "Update XXX file" git commint -am "更新 XXX 文件"
git commint -am "Fix XXX file" git commint -am "修复 XXX 文件"
...
移除文件
git rm file
从 Git 中移除某个文件,需要先从已跟踪的文件列表中移除(从暂存区中移除)然后再提交
该命令还会把文件从工作目录中移除,未跟踪文件列表中也看不到这些文件
rm file
如果只是简单的把文件从工作目录移除,而没有使用 git rm,再执行 git status 时会看到文件出现在 " Changes not staged for commint" 区域(未暂存区域)
在执行 git rm file,Git 才会把文件的移除状态记录到暂存区
下次提交时这个文件就不存在,也不会再被 Git 跟踪管理
git rm -f file
-f 强制移除
如果更改某个文件,并已经加入到索引当中(已暂存),必须使用 -f 强制移除
为了防止没有被记录到快照当中的数据被意外移除而设立的安全特性
因为这样的数据被意外的移除后无法由 Git 恢复
git rm --cached file
从暂存区移除并保留在工作目录中
如果忘了在 .gitignore 中未添加相应的忽略规则,把一些日志或编译生成的文件 *.a 加入到 Git 中,上述方法尤其有用
glob 模式
反斜杠(\)是必须要有的,在此处是转义,应为 shell 和 Git 要处理文件名扩展
git rm log/\*.log
移除 log 目录下的 log 文件
git rm \*~
移除所有的 ~ 结尾的文件
git rm \*.a
移除所有 .a 结尾的文件
移动文件
重命名文件
git mv 旧文件 新文件
Git 与很多版本控制系统不同,它并不会显示跟踪文件的移动。如果再 Git 中重命名了文件,仓库的元数据不会记录这次重命名操作。
git mv README README.md
相当于执行了三条命令
mv README README.md
git rm README
git add README.md
你可以用喜欢的工具或方法来重命名文件,然后在提交之前再执行 Git 的 add 和 mv 命令
查看提交历史
git log
列出它的 SHA-1 校验和、作者的姓名和邮箱、提交日期以及提交的信息
默认不加参数的情况下,会按照时间顺序列出仓库中的所有提交,其中最新的提交排在最前面。
常用选项
-p
按补丁格式显示每个提交引入的更改
git log -p -2
最有用的选项 -p,列出每次提交所引入的差异
-2 参数,只列出最近两次的提交
--stat
显示每个提交中被更改的文件的统计信息
git log --stat
--stat 选项,查看每个提交的简要统计信息。
所列出的内容
改动的文件列表
共有多少文件被改动
文件里有多少新增和删除行
输出统计信息
--shortstat
只显示上述 --stat 输出中包含 “已更改/新增/删除” 行的统计信息
--name-only
在每个提交信息后显示被更改的文件列表
--name-status
在一个选项输出基础上还显示出 “已更改/新增/删除” 行的统计信息
--abbrev-commint
只显示完整的 SHA-1 40位校验和字符串中的前几个字符
--relative-date
显示相对日期 (例如:两周前,前天,昨天),而不是完整日期
--graph
在提交历史旁边显示 ASCII 图表,用于展示分支和合并的历史信息
--pretty
用一种可选格式显示提交。选项有 oneline、short、full、fuller 和 format
git log --pretty=oneline
--pretty 选项,改变日志输出的默认格式
Git 默认格式
oneline
适用浏览大量提交
每一行显示一个提交
short
full
fuller
自定义格式
format 选项
git log --pretty=format:"%h - %an,%ar : %s"
%H
提交对象的散列值(SHA-1 校验和)
%h
提交对象的简短散列值
%T
树对象的散列值
%t
树对象的简短散列值
%P
父对象的散列值
%p
父对象的简短散列值
%an
作者的名字
最初开展工作的人
%ae
作者的电子邮箱
%ad
创作日期
-date= 选项指定日期格式
%ar
相对于当前日期的创作日期
%cn
提交者的名字
最后将工作成果提交的人
%ce
提交者的电子邮箱
%cd
提交日期
%cr
相对于当前日期的提交日期
%s
提交信息的主题
git log --pretty=format:"%h %s" --graph
--graph 选项,会使用 ASCII 字符形式的简单图像表来显示 Git 分支和合并历史
输出范围选项
-(n)
只显示最新的 n 次提交
因为默认情况下 Git 所有输出会通过管道机制输入给分页程序(pager)使得一次只显示一页内容
n 任意整数
--since,--after
只输出指定日期之后的提交
git log --since=2.weeks git log --after=2.weeks
列出最近两周的所有提交
具体日期,如:"2008-12-24"
相对时间,如:"2 years 1 day 3 minutes ago"
--until,--before
只输出指定日期之前的提交
--author
只输出作者与指定字符串匹配的提交
--grep
只输出提交信息包含指定字符串的提交
如果同时指定 author 和 grep 选项,则需要添加 --all-match 参数,否则 Git 会列出所有符合任何单一条件的提交。
--commintter
只输出提交者与指定字符串的提交
-S
只输出包含 “添加或删除指定字符串” 的更改的提交
git log -S 函数名
方便查找特定函数引用的最近一次提交
--
将路径和其他选项分隔开
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t
查看 Git 项目历史中查看作者在 2008 年 10 月发起的那些提交更改了源代码的测试文件且没有合并
撤销操作
git commint --amend
提交之后发现忘了添加某些文件,或者写错了提交信息
这个命令会提交到暂存区的内容。
如果你在上次提交在之后并没有做出任何改动(如:在上次提交后立即执行这个命令),那么你提交的快照不会有变化,但你可以改动提交信息。
如:你提交才意识到忘记了某个之前更改过的文件,可以执行类似下面的操作:
git commint -m "第一次提交"
git add 忘记的文件
git commint --amend
最终只是产生一个提交,因为第二个提交命令修正了第一个提交的结果
撤销已暂存的文件
git status
changes to be committed: (use "git reset HEAD <file>..." to unstage)
git reset HEAD readme.md
撤销对文件的修改
git status
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) modidied: CONTRIBUTING.md
git checkout -- CONTRIBUTING.md
git checkout -- <file> 因为上述命令用之前的版本的文件做了覆盖,所以任何对 <file> 文件做出的修改全部丢失。
git status
On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README
远程仓库的使用
远程仓库是指在互联网或其他网络上托管的项目版本仓库。
进行读写操作
协同开发
推送数据/拉取数据
添加远程仓库
删除无效的远程仓库
管理各种远程分支和设置是否跟踪这些分支
显示远程仓库
git remote
git clone *.git
克隆某个仓库后,使用 git remote 可以看到名为 origin 的远程仓库,这是 Git 给克隆源服务器取的默认名称
git remote -v
显示出 Git 仓库的每个远程仓库对应的 URL
git remote -v origin git@github.com:KiCad/kicad-source-mirror.git (fetch) origin git@github.com:KiCad/kicad-source-mirror.git (push)
git remote show [branch-name]
git remote show origin
查看某一远程仓库的更多信息
告诉你在 master 分支上执行 git pull 会获取到所有的远程引用,然后自动合并到 master 分支。
还显示了拉取下来的所有远程引用的信息。
添加远程仓库
git remote add pb https://github.com/paulboone/ticgit
git fetch pb
同步 pb 远程分支内容
git checkout -b local remote
git branch -u remote local
从远程仓库获取和拉取数据
git fetch [remote-name]
会从远程仓库获取所有本地仓库没有的数据
在克隆仓库的时候会克隆命令会自动添加远程仓库的地址并取名为 ”origin“ git clone 会自动设置你的本地 master 分支,使其跟踪被克隆的远程 master 分支(或者其他名称的默认远程分支)
git fetch 会把数据拉去到本地仓库,并不会自动将新增的数据合并到本地分支上,也不会修改当前工作目录下的任何数据
需要手动合并这些新增的数据到本地仓库中
git pull
会自动获取远程数据并合并到本地当前分支中
将数据推送到远程仓库
git push [remote-name] [branch-name]
git push origin master
把本地 master 分支内容推送到远程 origin 分支上
合作开发中,如果别人比你先推送内容到远程分支,你需要先拉取远程分支内容合并后再推送新增的内容到远程分支。
删除和重命名远程分支
git remote rename [old_branch_name] [new_branch_name]
git remote rename pb paul
将 pb/master 远程分支重命名成 paul/master 远程分支
git remote rm [branch_name]
git remote rm paul
删除 paul 远程仓库
标记
列出标签
git tag
会按字母顺序列出所有的标签。
列出的顺序先后和标签的重要性无关
git tag -l "v1.8.5"
查看 Git 源代码的 1.8.5 系列的标记版本
创建标签
轻量(lightweight)标签
像一个不变的分支--它只是一个指向某次提交的指针。
git tag v1.4-lw
创建轻量标签的时候不需要使用 -a ,-s或 -m 选项
git show v1.4-lw
注释(annotated)标签
会作为完整的对象储存在 Git 仓库中
Git 会计算其校验和,还包含其他信息:标记作者的名字,邮箱地址,标签创建的时间,标记消息(tagging message),还可以用 GPG(GNU Privacy Guard)对他们进行签名和验证
git tag -a [版本号] -m "标记消息"
git tag -a v1.4 -m ”这是 v1.4 版本"
-m 选项制定了标记消息,它会伴随标签一起被储存
如果你没有为注释标签指定标记消息, Git 会打开文本编辑器以便你进行输入。
一般推荐创建注释标签,这样可以包含详细的信息。如果你需要只是一个临时标签,或者由于某些原因不需要包含额外的信息,那可以使用轻量标签。
补加标签
git tag -a v0.0.1 [SHA 值]
git log --pretty=oneline
以一行的显示一条提交记录的方式查看提交日志
9308a129251062bb1f9abaf765be72a5a3cce4ed (HEAD -> master, origin/master) Fix e5feaa20466b825f135e6382ac3df81ae25857a3 Fix 82b06db5898710aa2be6278681b484c6b599da34 !3 *-cache.lib 不可以忽略 * *-cache.lib 不可以忽略 e5d135f954444ca70ded6b768445c12fe411f285 修正 PRTR5V0U2X SOT-143 封装 9aa2ade7bca012ad994de3479e12f335a24efe20 - 新增 ACM2012-900-2P 电感封装 - 校正 PRTR5V0U2X 封装,如果使用自带封装请使 用 X 轴镜像。 123b7e0e11a86246ece65f8f618cab045c32cfc8 暂缺共模电感封装(0805) b7ea4724504aa959366e7005145108c0e4795b09 完善原理图网络连接 0df41d148105cc7c39384650c4cd4ae249c66500 (temp) !1 更新忽略列表和删除缓存文件 Merge pull request !1 from F4NNIU/maste r 4421ae4d110338271f333a4fd12a249b27a79663 更新 git 忽略列表 82b852f3be80e1d70e9fc3397d55b553c8e54391 删除lib 缓存文件和 bak 文件 37e8f674de74ae2123012834ecc5d959ec52e1d8 DAPLink_STM32
git tag -a v0.0.1 82b06db5898710aa2be6278681b484c6b599da34
共享标签
git push origin [标签名字]
推送单个标签到服务器上
git push origin v0.0.1
git push origin --tags
把所有服务器上还没有标记的都推送过去
检出标签
git checkout -b [分支名字] [标签名字]
因为标签无法移动,所以才需要在特定标签上创建一个分支。
git checkout -b master v0.0.1
Git 别名
如果输入的 Git 命令不完整,Git 不会自动推断并补全命令
可以通过 git config 设置每个 Git 命令的别名
git config --global alisa.co checkout
git config --global alisa.br branch
git config --global alisa.ci commit
git config --global alisa.st status
把文件从暂存区移出的命令不好用,可以取个别名
git config --global alisa.unstage 'reset HEAD --'
git unstage 文件1
git reset HEAD --文件1
添加一个显示最后一次提交信息的命令
git config --global alisa.last 'log -1 HEAD'
git last
有时候想执行 Git 外部的命令或者自己编写的 Git 仓库的管理工具
在外部命令前加上 '!' 字符
git config --global alisa.visual '!gisk'
第二章小结
创建或克隆仓库
做出更改
暂存并提交变更
查看仓库的变更历史