前言
最近在学习整理git,分享给大家。放上参考资料,供查阅。
初始化
git init创建.git文件夹,初始时包含7个文件(夹),可能还有一个守护进程文件夹。
-
hooks/--存放钩子
-
info/exclude--自定义忽略的文件,不上传到仓库
-
objects/ -- 所有数据内容
-
refs/ -- 指向数据(分支)的提交对象的指针
-
config -- 项目配置文件
-
description -- 仅供 GitWeb 程序使用,未详细了解
-
HEAD -- 指示目前被检出的分支
-
Index -- 暂存区信息/索引(init时未创建,暂存区没有内容)
分区和文件状态
分区:工作区--暂存区--本地仓--远程仓
文件状态:
- untracked未关联到git,通过git add命令可添加到暂存区
- modified已修改(工作区)
- staged已暂存(暂存区)
- committed已提交(本地仓)
关于暂存区的强调
暂存区是逻辑分区,并不存在单独的文件夹保存暂存区的内容/修改。 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对象。
强调:很多文章都在说commit文件是快照,个人不这样理解。blob是文件快照,commit只是存了一个指向blob的指针,参考《精通Git》Git分支章节,电子版 .
图解
配置
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
git rebase
变基,字面意思, 当前分支b1,执行git rebase b2, 变b2为基,并把日志拉成一条直线。
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