这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
Git基本命令
- 配置
- git config
- git remote
- 提交代码
- git add
- git commit
- 远端同步
- 拉取代码
- clone
- pull
- fetch
- 推送代码
- push
整体架构(参考知乎):
常见问题:
- push
整体架构(参考知乎):
- 拉取代码
- 明明配置了Git配置,但依然无法拉取代码:没有配置密钥,或者没有权限,或者instead of配置没有配,配的ssh免密配置,但是使用的还是http协议访问
- Fetch了远端分支,但本地当前的分支历史没有变化:fetch会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化
Git目录介绍
项目初始化
先创建一个文件mkdir demo,然后进入到这个文件中cd demo,使用git init命令初始化。(命令在git bash中)
git init命令可以有其他参数,
--inital-branch:初始化的分支,原本默认是master分支,可以通过这个参数制定分支--bare:创建一个裸仓库(纯Git目录,没有工作目录)--template:通过模板来创建预先构建好的自定义git目录
Git Config
不同级别的Git配置
--global:全局,存在与当前用户的config下--system:系统,存在/etc/config下--local:本地,存在当前本地的.git文件下的config文件下 每个级别的配置可能会重复,但是低级别的配置会覆盖高级别的配置,级别最高的是系统级别,然后是全局,最后是本地。
Git Remote
用于在远程仓库的操作git remote -v显示所有远程仓库,remote一般分为http和ssh两种。
将自己的仓库连接到某个远程服务器:git remote add origin <server>
SSH Remote
考虑到安全性,一般不推荐使用HTTP Remote,而使用SSH免密配置。SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问。目前的Key类型默认使用rsa,但是由于一些安全问题,已经优先推荐使用ed25519。命令:
ssh-keygen -t ed25519 -C "github注册邮箱"
密钥默认存在~/.ssh/id_ed25519.pub,然后在浏览器找到个人profile下的SSH and GPG keys,点击New SSH key,将密钥复制进去即可。
Git Add
git add file将工作区的文件添加到暂存区
Git Commit
git commit -m "说明文字"将暂存区的文件提交到本地仓库
Object
commit/tree/blob在git里统称为Object,除此之外还有个tag的object
- Bob:存储文件的内容
- Tree:存储文件的目录信息
- Commit:存储提交信息,一个Commit可以对应唯一版本的代码 这三个信息的串联:
- 通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID
- 通过Tree存储的信息,获取到对应的目录树信息
- 从tree中获得blob的ID,通过Blob ID获取对应的文件内容
Refs
Refs文件存储的内容就是对应的Commit ID,因此把ref当做指针,指向对应的Commit来表示当前Ref对应的版本。有不同种类的ref,refs/heads前缀表示的是分支,refs/tags前缀表示的是标签
- branch分支:
git checkout -b可以创建一个新分支,分支一般用于开发阶段,是可以不断添加Commit进行迭代的 - Tag标签:标签一般表示的是一个稳定版本,指向的Commit一般不会变更。通过git tag命令生成tag
追溯历史版本
通过Ref指向的Commit可以获取唯一的代码版本,Commit里面会存有parent commit字段,通过commit的串联获取历史版本代码。
修改历史版本
commit -amend:通过这个命令可以修改最近一次commit信息,修改之后commit id会变rebase:通过git rebase -i HEAD~3可以实现对最近三个commit的修改:- 合并commit
- 修改具体的commit message
- 删除某个commit
filter -branch:删除所有提交中的某个文件或全局修改邮箱地址等操作。
Git GC
- GC:通过
git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积 - Reflog:
reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期。 - 指定时间:
git gc prune=now,指定的是修剪多久之前的对象,默认是两周前。
Git Clone & Pull & Fetch
- Clone:拉取完整的仓库到本地目录,可以指定分支,深度
- Fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并,需要手动操作。
- Pull:拉取远端某分支,并和本地代码进行合并,操作等同于git fetch+git merge,也可以通过git pull --rebase完成git fetch+git rebase操作,可能存在冲突,需要解决冲突。
Git Push
将本地代码同步至远端,一般使用git push origin master命令即可完成
冲突问题:
- 如果本地的commit记录与远端的commit历史不一致,则会产生冲突,比如
git commit --amend或git rebase都有可能导致这个问题。 - 如果该分支就自己一个人使用,或者团队内确认过可以修改历史,则可以通过
git push origin master -f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后,再进行推送。