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