Git高效开发:常用命令速查指南

配置

shell 复制代码
git config --global user.name "yourname"
git config --global user.email "youremail"
git config --list # 查看所有的配置

常用命令

shell 复制代码
git init # 初始化一个仓库
git clone [URL] # 克隆一个仓库到本地
git status # 查看本地仓库当前的状态
git add <文件或者目录> # 将文件或者目录添加到暂存区
git add . # 将所有的修改的文件添加到暂存区

git log # 查看历史提交
git log --oneline # 以简洁的一行显示提交的历史
git log --graph # 以图形方式显示分支的合并历史

git commit -m "提交信息"
git commit --amend # 修改最后一次提交 push需要进行 -f操作
git push origin myBranch -f

git branch # 列出本地的分支、
git branch <新分支名> # 创建新的分支
git branch -a # 查看所有的分支
git checkout <分支名> # 切换到指定的分支
git checkout -b <新分支名> # 创建并切换到新分支上
git merge <分支名> # 将指定的分支合并到当前分支
git branch -d <分支名> # 删除本地分支
git push origin --delete <分支名> # 删除远程分支

git remote -v # 查看远程仓库信息
git remote add origin <仓库URL> # 添加远程仓库地址
git push -u origin <分支名> # 将本地分支推送到远程分支并设置跟踪关系
git pull # 拉取并合并远程仓库的更改到当前的仓库
git pull origin master # 将masetr的更改合并到本地仓库
git fetch # 拉去远程仓库的更改到本地,但不合并

git fetch

将远程的仓库拉取下来,但是不合并,通常,git fetch 用于查看远程仓库的状态

shell 复制代码
git fetch origin feature-branch
git fetch # 等同于git fetch origin

git fetch origin master
git merge origin master

git fetch origin master
git rebase origin/master

git log和git diff

!三点与两点区别\] Title * git diff A...B:表示比较B的最后一个节点8和A和B公共祖先3的区别 * git diff A...B:表示比较B的最后一个节点8和A的最后节点7的区别

shell 复制代码
git diff A...B # B相对AB祖先的区别 4 6 8相对3的区别
git diff A..B # AB现在的相对区别  5 7 和 4 6 8的区别

git diff # 查看工作区与暂存区的区别
git diff <file> # 查看工作区与暂存区该文件的区别
git diff --cached # 或 git diff --staged(两者等价)查看暂存区与最新提交的差异
git diff HEAD # 查看工作区与最新提交的差异
git diff <commit-id1> <commit-id2> # 比较两个历史提交之间的所有文件差异
shell 复制代码
git log A..B # 表示B有的,A却没有的提交 4 6 8相对3的提交区别
git log A...B # 非公共的所有提交记录 5 7 和 4 6 8的区别
git log # 查看历史提交
git log --oneline # 以简洁的一行显示提交的历史
git log --graph # 以图形方式显示分支的合并历史

git reflog

!描述

用于查看本地仓库操作日志 的命令,它记录了所有分支(包括 HEAD)的指针移动历史(如提交、切换分支、合并、变基、重置等操作),即使提交被 git resetrebase 移除,也能通过 reflog 找回。

  • 追踪本地仓库的所有操作记录(默认保留 30 天,可通过配置延长)。
  • 找回被误删除的提交(如执行 git reset --hard 后丢失的提交)。
  • 定位操作错误(如错误合并、错误变基)的时间点,以便回滚。
shell 复制代码
git reflog # 查看所有的操作日志
c5f5678 HEAD@{0}: commit: fix bug in login form
d8f1a2e HEAD@{1}: commit: add new feature for profile page
6f7890b HEAD@{2}: reset: moving to HEAD^
3a6d125 HEAD@{3}: commit: initial commit

git reflog -n 5 # 只显示最近5条记录

git reflog <branch-name> 
# 示例:查看 master 分支的操作日志 
git reflog master

git reflog --since="2 days ago" # 显示2天内的操作 
git reflog --until="2024-01-01" # 显示2024-01-01之前的操作
shell 复制代码
# 找回git reset --hard误删的提交
# 假设误执行 `git reset --hard HEAD~3`,删除了最近 3 个提交,可通过 `reflog` 找回:
git reflog # 查看操作日志,找到重置前的提交哈希
# 方式1:创建新分支保留误删的提交 
git checkout -b recover-branch a1b2c3d 
# 方式2:直接将当前分支重置回该提交(谨慎使用) 
git reset --hard a1b2c3d
shell 复制代码
# 撤销错误的 `rebase` 或 `merge`
# 若执行 `git rebase` 后发现操作错误,可通过 `reflog` 找到变基前的 `HEAD` 状态
git reflog
git reset --hard HEAD@{10}

git rebase 和 git merge

shell 复制代码
git merge develop # 将develop合并到master 就会将3、6、7合形成8
git rebase develop # 将master和develop的公共祖先3,将master的3号节点后面的所有提交记录截取下来,嫁接到develop的分支线的后面。

都是用于将 develop 分支的代码整合到当前分支的命令,但它们的实现方式和最终的提交历史结构有很大差异。

rebase:将当前分支的所有提交 "移植" 到 develop 分支的最新提交之上,使当前分支的提交历史呈现为一条直线,消除合并提交

shell 复制代码
# git rebase解决冲突
- 手动解决冲突,然后执行git add 或者git rm文件,然后再执行git rebase --contiue继续变基,
- 也可以直接git rebase --skip跳过这个commit
- 或者使用git rebase --abort放弃rebase。


git checkout master
git pull origin master  # 同步远程 master 到本地
git checkout mybranch # 上面的可以使用 git fetch origin master替换
git rebase master # 上面的可以使用git rebase origin/master 替换掉
git status
git add <file>
git rebase --continue
# 此时git status会被告知落后于自己的远程分支 忽略掉。因为本地分支的提交历史与远程分支的提交历史不同步
git push origin mybranch -f

merge的步骤

shell 复制代码
git checkout master
git pull origin master
git checkout mybranch # 上面的可以使用 git fetch origin master替换
git merge origin master # 上面的可以使用git pull origin master替换
git status
# 解决冲突
git add <file>
git push origin mybranch

git reset

shell 复制代码
# 文件在暂存区
git reset HEAD <file> # 将暂存区中的文件放回工作区,修改仍然还在工作区
# 文件在本地仓库
git reset --hard <commit id> # 将当前分支的指针强制重置到指定的 `<commit id>` 对应的版本,并彻底丢弃该版本之后的所有提交历史和修改。硬重置
git reset --soft <commit id> # 将当前分支指针重置到指定提交(`<commit id>`),但保留暂存区和工作区修改的命令。软充值
git reset --mixed <commit id> # 等同于 git reset <commit id>
# 将当前分支指针重置到指定提交(`<commit id>`),同时重置暂存区,但保留工作区的修改

git cherry-pick

选择性地将单个或多个提交(commit)"复制" 到当前分支的命令。它允许你从其他分支中挑选特定的提交,而不必合并整个分支,适用于仅需要部分修改的场景

shell 复制代码
git cherry-pick <commit id>
git cherry-pick <commit id1> <commit id2> # cherry-pick 1 2
git cherry-pick <commit id1>..<commit idn> # cherry-pick 1-8 不包含1
git cherry-pick <commit id1>^..<commit idn> # ^表示包含1  cherry-pick 1-8 

git status
git add <file>
git cherry-pick --continue # 继续完成 cherry-pick
git cherry-pick --abort # 放弃操作 回到操作前的状态
git push origin mubranch # 若目标分支是远程跟踪分支

git cherry-pick --quit # 中断

git stash

!NOTE

  • 把工作区中未提交的修改 (包括已暂存 git add 和未暂存的内容)临时 "储藏" 起来,让工作区恢复到最近一次提交(HEAD)的干净状态。
  • 后续可以在任何分支上恢复这些储藏的修改,继续之前的工作
  • git stash 不会储藏未跟踪的新文件 (即从未 git add 过的文件),若需储藏,需加上 -u
  • git stash -u # 储藏未跟踪文件(但不包括 .gitignore 忽略的文件)
shell 复制代码
git stash
git stash save "注释"
git stash pop
git stash apply stash@{n} # n 是储藏编号,如 stash@{0}(默认恢复最新的可省略编号)
git stash drop stash@{n}
git stash clear # 清楚全部栈中的内容
git stash list
git stash show stash@{n}
shell 复制代码
# 场景1 解决分支B的事情
# 当前分支A Bug分支B
git stash 
git checkout B
# 处理B的事务
git checkout A
git stash pop


# 场景2 代码开发完成了,准备提交 一般建议拉取一下远程的代码
git stash
git pull origin master
git stash pop
# 本地处理可能出现的冲突
git commit + git push

git checkout

shell 复制代码
# 快速撤销工作区中对指定文件的未提交修改,常用于放弃不需要的本地更改。使用时需注意,一旦执行,工作区的修改会被永久丢弃
git checkout -- <file> # 丢弃工作区中指定文件的修改

git checkout master # 切换分支
git checkout -b 
git checkout -b <新分支名> # 创建并切换到新分支上

!HEAD作用

  • HEAD~n 表示 "当前提交的前 n 个提交"(如 HEAD~1 是上一次提交,HEAD~2 是上上次)
  • HEAD^:等价于 HEAD~1,表示当前提交的第一个父提交(上一次提交)。
  • HEAD^^:等价于 HEAD~2,表示当前提交的上上次提交的上一次(即上上次)。
  • 以此类推,HEAD^n 等价于 HEAD~n(当提交只有一个父提交时)。
shell 复制代码
git reset --hard HEAD^ # 强制返回上一个父目录
符号 含义 适用场景 示例
HEAD~n 当前提交的第 n 个祖先(按第一代父提交追溯) 单父提交的线性历史,快速回退 n HEAD~3 表示上 3 次提交
HEAD^n n 个父提交(默认 n=1 处理合并提交(多父提交) HEAD^2 表示合并提交的第二个父提交
HEAD@{n} n 次操作前的 HEAD 状态 基于操作记录找回提交(如误操作后) HEAD@{1} 表示上一次操作后的状态
相关推荐
zxb@hny2 小时前
stm32 的isr向量位置问题,不然跑飞了,程序跑到异常地址,main都没进去
stm32·单片机·嵌入式硬件
_Power_Y2 小时前
Linux&git入门&设计模式(常考点)
linux·git·设计模式
m0_690780522 小时前
STM32各时钟的介绍,中断
stm32·单片机·嵌入式硬件
清钟沁桐2 小时前
mlir 编译器学习笔记之六 -- 经典实现
笔记·学习·mlir
权泽谦3 小时前
从0到1:基于STM32与FreeRTOS的智能家居中控系统设计实录
stm32·嵌入式硬件·智能家居
云山工作室3 小时前
基于单片机的智能家居窗帘控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·课程设计
xiaoxiaoxiaolll3 小时前
Nat Commun:中国团队演示光纤阵列中的里德堡阻塞,为高保真度两比特门奠定基础
学习·量子计算
zhangxuyu11184 小时前
Vue2 学习记录--语法部分
学习
下午见。4 小时前
深入理解C语言共用体/联合体(union):大小计算与大小端判断实战
c语言·笔记·学习