git 核心原理


基本操作
1.初始化
-
设置基本信息
git config --global user.name "scorpion777"
git config --global user.email "123123@qq.com"
# 查看配置信息
git config --list
# 设置初始化是以mian为初始分支
git config --global init.defaultBranch main
-
初始化 git
git init
# 取消git版本控制(重置)
rm -rf .git/
-
查看 git 状态
# 查看当前git信息
git status
# 简略信息
git status -s
# 查看提交记录
git log
# 查看当前remote,远程仓库
git remote
# 更加详细的信息
git remote -v
-
设置远程仓库地址
git remote add 别名 远程仓库地址
# 例子 远程仓库地址可以是基于https 也可以是基于ssh(推荐后者密钥的方式)
git remote add my_project https://1231/aaa.git
git remote add origin git@gitee.com:1223/aaa.git
# 移除远程仓库
git remote remove origin
# 重命名远程仓库别名
git remote rename origin origon123
# 修改远程仓库地址
git remote set-url orgin https://bbb/aa.git
2.提交流程push
-
工作区提交到暂存区(未追踪->已追踪)
# 追踪文件
git add 文件名
# 添加全部
git add .
# 查看暂存暂存区文件
git ls-files
# 从暂存区回退到工作区
git reset
git restore -S 文件名
-
暂存区提交到本地仓库
git commit -m "update"
# 回退到暂存区
git log
git reset --hard 上一次提交序号
--mixed 重置 HEAD 和索引
--soft 只重置 HEAD
--hard 重置 HEAD、索引和工作区
--merge 重置 HEAD、索引和工作区
--keep 重置 HEAD 但保存本地变更
# 恢复到回退前的状态
# 未产生新的提交
# 查看操作历史
git reflog
# 恢复到回退前的状态
git reset --hard HEAD@{n} # 替换 n 为 reflog 中的序号
# 已经产生新的提交
# 找到原分支的最新提交哈希(通过 git reflog)
# 基于原提交新建分支或直接合并:
# 方法 1:新建分支恢复
git branch recovery-branch <original-commit-hash>
git checkout main
git merge recovery-branch
# 方法 2:直接重置
git reset --hard <original-commit-hash>
-
工作区提交到本地仓库
# 合并两次操作 该指令只会应用与追踪文件 新建的文件仍需使用git add . 进行追踪
git commit -am "update"
-
本地仓库推送到远程仓库
git push -u 远程仓库别名 分支名
git push origin master
# 强制推送 直接本地仓库覆盖远程仓库 慎用
git push -f origin master
3.拉取流程pull
-
拉取远程仓库到本地仓库
git pull origin master
# 先拉取远程提交,再提交当前
git pull --rebase origin master
-
拉取项目
# 克隆某个分支,并获取其它分支
git clone -b 分支名 仓库地址
# 克隆某个分支,不获取其它分支
git clone -b 分支名 --single-branch 仓库地址
# 通过别名拉取ssh协议仓库,别名配置路径~/.ssh/config Host
git clone git@codeup.aliyun.com(别名):xxx/xxx.git
4.分支管理branch
-
分支管理
# 查看分支
git branch
# 创建分支
git branch 分支名
# 切换分支(切换HEAD指向)
git checkout 分支名
# 创建分支并且切换到新分支
git checkout -b 分支名
# 删除完全合并的分支
git branch -d 分支名
# 删除分支(即使没有合并)
git branch -D 分支名
# 修改分支名字
git branch -m 新分支名
git branch -m 旧分支名 新分支名
-a, --all 列出远程跟踪及本地分支
-d, --[no-]delete 删除完全合并的分支
-D 删除分支(即使没有合并)
-m, --[no-]move 移动/重命名一个分支,以及它的引用日志
-M 移动/重命名一个分支,即使目标已存在
--[no-]omit-empty 在格式化引用结果为空之后,不输出换行符
-c, --[no-]copy 拷贝一个分支和它的引用日志
-C 拷贝一个分支,即使目标已存在
-l, --[no-]list 列出分支名
--[no-]show-current 显示当前分支名
--[no-]create-reflog 创建分支的引用日志
--[no-]edit-description 标记分支的描述
-f, --[no-]force 强制创建、移动/重命名、删除
--merged <提交> 只打印已经合并的分支
--no-merged <提交> 只打印尚未合并的分支
--[no-]column[=<风格>] 以列的方式显示分支
--[no-]sort <key> 排序的字段名
--[no-]points-at <对象> 只打印指向该对象的分支
-i, --[no-]ignore-case 排序和过滤属于大小写不敏感
--[no-]recurse-submodules 在子模组中递归
--[no-]format <格式> 输出格式
# 合并分支
# 把别的分支合并到当前分支
# 切到要并入的分支
git checkout master
# 合并其它分支到当前分支
git merge 被合并的分支
# 删除合并后的分支指针
git branch -d 被合并的分支
5.变基管理rebase
# main分支和功能分支,main有新的提交
# 位于功能分支,将main分支的内容更新到本地(本地新功能未提交到远程)
git rebase main
# 位于功能分支(本地新功能已经提交到远程)
git merge main
5.暂存操作stash
-
git stash
# git stash 会存储暂时区的修改
# git stash命令默认不会存储下列文件
# -工作区中新增的文件(untracked files)、
# -被版本库忽略的文件(.gitignore 中定义的)
# 要存储untracked files,可以使用-u选项
git stash -u
# 要添加注释
git stash save -u "备注信息"
# 存储到堆栈
git stash save -u "备注信息"
# 查看堆栈中的 stash 列表
# 堆栈中可能会有多个 stash,通过 stash_id 进行区分
git stash list
# 查看 stash 的内容
git stash show
git stash show stash@{id}
git stash show -p
# 将堆栈中的 stash 应用到工作区
# 将堆栈中的指定 stash 应用到工作区(保留堆栈的内容)
git stash apply stash@{id}
# 将堆栈中的最近一次 stash,应用到工作区(保留堆栈的内容)
git stash apply
# 等价于上面的一条命令
git stash apply stash@{0}
# 如果你想在成功应用了堆栈的 stash 后,立即将其从堆栈中删除
# 将堆栈中的最近一次 stash,应用到工作区(删除堆栈的内容)
git stash pop
# 删除堆栈中的 stash
# 删除指定的 stash
git stash drop stash@{id}
# 删除最近一次的 stash
git stash drop
# 删除所有的 stash
git stash clear
6.标签管理tag
# 轻量级标签
git tag v1.0.0
# 注释标签(正式发布使用)
git tag -a v1.0.0 <commit hash> -m 'release version 1.0'
# 查看所有标签
git tag
# 查看标签详细信息
git show v1.0.0
# 远程操作
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 删除远程标签
git push origin :refs/tags/v1.0.0
# 强制删除(慎用)
git push -f origin :refs/tags/v1.0.0
# 获取远程标签
git fetch origin --tags
# 本地管理
# 列出标签
git tag -l 'v1.*'
# 删除本地标签
git tag -d v1.0.0
# 检出标签
git checkout v1.0.0
# 基于标签v1.0.0创建分支
git checkout -b hotfix-v1.0.0 v1.0.0
7.回退管理(reset,restore,revert,checkout)
reset: 移动HEAD,影响历史
restore: 恢复文件状态
revert: 安全撤销,创建新的提交
checkout: 切换分支或恢复文件
# 建议
# 1. 优先使用 revert 而不是 reset
# 2. 使用 restore 而不是 checkout 恢复文件
# 3. reset --hard 谨慎使用
# 4. 退队协作时避免修改已推送的历史
a. git reset (会移动HEAD指针)
# 撤销本地提交,保留暂存区,回到git add .后的状态
git reset --soft HEAD~1
# 撤销暂存,文件从暂存区到工作目录,回到git add .前的状态
git reset --mixed HEAD
# 完全撤销所有更改(慎用),会把更改后的文件也清除
git reset --hard HEAD
b. git restore (用于恢复文件状态)
# 恢复工作目录中的文件最后提交的状态,git add .前的状态恢复到未更改
git restore main.js
# 从暂存区移除,但保留工作区的更改,git add .后的状态恢复到git add .前
git restore --staged main.js
c. git revert (创建新提交来撤销commit更改)
# 创建新提交撤销 abc123 的更改
git revert abc123
d. git checkout (恢复文件到到最后提交的状态,类似git restore)
# 恢复工作目录中的文件最后提交的状态
git checkout -- main.js