git详解

148 阅读7分钟

一、初识

1、概念

Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性。

Git 之所以快速和高效,主要依赖于它的两个特性:直接记录快照,而非差异比较;几乎所有操作都是本地执行。

2、git 和svn的区别

  • 存储方式: git是分布式的,有本地和远程两个版本库,SVN是集中式,只有一个远程版本库;

  • git 有工作区,暂存区,远程仓库,git add将代码提交到暂存区,commit提交到本地版本库,push推送到远程版本库。svn是add 提交到暂存,commit是提交到远程版本库。

  • 版本控制差异: git是基于快照进行版本控制,快照是在原有文件版本的基础上重新生成一份新的文件,类似于备份。为了效率,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。SVN是基于差异的版本控制,它们存储的是一组基本文件和每个文件随时间逐步累积的差异。

  • 文件目录差异

    git目录结构

    • .git
      • hooks 钩子文件
        • applypatch-msg.sample
        • commit-msg.sample
        • fsmonitor-watchman.sample
        • fsmonitor-watchman.sample
        • pre-applypatch.sample
        • pre-commit.sample : commit时会触发这个钩子
        • pre-push.sample : push触发
        • pre-rebase.sample
        • pre-receive.sample
        • prepare-commit-msg.sample
        • update.sample : update触发
      • info
        • exclude : 忽略的文件
      • object : git数据对象,包括commit,trees,二进制对象,标签等
      • COMMIT_EDITMSG : 上一次提交的注释信息
      • log : 各个refs的历史信息
      • refs : 每个分支指向那个提交
      • config : 本项目配置信息,包括仓库地址,分支,用户账号等
      • description : 项目描述
      • HEAD : 当前分支的最后一次提交
      • index : 索引文件,存贮git add把要添加的项
      • packed-refs : 分支标识文件

    svn目录结构

    • .svn
      • pristine 各个版本纪录,这个文件一般较大
      • tmp
      • entries 当前版本号
      • format 文本文件, 放了一个整数,当前版本号
      • wc.db 二进制文件
      • wc.db-journal 二进制文件
  • 命令对比

作用gitsvn
版本库初始化git initsvn create
clonegit clonesvn co(checkout)
addgit add (.除去.gitignore,*所有的文件)svn add
commitgit commitsvn commit
pullgit pullsvn update
pushgit push-
查看工作状态git statussvn status
创建分支git branch <分支名>svn cp <分支名>
删除分支git branch -d <分支名>svn rm <分支名>
分支合并git merge <分支名>svn merge <分支名>
工作区差异git differ (-cached / head)svn diff
更新至历史版本git checkout svn update -r
切换taggit checkout svn switch
切换分支git checkout branchsvn switch branch
还原文件git checkout -pathsvn revert path
删除文件git rm pathsvn rm path
移动文件git mv pathgit mv path
清除未追踪文件git cleansvn status sed -e

二、常用操作

* 初始化仓库 并提交到远程仓库

git init: 初始化一个本地仓库,在同级目录下会出现一个隐藏的.git文件

git add .

git commit -m '初始化仓库‘

git push origin master

* 仓库迁移

git clone --bare git@ip:port/test-new.git 下载新仓库地址(含操作日志信息)

cd test-new

git push --mirror git@ip:port/test-old.git 将代码强制提交到新仓库中

三、常用命令

* git config : 查看git配置信息

  • git congif -l : 查看Git配置信息
  • git config user.name 'ai' : 设置用户名
  • git config user.email 'xxxxxx@qq.com' : 设置邮箱

* git init : 初始化git仓库

* git clone : 代码克隆

  • git clone <远程仓库地址>
  • git clone --bare <远程仓库地址> : 下载远程仓库代码,并带log信息

* git add: 将文件从工作目录提交到暂存区

  • git add [file1] [file2]
  • git add [dir]
  • git add .

* git commit: 将文件提交到本地仓库

  • git commit -m '注释内容' : 将文件从暂存区提交到本地仓库
  • git commit -amend : 将文件从暂存区提交到本地仓库(会带入上次提交点的注释信息)
  • git commit -a -m '注释内容' : 将文件从工作区提交到本地仓库(git add和git commit 组合)

* git push : 将文件从本地仓库提交到远程仓库

  • git push <远程仓库地址> <本地分支名称>:<远程分支名称> : 将本地分支上传到远程并合并
  • git push origin <本地分支名称>:<远程分支名称> :将本地分支上传到远程并合并,如果远程分支名称和本地分支一致可不传
  • git push origin <标签名称> :将标签推送到远程仓库
  • git push --mirror <远程仓库地址> : 将代码强推到远程仓库
  • git push origin --delete <远程分支名称> : 删除远程分支

* git status:查看上次提交之后是否有对文件进行再次修改

  • git status
  • git status -s:输出简短信息

* git branch : 分支相关操作

  • git branch 新分支名称 : 创建分支(在当前所在分支基础上创建一个分支)
  • git branch 新分支名称 标签名称 : 创建分支(根据标签创建分支)
  • git branch tjd-3 提交点id(6e5d12d) : 根据提交点创建分支
  • git branch -v :查看分支信息

* git checkout : 分支相关操作

  • git chekcout 分支名称:切换分支
  • git checkout -b 分支名称:创建并切换分支
  • git checkout -d 分支名称:删除分支(仅删除引用)

* git merge 分支名称: 分支合并(合并后在本地分支)

* git rebase 分支名称:将当前分支新增的提交点 提交到指定分支后面(合并起来减少分支)(不建议使用)

* git reflog : 查看git提交引用日志

* git reset: 提交记录回退,一般配合reflog使用(实质上是修改head的引用)

  • git reset --mixed(默认可不写)提交点标识 : 移动本地库的HEAD指针,被回滚的代码在暂存区
  • git reset --soft 提交点标识: 移动本地库的HEAD指针,重置暂存区,重置工作区
  • git reset --hard 提交点标识 : 移动本地库的HEAD指针,重置暂存区
  • git reset --keep 提交点标识 : 移动本地库的HEAD指针,重置工作区

提交点标识:可以通过git reflog 查看 提交点hash值 或者 HEAD~数字(当前版本回退几个)HEAD^(回退一个)或者 标签

* git revert : 撤销提交

  • git revert -n <提交点标识> : 撤销某一提交点,但不影响后面的版本

* git tag : 标签相关

  • git tag -a <标签名称> <提交点信息ID> -m <注释内容> : 根据提交点创建分支(创建后在本地仓库,使用 git push origin <标签名称> 推送到远程仓库)
  • git tag -l : 查询所有tag
  • git tag -l | grep stg或git tag -l "stg2020*" : 过滤指定字母开头的tag
  • git tag -d <标签名称> : 删除本地仓库tag
  • git push -d origin $(git tag -l "stg2020*") : 删除远程标签

* git log : 操作日志相关

  • git log -p:查看commit详细的改动
  • git log --stat:查看commit重大改动
  • git log --pretty=oneline
  • git log --oneline
  • git log --oneline --graph ### * git diff :文件比较
  • git diff --staged(或者 --cached):查看暂存区和上一条commit的区别
  • git diff: 查看工作目录和暂存区的区别
  • git diff HEAD:查看工作目录和上一条commit的区别

* git show:查看某个具体的commit

  • git show commit的引用(或SHA-1)
  • git show 文件名称

* git fetch:仓库代码同步到本地

* git pull <仓库地址> <分支名称(可选)>: 仓库代码同步到本地,并合并到当前本地分支(pull=fetch+merge)

* git remote : 远程库相关

  • git remote add 连接名 远程地址 : 连接远程仓库
  • git remote -v : 查看远程仓库信息

四、核心概念

HEAD、master、branch区别

HEAD:当前分支,最新提交点引用

master: 核心分支,创建项目的默认分支

branch: 分支 实际上就是提交点点引用

git四大区域及区域之间的转换

截屏2023-06-25 上午9.04.04.png

git存储结构

截屏2023-06-25 上午9.14.42.png

五、git flow

流程常用分支

  • Production分支(master分支):也就是我们常用的master分支,这个分支只能从其他分支合并,不能在这个分支直接修改
  • Develop分支(主开发分支):主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,Feature分支
  • Feature分支(开发分支):用来开发新功能的分支,一旦开发完成后将合并回Develop分支进入下一个Release
  • Release分支(预发布分支):当需要发布一个新的Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
  • Hotfix分支(bug补丁修复分支):当我们Production发现新的bug的时候,我们需要创建一个HotFix,完成Hotfix后,我们合并回master和Develop分支,所有 HotFix的改动会进入下一个Release

流程图

截屏2023-06-25 上午8.59.55.png

六、补充