为什么要学习Git
协同工作:本地代码管理,学习
开源社区:使用git维护的开源项目
版本控制:分布式版本控制
常见git的配置 git config -l:可以查看git的所有配置
git config --system --list:查看系统配置
git init --initial-branch初始化git的分析
git init --bare 创建一个裸仓库(纯git目录 没有工作目录)
git init --template 可以通过模板来创建预先构建好的自定义git目录
git有工作区和缓存区
工作区就是本地目录(除了.git的隐藏目录),而我们所说的暂存区就在.git文件夹里面,常用的命令git add命令就是把文件提交到版本库中,go commit就是把暂存区的内容合并到当前分支上
通过tree .git来看.git的目录
通过cat .git/HEAD看HEAD文件夹里面的内容
git remote -h可以查看帮助
使用以下命令添加远程仓库 git remote add origin-ssh git@github.com:git/git.git
git remote add origin-http github.com/git/git.git
查看远程仓库的情况git remote -v
修改远程仓库的名字git remote rename
自定义push和Fetch的URL git remote add origin git@github.com:git/git.git正常的添加远程仓库,仓库名为origin
git remote set-url --add --push origin git@github.com:my_repo/把origin仓库下的push的URL进行了修改
配置免密认证
内存:git config --global credential.helper 'cache --timeput=3600'
硬盘:git config --global credential.helper "store --file /path/to/credential-file" 不指定目录的情况下,默认是~/.git-credentials
SSH Remote
SSH可以通过公私钥的机制,讲生成的公钥放在服务端,从而实现免密访问,远程仓库是github的话就是把自己的公钥放在github
目前使用的Key的类型四种,分别是dsa, rsa, ecdsa, ed25519;默认使用的是rsa 生成ed25519的方法 ssh-keygen -t ed25519 -C "you_email@example.com"
在 [~/.ssh](默认路径)下就能看到id_ed25519的私钥和id_ed25519.pub的公钥 git的Object模型
1.Blob:存储文件的内容 2.Tree:存储文件的目录信息
3.Commit:存储提交信息,一个Commit可以 对应唯一的版本号
怎么查找信息呢?
1.通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID,commit的id号可以通过git log来得到
2.通过Tree存储的信息,获取对应的目录树信息,即目录下有哪些文件
3.从 tree中获得的blob ID,通过bolb ID可以获取对应文件的内容
refs
在commit后,我们也能发现.git目录的refs/heads目录下多了个分支名master 使用cat命令可以发现内容就是master分支上commit的id号 refs的内容就是对应Commit ID,因此把ref当作指针,指向对应的Commit就表示当前ref的版本;
追溯历史版本
通过Ref指针,我们可以获取当前分支的最新版本,而在object里面,如果在第一次commit后对文件修改又commit的话(通过commit的串联),那么此时此时commit ID的信息里就会多一个parent字段,就是上一个commit版本
修改历史版本
1.commit -amend:通过这个命令可以修改最近一次的commit信息,修改后commit id会变
2.rebase:通过git rebase -i HEAD~3可以实现对最近三个commit的修改,可以的修改如下:合并commit 修改具体的commit message 删除某个commit
3.filter - branch:该命令可以指定删除所有提交中的某个文件或者全局修改邮箱等操作 Git GC 我们可以通过git gc命令来删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积。Reflog是用来记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,这里我们在执行git gc前,需要手动设置日志为过期;通过还要设置prune=now,指定修剪多久之前的对象,默认是两周前
Git Clone & Pull & Fetch
Clone:拉取完整的仓库到本地目录,可以指定分支和深度
Fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作
Pull:拉取远端某分支,并和本地代码合并,操作相当于git fetch + git merge,也可以通过git pull --rebase来完成git fetch + git rebase操作
Git Push 把本地分支上的代码同步到远程仓库中 git push