1、配置了git,为什么还不能拉取数据
答: 免密认证配置;instead Of配置没有配,配的是SSH免密配置,但是使用的还是HTTP协议访问
2、为什么我Fetch了远端分支,但是我看本地当前分支历史还是没有变化?
答:Fetch 会把代码拉取到本地的远端分支,但并不会合并到当前分支,使用当前分支没有变化;后续需要执行 ”merge“进行合并
HTTP Remote (不安全)
免密配置
内存: git config ---global credential.helper 'cache --timeout=3600'
硬盘: git config --global credential.helper "store --file /path/to/credential-file"
不指定目录的情况默认是 ~./git-credentials
SSH Remote
URL: git@github.com:git/git.git
免密配置
SSH 可以通过公私钥的机制,将生成的公钥放在服务端,从而可以实现免密访问
目前的key的四种类型,分别是 dsa、rsa、ecdsa、ed25519
默认是rsa,由于安全问题,不推荐dsa、rsa,优先推荐使用ed25519
生成公私钥,如下
ssh-keygen -t ed25519 -C "your_email@example.com" // 秘钥默认在 ~/.ssh/id_ed25519.pub
Git Add
初始化git本地库(项目目录下)
git init
将代码添加到暂存区
git add ./*
提交代码到本地仓库
git commit -m "add readme"
查询文件objects
git cat-file -p 55xxx
Objects目录 .git/objects
Commit / tree /blob在git统一称为Object,还有个tag的object
Blob 存储文件内容
Tree 存储文件的目录信息
Commit 存储提交信息,一个Commit可以对应唯一的版本代码
commit ---> 对应多个Tree --->对应多个Blob
Refs
Branch
git checkout -b 分支名称 # 新建分支
分支一般用于开发阶段,是可以不断添加Commit进行迭代的
Tag
标签一般表示是一个稳定版本,指向的Commit 一般不会变更
git tag 命令生成 tag
一般都指向当前的commit
Annotation Tag(附注标签)
一种特殊的Tag , 可以给Tag 提供一些额外的信息。
创建:git tag -a name -m "信息"
查看 tag object的内容
追溯历史代码
获取当前版本
通过Ref 指向的Commit可以获取唯一的代码版本
获取历史版本代码
Commit里面会存有parent commit 字段,通过commit的串联获取历史版本代码
修改文件提交后,查看新的commit,新增了parent信息
修改历史版本
-
Commit --amend
这个命令可以修改最近的一次commit信息,修改后commit id 会变
悬空object
查询悬空object:git fsck --lost-found
-
rebase
通过git rebase -i 可以实现对最近三个commit的修改:
- 合并commit
- 修改具体的 commit message
- 删除某个commit
Git Gc
GC
通过git gc 命令,可以删除一些不需要的object 以及会对object进行一些打包压缩来减少仓库的体积。
Reflog
Reflog 是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期。
git reflog expire --expire=now --all
指定时间
git gc --prune=now 指定的是修剪多久之前的对象,默认是两周前。
就细节而言,Git做了这几件事:
- pack_refs 过程
- reflog expire 过程
- repack 过程
- prune 过程
- rerere 过程
pack_refs 过程相当于执行"git pack-refs --all --prune",它会将GIT_DIR/packed-refs下。
reflog expire 过程相当于执行"git reflog expire --all",它会将删除所有超过期限而且没有被refs涉及的reflog条目。
repack 过程相当于执行"git repack -d -l",一般情况下还会包括"-A"选项,它会将所有未被包含在一个pack的松散对象连结成一个pack,也会将现有的pack重新组织为一个新的更有效率的pack,并删除冗余的pack(如果她们中存在不可达的松散对象,会先把这些对象释放出来)。
prune 过程相当于执行"git prune --expire",他会删除所有过期的、不可达的且未被打包的松散对象。
rerere 过程相当于执行"git rerere gc",这种情形下似乎没什么用。