关于git--持续更新

362 阅读4分钟

前言

最近在学习整理git,分享给大家。放上参考资料,供查阅。

初始化

git init创建.git文件夹,初始时包含7个文件(夹),可能还有一个守护进程文件夹。

  • hooks/--存放钩子

  • info/exclude--自定义忽略的文件,不上传到仓库

  • objects/ -- 所有数据内容

  • refs/ -- 指向数据(分支)的提交对象的指针

  • config -- 项目配置文件

  • description -- 仅供 GitWeb 程序使用,未详细了解

  • HEAD -- 指示目前被检出的分支

  • Index -- 暂存区信息/索引(init时未创建,暂存区没有内容)

分区和文件状态

分区:工作区--暂存区--本地仓--远程仓

git分区.jpg

文件状态:

  • untracked未关联到git,通过git add命令可添加到暂存区
  • modified已修改(工作区)
  • staged已暂存(暂存区)
  • committed已提交(本地仓)

git文件状态周期.jpg

关于暂存区的强调

暂存区是逻辑分区,并不存在单独的文件夹保存暂存区的内容/修改。 Index--索引,二进制文件,git add会向objects文件夹下添加blob对象,index里存的是该blob对象的hash以及文件目录树(后续生成tree对象)。参考文章

对于git add,比较真实的说法是"updating-or-adding-to-the-index",但是一些"Git 教学"行业的人开始把index形容为"the staging area for the next commit",至此,一些文档中也出现用"to stage"表示"the act of adding contents to the index"。

Git 对象

文字解读

git 有四种文件类型,blob、tree、commit、tag,或说有4类对象。都存储在.git/objects目录下,40位HashID,前两位为文件夹名,后38位作为文件名,git cat-file时要使用40位的ID。

  • blob是文件快照,每次执行git add,每个修改的文件都会增加一个对应的blob。

  • tree是文件目录结构对象,并最终指向blob对象

  • commit包含提交信息、tree、及上次提交的hash即parent,每次commit都会增加一个commit和tree文件。

  • tag对象,包含打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。其他文章很少提及,这里贴张截图。只有打附注标签的时候才会创建tag对象。

image.png

强调:很多文章都在说commit文件是快照,个人不这样理解。blob是文件快照,commit只是存了一个指向blob的指针,参考《精通Git》Git分支章节电子版 .

关于快照可以参考这个博客

图解

image.png

配置

git有3级配置文件,覆盖优先级从低到高为:

1.安装目录下的/etc/gitconfig文件:包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)

2.当前用户下的配置,一般在C:\Users\Administrator\ .gitconfig 只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对当前用户下所有的仓库生效。

3.项目.git文件夹下的config。 针对该仓库,你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)

git config --list --show-origin 查看系统上所有的配置文件路径和配置项

4.在当前用户目录C:\Users\Administrator\下可创建.bash_profile文件,没有详细研究,只知道配置git alias,比在上述三个配置文件中更好用,可简写git。比如git checkout 在上述3个文件只能别名/简写成 git co,在.bash_profile中可简写成gco。写法:alias gco='git checkout'

5.升级最新版本后,git pull和clone报错: Unable to negotiate with XX.XX.XXX.XXX : no matching host key type found . their offer: ssh-dss...., 解决方案:在安装路径找到对应的ssh_config文件,我的在D:\SoftWare\Git\etc\ssh,根据报错信息和原来的格式增加

Host *
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa

命令行

git xxx --help 或 git help xxx

打开git帮助手册

git fetch/git pull

git fetch获取远端更新但不和本地仓合并,得到 .git/FEACH_HEAD 再执行git merge remote/origin/branch和本地仓合并就相当于执行git pull

git pull --rebase = git fetch + git rebase git pull --autoStash = git pull + git stash + git stash apply

image.png

git rebase

变基,字面意思, 当前分支b1,执行git rebase b2, 变b2为基,并把日志拉成一条直线。

image.png git rebase -i HEAD~10 可以合并最近10次的提交记录,要配合其他修改。

git checkout ${branch} 检出分支/切分支 git switch也可以

git checkout -b ${new-branch}新分支 git checkout -b ${new-branch} ${tag或commitId} git status 结合文件状态和sourcetree git commit 详细研究 git add 添加单文件 git merge结合checkout--ours和no-ff git reset三种模式的区别 git restore git revert git tag git fetch和git push git log git cherrypick git diff git show git stash git fork git rebase