课程地址:https://time.geekbang.org/course/intro/100021601
这篇文章不是课程的全部,仅仅是课程的冰山一角,
而且苏老师对于 git 的使用讲解的很清晰,有需要的可以付费支持。
如果你想白嫖可以简单看我下面的粗陋记录
或者去阮一峰老师的博客,地址是:https://www.liaoxuefeng.com/wiki/896043488029600/
git 基本命令
git 下载
https://git-scm.com/downloads
选择合适的系统下载直接安装即可。
查看版本号
git --version
配置
可通过--list
查看已配置的信息
# local 只对仓库有效
git config --list --local
# global 对登录⽤户所有仓库有效
git config --list --global
# system 对系统的所有⽤户有效,一般不用
git config --list --system
添加配置信息
git config --global user.name "zhangsan"
git config --global user.email "zhangsan2020@163.com"
三者的优先级顺序如下
local > global > system
如何指定不需要Git管理的文件?
当然是添加.gitignore
文件了
忽略特殊文件规则参考阮一峰老师的文章:.gitignore文件规则
Git 修改gitignore后生效
git rm -r --cached . #清除缓存
git add . #重新trace file
git commit -m "update .gitignore" #提交和注释
git push origin master #可选,如果需要同步到remote上的话
创建本地仓库
分为这几个步骤吧:
- 初始化
- 仓库配置
- 添加文件
- 提交文件
- 提交远程
初始化
# git-learning-1 文件夹名称
git init git-learning-1
仓库配置
cd git-learning-1
git config --local user.email "zhangsan2020@163.com"
git config --local user.name "zhangsan"
四个工作区域
Workspace
:工作区
,就是你平时存放项目代码的地方Index / Stage
:暂存区
,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。对应的 git 命令:git add <filename>
Repository
:仓库区(或版本库)
,就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD
指向最新放入仓库的版本。对应的 git 命令:git commit -m 'desc'
Remote
:远程仓库
,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。对应的 git 命令:git push
往本地仓库暂存区添加文件 readme.md 文件
git add readme.md
使用 restore 将暂存区的文件回退
git restore --staged readme.md
查看本地仓库状态
git status
提交到本地仓库
git commit -m "some description"
使用图形化界面
gitk
清屏
clear
给文件重命名
#查看文件权限
ll
#文件重命名
git mv readme.md README.md
git commit -m "[optimized] rename"
删除文件
git rm aa
回退到上一次 commit
将工作区
和暂存区
的删除或者修改的内容回退到上一次commit
的的状态,不影响新增的文件。
git reset --hard
解决每次都需要输入用户名密码问题
如果我们git clone
的代码选择 https://
而不是git@git (ssh)
,
当我们操作git pull/push
的时候,总是提示我们输入账号和密码才能操作成功,
频繁的输入账号和密码会很麻烦。
git config --global credential.helper store
git pull /git push #(第一次输入,后续就不用再次数据)
#或者用 ssh 这种形式推送/拉取代码
git@git (ssh)
日志相关
查看当前分支
#显示当前分支全部 log
git log
#显示当前分支最近4条log
git log -n4
#只显示当前分支 commit 信息
git log -n4 --oneline
#图形化查看当前分支日志
git log --graph
查看其它分支
#查看 master 分支 log
git log --graph --oneline master
查看所有分支
#图形化查看所有分支
git log --all --graph
图形化单行显示所有分支的 commit 信息
git log --all --graph --oneline
分支相关
列出所有本地分支
git branch -v
创建分支并切换到该分支
# 新分支 temp
git checkout -b temp
删除分支
#普通删除
git branch -d 分支名
#强力删除
git branch -D 分支名
commit 相关
修改最新的 commit 描述信息
通过 git commit --amend
命令修改当前的 commit
的 message
信息。
修改老旧的 commit 描述信息
使用 git rebase -i
指定 commit
的父 commit id
,进入一个文件交互框,
然后将 pick
修改为reword/r
,然后保存退出
会再进行一个文件交互框,这个时候修改commit
信息,再保存退出。
把多个连续的 commit 描述信息合并成1个
git rebase -i beab99bb7d
pick
的意思是要会执行这个commit
squash
的意思是这个commit
会被合并到前一个commit
修改完成后,按esc键
,冒号,输入wq
进行保存。
之后会继续跳转到commit message
的编辑界面:
把多个不连续的 commit 描述信息合并成1个
假如是不连续的话,那么你也是拿最早的commit id来执行
git rebase -i commit id
然后进入弹出框,你会看到 pick
中没有最早你要合并的那个 commitid
这里你需要按照列表的格式把最早的 commit id
复制到顶部
格式就是 pick commit id XXX
,这个XXX就表示注释(可有可无)
然后再把你要合并的几个commit
一定复制到当前这个新加的pick
下面,
然后修改成 (s commit id XXXX)
,有几个写几个,把重复的去掉,然后保存即可。
比较差异
比较暂存区和HEAD所含文件的差异
在修改完文件,add
后添加到暂存区,
想比较暂存区与HEAD
区别,可以通过git diff --cached
进行比较
比较工作区和暂存区所含文件的差异
#另外可以通过在后面加上文件名指定显示,否则默认是展示所有文件的不同点
git --no-pager diff
恢复相关
让暂存区恢复成和HEAD的一样
可以通过git restore --staged
指定文件恢复,或者git reset HEAD
让工作区的文件恢复为和暂存区一样
git restore 文件名
取消暂存区部分文件的更改
git restore --staged 文件名
消除最近的几次提交
恢复到某次commit
,
#工作区和暂存区都会变成对应commit文件状态
git reset --hard 51e9dc395
业务相关
开发中临时加塞了紧急任务怎么处理?
通过stash
能够将工作目录中和暂存区的内容暂时保存;
在添加了a和c文件
,并且修改了bb
文件,stash
后不会保存新增的a和c
,
需要通过add a和c
,再stash
才会将其进行保存;
恢复的时候,pop
会删除 stash
历史记录,apply
不会
git stash
git stash list
git pop
不同人修改了不同文件如何处理?
我们在别人修改并且push
之前,已经pull/fetch
到本地后,
别人在修改了一个文件A
,push
到GitHub
此时我们在本地修改文件B,在push的时候会报错。
那么就需要通过使用git fetch
,然后再git merge
,最后git push
。
git pull
其实等于git fetch
和git merge
两个操作,完成本地与远端的同步,如果相同文件
不同人修改了同文件的不同区域如何处理?
git pull
git push
不同人修改了同文件的同一区域如何处理?
git pull
#解决冲突(协商看保留谁的内容)
git add
git commit
git push
同时变更了文件名和文件内容如何处理?
git pull
#解决冲突(协商看保留谁的内容,以及文明名称)
git add
git commit
git push
把同一文件改成了不同的文件名如何处理?
git pull
,本地会出现别人修改后的文件名文件,
git status
根据提示 add
和 rm
文件,最后push
。
远程相关
把本地仓库同步到远程
git remote add github git@github.com:ragpo/git-learning.git
git remote -v
git branch -av
git push github
Tag 相关
显示已有标签
git tag
新建标签
创建一个含附注类型的标签非常简单
用-a
(译注:取 annotated 的首字母)指定标签名字即可
git tag -a tag_name -m 'Some Messages'
删除标签
删除本地标签:
git tag -d tag_name
删除remote标签 :
git push --delete origin tag_name
推送标签到github 将本地所有标签推送到remote:
git push origin --tags
危险操作
禁止向集成分支执行push -f操作
GitHub
和gitlab
提供禁止push -f
的操作配置。
禁止向集成分支执行变更历史的操作
改了之后其他人会很麻烦
.git 文件夹分析
查看HEAD
HEAD
的内容是指向 refs/heads/
,指代当前在哪个分支下面
config
config
文件里面的user字段可以通过命令行来设置,
也可以通过命令来获取,如果修改了文件,命令行也是能读取到的。
refs
refs
里面包含了本repo
所包含的分支(head)和tag,
例如 master 分支的内容,就是某次commit
git cat-file -t a4a63945 是查看这个哈希值所代表的类型。可能包含:commit
git cat-file -p a4a63945 就展示这个哈希值的内容。可能包含:tree、bloc、
object
object 里面包含了对象,分为 tree、commit、blob、tag。
tree 可以理解为一个文件夹,里面包含了blob,
blob 可以理解为是一个具体的文件
tag 类似一个开发阶段成果,基于某次commit。
通过git cat-file -p 哈希值,可以看到内容
commit、tree 和 blob 三个对象之间的关系
commit
: 提交时的镜像
tree
: 文件夹
blob
: 文件
一次commit
就对应着对当前时间仓库内的所有文件做了一次快照;
一次commit
对应着一个tree,tree 类似文件夹,一个tree
下面又可以包含多个tree
tree
下面可以包含文件,也就是blob
,但是blob
没有具体名字,
因为git的存储机制是基于相同文件的内容就认为是同一个blob
,
在有多个相同文件时,就能节省实际的存储空间。
git 提交规范
来源网络
- [func] do sth:功能开发
- [fixbug] #xx# do sth:Bug 修改,#号内为 issue 编号
- [docs] do sth:文档
- [chore] do sth:build相关的修改
- [test] do sth:添加测试代码
- [optimize] do sth: 优化部分代码
- [style] do sth: 格式化上的格式化、删除空白行等,无关功能
-END-