Pro Git中文版
2022-12-04 21:35:12 0 举报
AI智能生成
Pro Git中文版思维导图笔记
作者其他创作
大纲/内容
起步
获取 Git 仓库
记录每次更新到仓库
查看提交历史
撤消操作
git remote -v
查看远程仓库
git remote add <shortname> <url>
添加远程仓库
git fetch origin
git fetch [remote-name]
从远程仓库中抓取与拉取
git push origin master
git push [remote-name] [branch-name]
推送到远程仓库
git remote show origin
git remote show [remote-name]
那些过去引用 pb/master 的现在会引用 paul/master
git remote rename pb paul
git remote rename
git remote rm paul
git remote rm
远程仓库的移除与重命名
远程仓库的使用
git tag
git tag -l 'v1.8.5*'
模糊匹配
列出标签
一个轻量标签很像一个不会改变的分支
轻量标签(lightweight)
存储在 Git 数据库中的一个完整对象
附注标签(annotated)
创建标签
git tag -a v1.4 -m 'my version 1.4'
-m 选项指定了一条将会存储在标签中的信息
附注标签
git tag v1.4-lw
轻量标签
git tag -a v1.2 9fceb02
后期打标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上
git push origin v1.5
git push origin [tagname]
显式地推送标签到共享服务器
git push origin --tags
一次性推送很多标签
共享标签
git checkout -b version2 v2.0.0
git checkout -b [branchname] [tagname]
特定的标签上创建一个新分支
检出标签
打标签
Git 别名
Git 基础
commit-and-tree.png
提交对象(commit object)
commits-and-parents.png
提交对象及其父对象
branch-and-history.png
“master” 分支
基本概念
git branch [branch-name]
two-branches.png
命令
让Git 知道当前在哪一个分支上
head-to-master.png
HEAD 指针
分支创建
git checkout [branch-name]
这样 HEAD 就指向 testing 分支了
head-to-testing.png
git commit -a -m 'made a change'
HEAD 分支随着提交操作自动向前移动
advance-testing.png
testing分支再提交后
git checkout master
检出时 HEAD 随之移动
checkout-master.png
切换回 master 分支
git commit -a -m 'made other changes'
目的提交历史已经产生了分叉
advance-master.png
master分支再次提交后
Git 创建一个新分支就相当于往一个文件中写入 41 个字节
Other 在创建分支时,将所有的项目文件都复制一遍
Why快速分支
分支切换
分支简介
git branch iss53git checkout iss53
basic-branching-53.png
修复#53 问题
git commit -a -m 'added a new footer [issue 53]'
basic-branching-53-3.png
iss53 分支提交
basic-branching-4.png
紧急问题的分支(hotfix branch)
Git 只是简单的将指针向前移动(fast-forward)
basic-branching-5.png
合并紧急问题到master
basic-branching-6.png
继续在 iss53 分支上的工作
新建分支
一次典型合并中所用到的三个快照
basic-merging-1.png
合并iss53到master
Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它
basic-merging-2.png
一个合并提交
分支的合并
在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改
无法自动合并
遇到冲突时的分支合并
分支的新建与合并
git branch
当前 HEAD 指针所指向的分支
分支前的 * 字符
查看分支列表
git branch -v
查看每一个分支的最后一次提交
git branch --merged
已经合并到当前分支
git branch --no-merged
尚未合并到当前分支的分支
查看合并状态
git branch -d testing
未合并的分支删除失效
git branch -D testing
强制删除
删除分支
分支管理
master/develop/topic
不同的分支对应不同的稳定性
lr-branches-2.png
长期分支
被用来实现单一特性或其相关工作
topic-branches-2.png
短期分支
topic-branches-1.png
特性分支
分支开发工作流
git push (remote) (branch)
推送
从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 “跟踪分支”
git checkout -b [branch] [remotename]/[branch]
跟踪分支
从服务器上抓取本地没有的数据,不修改工作目录中的内容
git fetch
git fetch + git merge
git pull
拉取
git push origin --delete serverfix
删除远程分支
远程分支
basic-rebase-1.png
分叉的提交历史
git checkout experimentgit rebase master
basic-rebase-3.png
将 C4 中的修改变基到 C3 上
git checkout mastergit merge experiment
basic-rebase-4.png
分支的快进合并
基本操作
interesting-rebase-1.png
master/server/client多特性分支
git rebase --onto master server client
interesting-rebase-2.png
将client 的修改变基到 master
git checkout mastergit merge client
interesting-rebase-3.png
合并 master 分支
git rebase master server
interesting-rebase-4.png
将 server 的修改变基到 master 上
git checkout mastergit merge server
interesting-rebase-5.png
快进合并主分支 master
复杂操作
不要对在你的仓库外有副本的分支执行变基
变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交
变基的风险
用变基解决变基
merge
记录实际发生过什么
rebase
项目过程中发生的事
提交历史
变基 vs. 合并
变基
Git 分支
协议
在服务器上搭建 Git
生成 SSH 公钥
配置服务器
Git 守护进程
Smart HTTP
GitWeb
GitLab
第三方托管的选择
服务器上的 Git
单点协作模型
centralized_workflow.png
集中式工作流
每个开发者拥有自己仓库的写权限和其他所有人仓库的读权限
integration-manager.png
集成管理者工作流
多仓库工作流程的变种,超大型项目才会用到
benevolent-dictator.png
司令官与副官工作流
分布式工作流程
向一个项目贡献
维护项目
分布式 Git
账户的创建和配置
对项目做出贡献
管理组织
脚本 GitHub
GitHub
通过 Git 给出的 SHA-1 值来获取一次提交
单个修订版本
提供 SHA-1 的前几个字符(>4)
git show 1c002d
简短的 SHA-1
指明一次提交最直接的方法是有一个指向它的分支引用
分支引用
引用日志记录了最近几个月你的 HEAD 和分支引用所指向的历史
git reflog
引用日志
在引用的尾部加上一个 ^, Git 会将其解析为该引用的上一个提交
例如 d921970^2 代表 “d921970 的第二父提交”
^ 后面添加一个数字
祖先引用
git log master..experiment
experiment 分支中还有哪些提交尚未被合并入 master 分支
git log experiment..master
在 master 分支中而不在 experiment 分支中的提交
double-dot.png
双点
git log refA..refBgit log ^refA refBgit log refB --not refA
在任意引用前加上 ^ 字符或者 --not 来指明你不希望提交被包含其中的分支
哪些提交是被包含在某些分支中的一个,但是不在你当前的分支上
git log refA refB ^refC
查看所有被 refA 或 refB 包含的但是不被 refC 包含的提交
多点
被两个引用中的一个包含但又不被两者同时包含的提交
git log --left-right master...experiment
三点
提交区间
选择修订版本
git add -i
What now> 2
暂存与取消暂存文件
暂存文件的特定部分
暂存补丁
交互式暂存
git status
查看改动的状态
git stash
将新的储藏推送到栈上
git stash list
查看储藏的东西
git stash apply
储藏的工作重新应用
git stash drop
移除储藏
git stash pop
应用储藏并移除
储藏工作
git stash --keep-index
不要储藏任何你通过 git add 命令已暂存的东西
git stash -u
像储藏跟踪文件一样储藏未跟踪文件
git stash --patch
交互式地提示哪些改动想要储藏、哪些改动需要保存在工作目录中
创造性的储藏
git stash branch testchanges
从储藏创建一个分支
git clean
git clean -d -n
-n 选项预演
强制删除任何忽略的文件
-x 选项
以交互模式运行
-i 选项
清理工作目录
储藏与清理
GPG 介绍
签署标签
验证标签
签署提交
每个人必须签署
签署工作
从提交历史或者工作目录中查找一个字符串或者正则表达式
git grep -n gmtime_r
匹配行行号
-n 参数
git grep --count gmtime_r
概述的信息
--count 选项
git grep -p gmtime_r *.c
匹配的行是属于哪一个方法或者函数
-p 选项
git grep --break --heading \\
输出更加容易阅读
--break 和 --heading 选项
Git Grep
git log
git log -S ZLIB_BUF_MAX --oneline
-S 选项
找到 ZLIB_BUF_MAX 常量是什么时候引入的
新增和删除该字符串的提交
git log -L :git_deflate_bound:zlib.c
-L 选项
行日志搜索
Git 日志搜索
搜索
修改提交信息,或者修改你添加、修改和移除的文件的快照
git commit --amend
修改最后一次提交
修改多个提交信息
重新排序提交
压缩提交
拆分提交
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
从每一个提交移除一个文件
git filter-branch --subdirectory-filter trunk HEAD
使一个子目录做为新的根目录
全局修改邮箱地址
核武器级选项:filter-branch
重写历史
HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交
HEAD
索引是你的 预期的下一次提交
Index
你可以把工作目录当做 沙盒
Working Directory
三棵树
只有工作目录有内容
reset-ex1.png
git init
将工作目录中的内容,复制到索引中
reset-ex2.png
git add
首先会移除索引中的内容并将它保存为一个永久的快照,
然后创建一个指向该快照的提交对象,
最后更新 master 来指向本次提交
reset-ex3.png
git commit
Changes not staged for commit
git status 显示
reset-ex4.png
继续编辑文件
Changes to be committed
git status 显示
reset-ex5.png
git add 来将它暂存到索引中
无(三棵树又变得相同了)
reset-ex6.png
git commit 来完成提交
reset-workflow.png
工作流程
reset 做的第一件事是移动 HEAD 的指向
git reset 9e5e64a 将会使 master 指向 9e5e64a
使用 reset --soft,它将仅仅停在那儿
reset-soft.png
第 1 步:移动 HEAD
如果指定 --mixed 选项,reset 将会在这时停止
reset-mixed.png
第 2 步:更新索引(--mixed)【默认】
【危险】会真正地销毁数据,因为它强制覆盖了工作目录中的文件
reset-hard.png
第 3 步:更新工作目录(--hard)
reset-start.png
重置的作用
通过路径来重置
压缩
checkout 对工作目录是安全的,它会通过检查来确保不会将已更改的文件吹走
reset --hard 则会不做检查就全面地替换所有东西
目录安全性
checkout 只会移动 HEAD 自身来指向另一个分支
reset 会移动 HEAD 分支的指向
如何更新 HEAD
reset-checkout.png
git checkout [branch] VS. git reset --hard [branch]
不带路径
带路径
检出
重置揭密
git merge --abort
退出合并
git reset --hard HEAD
回到之前的状态
中断一次合并
git merge -Xignore-space-change whitespace
忽略空白
看看合并引入了什么
git diff --ours
查看合并的结果与他们那边有什么不同
git diff --theirs
查看文件在两边是如何改动的
git diff --base
清理我们为手动合并而创建但不再有用的额外文件
手动文件再合并
git checkout --conflict=diff3 hello.rb
--conflict=merge【默认】
检出冲突
合并日志
组合式差异格式
合并冲突
1.移动 HEAD 指向的分支
2.使索引看起来像 HEAD
3.使工作目录看起来像索引
git reset --hard HEAD~
缺点是它会重写历史
undomerge-reset.png
修复引用
提交将会撤消一个已存在提交的所有修改
undomerge-revert.png
在 git revert -m 1 后的历史
undomerge-revert2.png
git merge topic 含有坏掉合并的历史
undomerge-revert3.png
git revert ^M 在重新合并一个还原合并后的历史
还原提交
undomerge-start.png
撤消合并
当 Git 看到两个分支合并中的冲突时,它会将合并冲突标记添加到你的代码中并标记文件为冲突状态来让你解决
【默认】
git merge -Xours mundo
-Xours
-Xtheirs
希望 Git 简单地选择特定的一边并忽略另外一边
git merge -s ours mundo
当前分支的代码当作合并结果
偏好
子树合并
其他类型的合并
高级合并
Git 记住解决一个块冲突的方法,这样在下一次看到相同冲突时,Git 可以为你自动地解决它
reuse recorded resolution
Rerere
使用 Git 调试
子模块
打包
替换
凭证存储
Git 工具
设置你的名字和邮件地址
配置 Git
Git 属性
Git 钩子
使用强制策略
自定义 Git
Git 与其他系统
底层命令和高层命令
Git 对象
Git 引用
包文件
引用规格
传输协议
维护与数据恢复
环境变量
Git 内部原理
附录 A: 其它环境中的 Git
附录 B: 将 Git 嵌入你的应用
附录 C: Git 命令
Pro Git中文版
0 条评论
回复 删除
下一页