Git的配置

113 阅读3分钟

1、配置了git,为什么还不能拉取数据

答: 免密认证配置;instead Of配置没有配,配的是SSH免密配置,但是使用的还是HTTP协议访问

2、为什么我Fetch了远端分支,但是我看本地当前分支历史还是没有变化?

答:Fetch 会把代码拉取到本地的远端分支,但并不会合并到当前分支,使用当前分支没有变化;后续需要执行 ”merge“进行合并

HTTP Remote (不安全)

URL: github.com/git/git.git

免密配置

内存: 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的内容

image-20230526202505506.png

追溯历史代码

获取当前版本

通过Ref 指向的Commit可以获取唯一的代码版本

获取历史版本代码

Commit里面会存有parent commit 字段,通过commit的串联获取历史版本代码

修改文件提交后,查看新的commit,新增了parent信息

image-20230526203728288.png

修改历史版本

  1. Commit --amend

    这个命令可以修改最近的一次commit信息,修改后commit id 会变

    悬空object

    查询悬空object:git fsck --lost-found

  2. rebase

    通过git rebase -i 可以实现对最近三个commit的修改:

    1. 合并commit
    2. 修改具体的 commit message
    3. 删除某个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",它会将GitDIR/refs目录下的所有headstags打包成一个文件并保存为Git_DIR/refs目录下的所有heads和tags打包成一个文件并保存为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",这种情形下似乎没什么用。