基本概念
HEAD:指向某个branch_name or node_name; 表示与当前工作区关联的版本(结点)
相对引用(位置):HEAD^ or main^( father) HEAD~3(HEAD向上三步的位置)
master: git 默认主分支
origin/master: git 默认远程跟踪分支
- 工作区(workspace)
- 版本库(.git隐藏文件夹)
- index/stage(缓存区)
- master(目录树 or 本地仓库local repository,存储区文件hashID index)
- object(存储的实质内容)
- 远程仓库
.git文件夹
- hooks 命令脚本
- info 记录不需要git管理的文件(exclude)
- logs 提交日志
- objects 文件实体
- refs 指向文件实体的引用
- config/description/ HEAD(当前分支)
- index 缓存区
基本命令
-
git init 初始化
-
git branch ([branch_name])创建、(显示)分支(branch代表一条分支,也是分支上的末节点的指针)
- git branch -f [branch_name] [ref_place]强制移动分支指向位置
- git branch -d [branch_name]删除分支指针
-
git add [file]:working directory -> stage(文件进入objects)
-
git commit [-m info]:stage -> history/master/local repository
(更新所在分支,分支前进一个结点(新版本)) -
git push [repo] [branch] :local repository -> remote repository
多人合作时,远程仓库的活跃结点可能已更新,故push 代码前必须先fetch 并 rebase, -
git clone [url] :remote repository -> local 利用远程仓库建立本地仓库
-
git fetch [remote_repo] ([remote_branch])拉取到本地,同步远程跟踪分支
-
git merge [branch2]合并分支,利用branch2 与 当前main分支作为父节点,生成共同的
子节点,并移动main至子节点 -
git rebase [branch2] 将当前分支branch1所在分支隐去,所在branch1末结点改为branch2的子节点
-
git pull [remote_repo] ([remote_branch]:([local_branch])) = git fetch + merge
拉取远程分支并与本地分支合并 -
git checkout [branch_name or node_name]:local repository -> working
directory
(文件从版本库复制到暂存区、工作区,当本地存在未commit的修改时无法checkout)
(加载分支 or 结点内容,并切换HEAD到该分支or结点)【分离HEAD】- git checkout -f [ref_place]强制切换HEAD,丢弃本地所有未commit修改
- git checkout [file] (所有文件-> . )读取暂存区到工作区,放弃未add的修改
(如果不指定切换到哪个分支,那就是切换到当前分支,虽然HEAD的指向没有变化,但是后面的过程依然会执行,于是就可以理解为放弃工作区的变动)
git checkout -f 放弃未add和commit的修改
-
git reset ([–mixed]) [ref_place] [file]:(HEAD回退版本)
工作区、暂存区以及由 reset 所导致的的文件差异,都会被放进工作区- –hard: 清除工作区和缓存区未commit的修改
- –soft:保留工作区和暂存区的内容,并把因版本回退所带来的差异文件内容放进暂存区
高阶
- git commit -m ‘information’ (windows->“”)
- 配置信息 git config --list
- git diff :暂存区和工作区的差异
- git diff --cached :暂存区和版本库(HEAD)差异
- git diff HEAD :工作区和版本库差异
- git diff [ref_place]: 工作区与引用版本差异
- git diff c1 c2 :结点差异
- git status :仓库状态
- git log :提交历史记录
- git rm ([–cached])[file] :(workspace) & stage(delete file)(cached表示保留工作区文件)
- git remote
- -v:显示所有远程仓库
- add [repo_name] [url]添加remote repository
- rm [repo_name]
- rename [oldname] [newname]
- git merge/rebase branch2,当branch2是当前所在branch1分支的子节点,则等价于将
branch1移至(更新到)branch2所在处 - git revert [ref_place]: 版本回退,新增子结点C3与ref_place旧结点C0相同,并将HEAD更新至C3
- git cherry-pick [nodes]复制若干指定节点作为当前结点的子节点
- git rebase -i HEAD~3:调整当前结点及若干父节点的依次顺序(可删除若干)【交互式interactive rebase】
- git tag [tag_name] [node_name]:为结点赋予标签
- git tag:查看所有标签
- git tag -d [tag_name]:删除标签
- git checkout -b [branch_name]: 新建分支并切换HEAD到该分支
- git commit --amend:git会在当前结点的父节点进行一次新提交,等价于放弃上一次commit
底层理解
- Git的每一次提交都是对代码仓库的完整备份,也就是保存了一份代码仓库完整的快照
- Git 每一次commit后存储在local repo的版本结构都类似于文件系统,包含 tree 和 blob 两种对象,tree 对象相当于目录,blob 对象相当于iNode 与文件内容
提交结构树:
commit-id(root node 表示一次commit,存储提交相关信息)- tree(–>file folder)
- blob(–>file)
- blob
- tree
- blob
- blob
版本结构树:
commit-1 - commit-2
- commit-3.1
- commit-3.2
- commit-3.2.1
- tree(–>file folder)
- 所有文件存储经过zlib压缩,相同的未修改的文件内容会共用空间
- 分支指针(如master)指向commit-id(某一次提交结点)