git 的一些笔记

git config

git config存在三个地方 :
1./.git/config 项目级别
2.~/.gitconfig 用户级别
3./etc/gitconfig 系统级别

git config -e 查看项目级别的配置
git config -e --global 查看用户级别的配置
git config -e --system 查看系统级别的配置

添加git用户配置
git config user.name “test”
git config user.email “test@gmail.com”

添加别名配置
git config --global alias.st status
git config --global alias.ci commit

删除配置
git config --unset user.name

查看配置
git config user.name

-------------
git log 查看提交日志

git log --pretty=oneline 按行显示提交日志

工作区 暂存区stage 版本库

git diff 查看工作区与暂存区之间的差异
got diff HEAD 查看工作区与HEAD(当前版本库的头指针)进行比较
git diff master 查看工作区与某分支进行比较

git diff --cached 查看提交暂存区和版本库中文件的差异
git diff --staged 同上

git status 查看文件状态
git status -s 查看文件状态的精简格式
注意M的位置和颜色..如果M前有空格则是未add到暂存区.如果无空格已经add到暂存区.如果有两个MM代表之前提交过到暂存区,同时还有没有提交到暂存区的内容

当执行 git status 或者git diff 扫描工作区改动的时候 先根据.git/index文件中记录的时间戳,长度等信息判断工作区文件是否改变,如果工作区的文件时间戳或者长度改变了,需要打开文件读取文件内容与更改前的原始文件相比较判断文件内容是否被更改.若未改变则将该文件新的时间戳和长度记录到index文件中

git add执行时,暂存区的目录树将被更新,同时工作区修改的文件内容会被写到对象库中的一个新对象中.该对象的ID会被记录在暂存区的索引中

git commit 执行时,暂存区的目录树会写到对象库中,master分支会做相应的更新,即master最新指向的目录树就是刚刚写入的暂存区目录树

git reset HEAD 暂存区的目录树会被重写,被当前分支指向的目录树所替换

git rm --cached <file>会直接从暂存区删除文件,工作区不作出改变

git checkout . 或者git checkout -- <file>会用暂存区全部的文件或指定的文件替换工作区的文件.这个操作很危险,会清除工作区中未添加到暂存区的改动.

git checkout HEAD . git checkout HEAD <file> 会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区中的文件.极危险.会同时清除工作区中未提交的改动和清除暂存区中未提交的改动

.git/index 文件索引目录树,记录文件名和文件的状态信息
.git/objects 存储文件的内容
.git/refs 保存引用的命名空间其中heads目录下的引用又称为分支


git branch 查看当前的工作分支 * 表明当前分支

git log -l HEAD
git log -l master
git log -l refs/heads/master
上面三个返回值是一样的..

find .git -name HEAD -o -name master
.git/HEAD
.git/logs/HEAD
.git/log/refs/heads/master
.git/refs/heads/master

HEAD指向当前分支.
refs/heads/master 里面保存了最后一次提交的哈希值.
通过哈希值..可以找到 tree parent 的哈希值
git cat-file -p xxxxxxx

找到tree.能找到具体文件..
找到parent,能找到上一次提交.一直往前找.直到没有parent


git reset --hard HEAD^ 重置master到上一个提交.HEAD^代表上一次提交,会改变ref/heads/master中的commit哈希值到为上一次提交的哈希值.并改变工作区

这样使用会很危险,会彻底的丢弃历史.

如何恢复呢?
使用reflog查看日志文件.
git reflog show master | head -5
然后恢复到想要的历史
git reset --hard master@{1}

HEAD也是一个指针,可以指向分支或者任何一次commit


git checkout 会重写工作区

git checkout branch 迁出branch分支,更新HEAD以指向branch分支,以及用branch指向的树更新暂存区和工作区

git checkout 汇总工作区/暂存区和HEAD的差异
git checkout HEAD 同上
git checkout -- filename 用暂存区中filename文件来覆盖工作区中的filename文件.相当于取消上次执行git add filename以来的本地修改

git checkout branch --filename 维持HEAD指向不变.用branch所指向的提交中的filename替换暂存区和工作区相应的文件.注意会降暂存区和工作区中的filename直接覆盖.

git checkout -- . git checkout .会取消所有本地的修改..相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会.

原文地址:https://www.cnblogs.com/zhepama/p/3854490.html