git浅析

基本概念

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
  • 所有文件存储经过zlib压缩,相同的未修改的文件内容会共用空间
  • 分支指针(如master)指向commit-id(某一次提交结点)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值