
配置
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 reset或rebase移除,也能通过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过的文件),若需储藏,需加上-ugit 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作用
- 用
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} 表示上一次操作后的状态 |