Git
# 1 git原理
# 1.1 snapshot
直接将发生变更的文件记录一个快照
# 1.2 可撤销s
几乎所有提交快照的操作都是可撤销的
# 1.3 本地操作
大多数的操作可以本地进行
# 2 git clone和git push
# 2.1 git clone
git clone + SSH协议(+你想定义的下载文件夹名字)
# 2.2 git push
在push之前一定要先git pull使本地文件夹与远程仓库同步
# 3 Git文件四大状态
# 3.1 untrack 未记录
- 新创建的没有记录名称的文件
- 用
git add
来记录,使文件变为staged状态
# 3.2 modified 修改过
- 已经记录单最近发生了修改的文件
- 用
git add
来记录,使文件变为staged状态 - 用
git restore
来取消文件登记信息,使文件变为untrack状态
# 3.3 staged 暂存
- 文件在git系统中记录的是最新状态
- 用
git commit
来提交,是文件变为committed状态
# 3.4 committed 已提交
- 文件提交到本地git仓库中
- 用
git push
将文件推送至远程仓库中
# 3.5 总结
git status
查看文件状态
# 4 gitignore
# 4.1 作用
使用git add .
的时候避开一些不上传的文件
# 4.2 使用方法
- 在git目录下创建一个.gitignore文件
- 参考gitignore文件模板 (opens new window),修改成为自己的文件
# 4.3 gitignore文件语法
# 4.3.1 #表示注释
# 4.3.2 /忽略整个文件夹
scr/build/
忽略了整个scr/build的内容
# 4.3.3 !表示取反
!main.go
保留main.go文件,与上一条搭配使用
# 4.3.4 glob模式匹配
- *表示一切字符串,
*.txt
表示过滤一切txt文件 - [] 表示方括号中任何一个字符,
[0-9]
表示匹配0-9中任意一个数字 - ?表示匹配任何一个字符
# 5 git diff
查看当前工作区与暂存区的差别
# 5.1 git diff + 文件路径
加上文件名,查看一下某一个文件具体的改动
# 5.2 git diff --cached
查看暂存区和本地git仓库的差别
# 5.3 其他不常用用法
git diff <commitid>
比较工作区和某一个提交的差别git diff <commitid> <filepath>
比较工作区和某一个提交某一个文件的差别git diff --cached <commitid>
比较暂存区和某一个提交的差别git diff --cached <commitid> <filepath>
比较暂存区和某一个提交某一个文件的差别
# 6 git log
查看之前的提交记录
- commit id git log后commit后面跟着的一长串 git对commit id有自动补全功能,赋值前几位就可以了
- 提交信息 每次commit -m之后后面输入的字符串,是比较关键的提示信息
# 6.1 git log -p
展示出每一个commit中的改动,相当于同时做git diff git log -p -n:查最近几条的提交记录及commit改动
# 6.2 git log --start
在查看提交记录的基础上查看每次commit有多少改动量
# 6.3 git log --pretty
pretty支持让我们自己DIY想看到的log展示
官方提供了oneline、short、full、fuller几种模板
可以自己定义,例如定义log日志当中应该包含commitid,提交时间,作者以及comment。那么定义出一种格式:%h - %ad - %an - %s命令行则为
git log --pretty=format:"%h - %ad - %an - %s"
官方提供了pretty参数表格
# 7 git恢复相关
# 7.1 git中删除文件
git rm
将文件从git以及文件系统当中一起移除(本地仓库、暂存、本地都删)
提交后从下一个提交开始这个文件就不会被存储一份了
留下添加文件和删除文件两条记录
# 7.2 git中删除记录
git commit --amend
在删除文件后使用该指令在当前commit上修补而不是提交新的commit,这样就不会留下记录了
- 如果记录已经push到远程,使用该指令会导致和远程记录不吻合,需要使用
git push -f
强行push,但这会覆盖远程commit,可能会导致其他人代码紊乱
# 7.3 删除暂存区文件
git rm --cached
尚未commit的文件仅删除暂存区,保留本地文件
# 7.4 回滚commit版本
git reset --soft HEAD^
所有文件状态返回某一个commit的版本
# 7.5 回滚文件版本
git checkout -- filename
将文件恢复到之前提交的状态(本地和暂存都是)
# 8 git分支(branch)
# 8.1 git结构
在git当中我们使用的分支其实是一个一个在commit当中切换的指针
例子:
# 8.2 创建分支
git branch XXX
git checkout -b XXX
# 8.3 HEAD指针
指向当前代码仓库的位置
可以移动到任意结点上
移动HEAD指针
git checkout (commit id/分支名)
# 8.4 分支合并
git checkout master
git merge test
将test合并到master上
# 8.4.1 快速合并(fast-forward)
test分支是从master分支当中切出去的,后来master分支就再也没有进行过改动 合并的时候,其实只需要移动master指针到test分支上即可
# 8.4.2 创建新commit
test分支是从master分支当中切出去后来master分支有改动
由于不是直接上下游关系了,所以git创建了一个新的commit用来合并两个分支的代码
合并之后应该删除没用的分支
git branch -d test
# 8.5 合并分支冲突
# 8.5.1 查看冲突
git diff
# 8.5.2 手动解决
把提示行去掉 留下想要的代码,重新add、commit
# 8.5.3 放弃合并
git merge --abort
# 8.5.4 git合并工具
git merge tool 不好用,一般不用
# 8.5.5 IDE工具
# 9 远程分支
# 9.1 origin指针
和master指针性质一样,代表远程远程仓库
# 9.2 操作命令
# 9.2.1 代码拉取
git fetch
:将远程改动同步到本地(针对远程的所有改动),如果有多个远程的话要指定远程名称
git pull
只针对当前分支对应的远程分支,而且多了一步merge合并操作
# 9.2.2 代码推送
本地的分支是不会自动和远程同步的
git push origin test
git branch --set-upstream-to master origin/master
:将本地分支和远程建立映射
映射之后就可以直接使用git push
# 10 git rebase
# 10.1 rebase简介
提取我们在A分支上的改动,然后应用在B分支的代码上
git checkout bugFix
git rebase master
git checkout master
git merge bugFix
2
3
4
# 10.1.1 onto参数
确定rebase的范围
git rebase --onto master feature bugFix
git执行这条命令的时候会先找到feature和bugFix的共同祖先,然后将共同祖先之后的部分rebase到master
# 10.2 实践网站
# 10.3 使用禁忌
如果还有其他分支依赖了当前分支,我们这时候不可以使用rebase
# 11 git show
查看代码层面的改动
# 11.1 查看某个commit下的改动
git show commit_id
commit id的查找
git log --stat
列举每个commit具体到文件级别的改动
git log --pretty=online
将git提交记录压缩成一行
# 11.2 查看分支下的改动
git show test
查看test分支下最后一个提交节点的改动
git show test^
查看test分支下最后一个节点的父节点改动
git show test~3
查看test分支下最后一个节点的前第三个父节点
# 12 git reflog
reflog = reference log
查看引用日志
第一列表示commit id;第二列表示分支;第三列表示相对位置,相对于现在HEAD指针的位置;最后一列记录HEAD指针移动情况
可以通过这个方式查找git log无法查找在现在HEAD指针之后提交过的commit id,然后checkout指针恢复
# 13 区间选择
# 13.1 双点
git log master..experiment
筛选出在experiment当中但是不在master当中的提交
# 13.1.1 常用
git log origin/master..HEAD
比较的是当前节点以及远程push的分支之间的差别
# 13.2 三点
git log master...experiment
展示这两个分支各自独有的提交
git log --left-right master...experiment
用箭头表明这些提交分别被哪个分支独有
# 13.3 多点
git log A B ^C
git log A B --not C
查看在A或和B当中,但是不在C当中的提交
# 14 交互式工具
git add -i
会出现八个选项:
- status
- update
- revert
- add
- patch
- diff
- quit
- help
# 14.1 交互式暂存
- 在
git add -i
后选择4(add) - 选择代表需要添加文件的序号
- 选择过后该序号前会出现*
- 敲击回车会返回上层菜单
- 选择7退出后git状态会随之改变
# 14.2 查看改动
- 在
git add- i
后选择6(diff) - 选择代表要看改动文件的序号
- 等效于
git diff --cached
# 14.3 取消暂存
- 在
git add -i
后选择3(revert) - 选择代表向撤销暂存文件的序号
# 14.4 暂存补丁
可以通过这个功能把文件一部分添加进git,另一部分改动先保留在本地
- 在
git add -i
后选择5(patch) - 选择代表需要补丁暂存文件的序号
- git会把改动一个部分一个部分地询问
- 输入y则表示加入git暂存;n表示不加入
# 15 stash储藏
将改动的内容储藏起来避免checkout的时候出现问题被覆盖,也避免其被commit并push
# 15.1 储藏
git stash
把我们本地所有没有commit的内容都暂存了起来,这样方便我们进行checkout或者是其他一些操作,而不会起冲突或者是其他的影响git stash --keep-index
只暂存没有add到暂存区的内容git stash -u
stash的时候将新创建并且还没有被git管理的文件也一并储藏起来
# 15.2 还原
git stash apply
记录仍将保留 可以选择应用的记录git stash apply stash@{2}
git stash pop
应用后记录会被删除 只能还原栈顶的记录git stash apply --index
暂存文件的复原
# 16 查找
# 16.1 代码函数搜索
- 展示函数出现过的位置
git grep 函数名
- 展示函数出现过的具体位置
git grep -n 函数名
可以显示函数出现位置的行数 - 查找某一个版本的代码
git grep 函数名 git commit/tag号码
可以避免使用IDE工具checkout的步骤
# 16.2 日志搜索
git log -L :函数名:文件名
可以查找文件名下该函数的变更,会展示出代码变更时间、对应的具体代码和修改人