Git 工程常用指令
- [Git Bash](#Git Bash)
- 重要的参数
-
- HEAD、head和master
- commit
-
- [[commit 规范](https://github.com/zuopf769/how_to_use_git/blame/master/git commit 规范.md)](#commit 规范)
- [--amend --no-edit](#--amend --no-edit)
- [pull + push](#pull + push)
- 冲突
- 辨析
-
-
- [git add .和git add -A,git add -u区别](#git add .和git add -A,git add -u区别)
-
- [1. `git add .`](#1.
git add .) - [2. `git add -A`](#2.
git add -A)
- [1. `git add .`](#1.
- [merge 和 rebase 区别](#merge 和 rebase 区别)
- [pull 和 fetch 区别](#pull 和 fetch 区别)
-
- 问题记录
-
-
- [you have divergent branches](#you have divergent branches)
- [invalid change-id](#invalid change-id)
-
- 特殊场景
- [🔹 一、`git add .` vs `git add -A` vs `git add -u`](#🔹 一、
git add .vsgit add -Avsgit add -u) -
-
- [✅ 目标:把文件添加到索引(staging area)](#✅ 目标:把文件添加到索引(staging area))
-
- [1. `git add .`](#1.
git add .) - [2. `git add -A`](#2.
git add -A) - [3. `git add -u`](#3.
git add -u)
- [1. `git add .`](#1.
- [✅ 小结表格:](#✅ 小结表格:)
-
- [🔹 二、撤销暂存区中的文件(unstage)](#🔹 二、撤销暂存区中的文件(unstage))
-
-
- [✅ 场景 1:想从暂存区(index)移除某个文件(但仍保留在工作区)](#✅ 场景 1:想从暂存区(index)移除某个文件(但仍保留在工作区))
-
- [方法 1:`git restore --staged <file>`](#方法 1:
git restore --staged <file>) - [方法 2:`git reset HEAD <file>`(旧方式)](#方法 2:
git reset HEAD <file>(旧方式))
- [方法 1:`git restore --staged <file>`](#方法 1:
- [✅ 场景 2:删除仓库中已存在的文件(且已 commit),但不想让其继续存在](#✅ 场景 2:删除仓库中已存在的文件(且已 commit),但不想让其继续存在)
-
- [方法:`git rm --cached <file>`](#方法:
git rm --cached <file>) - 示例:
- [方法:`git rm --cached <file>`](#方法:
-
- [🔹 三、如何还原某个已提交的文件?](#🔹 三、如何还原某个已提交的文件?)
-
-
- [✅ 正确做法:`git checkout <commit_id> <file>`](#✅ 正确做法:
git checkout <commit_id> <file>) - [🚨 关于 Commit ID 的位数限制:](#🚨 关于 Commit ID 的位数限制:)
- [🔄 `git checkout` vs `git restore` (注意!命名冲突)](#🔄
git checkoutvsgit restore(注意!命名冲突))
- [✅ 正确做法:`git checkout <commit_id> <file>`](#✅ 正确做法:
-
- [🔹 四、回退到某个版本:`reset` vs `revert`](#🔹 四、回退到某个版本:
resetvsrevert) -
-
- [✅ 1. `git reset --hard <commit>`](#✅ 1.
git reset --hard <commit>) - [✅ 2. `git revert <commit>`](#✅ 2.
git revert <commit>)
- [✅ 1. `git reset --hard <commit>`](#✅ 1.
- [🔹 五、`git reset --soft origin/master` 是做什么的?](#🔹 五、
git reset --soft origin/master是做什么的?) - [🔹 六、`git commit --amend --no-edit`](#🔹 六、
git commit --amend --no-edit) - [🔹 七、`git merge` vs `git rebase`](#🔹 七、
git mergevsgit rebase) -
- [✅ `git merge` 示例(标准流程)](#✅
git merge示例(标准流程)) - [✅ `git rebase` 示例(重构历史)](#✅
git rebase示例(重构历史))
- [✅ `git merge` 示例(标准流程)](#✅
- [🔹 八、`git pull` vs `git fetch`](#🔹 八、
git pullvsgit fetch) - [🔹 九、常用高级命令(推荐掌握)](#🔹 九、常用高级命令(推荐掌握))
- [✅ 总结与建议](#✅ 总结与建议)
- [🎯 学习建议(实战路线)](#🎯 学习建议(实战路线))
- [🧩 附录:经典图示(帮助记忆)](#🧩 附录:经典图示(帮助记忆))
- 流程范式:------❤️
-
Git Bash
git客户端升级至2.26及以上版本
git流程

重要的参数
HEAD、head和master
HEAD在 Git 中表示当前 活动分支 的最新提交- 每个分支(如
main、feature等)在 Git 中本质上是一个指向特定 提交 的引用,而HEAD则指向当前活动的分支例如: - 如果你在
main分支上工作,HEAD就指向main分支的最新提交。 - 如果你在
feature分支上工作,HEAD就指向feature分支的最新提交
commit
commit 规范
- feat: 新功能
- fix: 修复问题
- docs: 修改文档
- style: 修改代码格式,不影响代码逻辑
- refactor: 重构代码,理论上不影响现有功能
- perf: 提升性能
- test: 增加修改测试用例
- chore: 修改工具相关(包括但不限于文档、代码生成等)
- deps: 升级依赖
--amend --no-edit
git commit --amend:会打开编辑器让您修改提交信息git commit --amend --no-edit:保持提交信息不变,仅修改提交内容(git commit --amend:- 使用
git commit --amend来覆盖修正上一次的提交,相当于上次提交错误的信息被覆盖 了,在gitk图形化界面和git log上都看不到之前的信息 - 在
git commit时绑定了错误的icafe或者commit信息需要修改时,如果还没有push到远端 ,可直接使用git commit --amend --message="修改后的message"来修改提交信息
- 使用
pull + push
相同的才会覆盖,不同的直接新建了
完整命令
-
完整的推------拉命令
git push origin 本地分支:远程分支
git pull origin 远程分支:本地分支 -
缺省参数
git push origin master
如果远程分支被省略,如上则表示将本地分支
git push origin master:refs/for/master
是将本地的master分支推送到远程主机origin上的对应master分支
git push origin HEAD:refs/for/master
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针
"refs" 并非是缩写,它代表 "references"(引用)的意思。在 Git 里,引用是指向提交对象的指针,比如远程分支 origin/master 的完整引用路径是 refs/remotes/origin/master
所以 其实两个都是代表的指针了!!!
gitp
gitp配置为git push origin HEAD:refs/for/master 的别名
- 打开你的终端。
- 输入命令
git config --list来列出所有配置的别名。 - 在输出的列表中查找
gitp相关的配置。
冲突
到底哪些操作会导致Git合并冲突呢
不同分支修改了同一文件的同一行代码才会产生冲突,但是有一个例外:不同分支修改的是同一文件的相邻行
或者
多个分支修改了同一个文件的名称 ,如果两个分支中分别修改了不同文件中的部分,是不会产生冲突,直接合并即可
有些相邻甚远的地方,git是可以smart merge
但是
有的还得自己做决定ing:
<<<<<<<=======>>>>>>>

<<<<<<<和====== 之间的所有内容都是你的本地修改。 这些修改还没有在远程版本库中 =======和>>>>>>>之间的所有行都是来自远程版本库或另一个分支的修改。现在你需要研究这两个部分并做出决定。
辨析
git add .和git add -A,git add -u区别
git提交都需要 都需要切换到更目录去操作
1. git add .
- 功能:跟踪工作区中所有已修改的文件,并将它们添加到暂存区
- 适用场景 :
- 当你希望提交所有已修改的文件(包括新增文件)时使用
- 不包括已被删除的文件
- 说明 :
.表示当前目录及子目录中的所有文件- 该命令会监控工作区的状态树,将所有修改过的文件提交到暂存区,但不包括被删除的文件
2. git add -A
- 功能 :跟踪工作区中所有已修改的文件(包括新增和删除的文件),并将它们添加到暂存区。
- 适用场景 :
- 当你希望提交所有类型的改动(包括新增和删除的文件)时使用。
- 说明 :
-A是--all的缩写,表示跟踪所有文件。- 该命令是
git add .和git add -u的合集,既包括新增文件,也包括被删除的文件。
merge 和 rebase 区别
不懂!!!!!
合并(Merge): 这是默认操作。Git 将合并远程分支的更改到你的本地分支,创建一个新的合并提交。你可以使用 --no-rebase 选项来明确指定这个操作
变基(Rebase): 这将把你的本地提交"移动"到远程分支的最新提交之后。这可以使提交历史保持线性,但可能会导致冲突。你可以使用 --rebase 选项来明确指定这个操作
pull 和 fetch 区别
问题记录
you have divergent branches
invalid change-id
特殊场景
两类
Gerrit的那种评审分支
git工作流gitflow
精准分享关键代码
#L行号
#L开始行号-L结束行号
🔹 一、git add . vs git add -A vs git add -u
✅ 目标:把文件添加到索引(staging area)
1. git add .
bash
git add .
- 添加当前目录下所有新文件、修改过的文件(包括未跟踪的文件)
- 不包含被删除的文件
💡 类比:
git add *会忽略隐藏文件,.gitignore文件也不会被加进去
✅ 适合场景:
- 刚创建了一些新文件 + 修改了部分内容,全部加入暂存区
- 确保所有改动都准备好提交
2. git add -A
bash
git add -A
- 添加/移除/修改的所有内容 ------ 相当于
add+rm - 包括:
- 新增文件(untracked)
- 修改文件(modified)
- 删除文件(deleted)👉 这是重点!
⚠️ 注意:如果之前删掉了文件,只用 git add . 不会把这个删除动作记入暂存区!
✅ 适合场景:
- 你要一次性把所有变化(新增、修改、删除)都加进暂存区
- 准备一次完整提交
3. git add -u
bash
git add -u
- 只添加 已跟踪文件的更改(modified + deleted)
- 忽略未跟踪文件(new files)
✅ 适合场景:
- 已经有大量未跟踪文件,不想提交它们
- 你想只更新已有文件,不加入新文件
✅ 举例说明:
bash# 假设你做了以下操作: touch new_file.txt # 新建了一个文件 echo "hello" > main.py # 修改了 main.py rm old_file.txt # 删除了一个文件 git add . → 只加 main.py 和 new_file.txt(不加删除) git add -A → 加 main.py, new_file.txt, 删除 old_file.txt git add -u → 加 main.py 和 删除 old_file.txt(不加 new_file.txt)
✅ 小结表格:
| 命令 | 跟踪文件 | 未跟踪文件 | 删除文件 |
|---|---|---|---|
git add . |
✅ | ✅ | ❌ |
git add -A |
✅ | ✅ | ✅ |
git add -u |
✅ | ❌ | ✅ |
⚠️ 建议:日常使用推荐
git add -A或git add .,除非特别需要控制范围。
🔹 二、撤销暂存区中的文件(unstage)
你现在有两个常见需求:
✅ 场景 1:想从暂存区(index)移除某个文件(但仍保留在工作区)
方法 1:git restore --staged <file>
bash
git restore --staged file.txt
✅ 推荐方式(较新版本 Git 支持)
方法 2:git reset HEAD <file>(旧方式)
bash
git reset HEAD file.txt
- 把指定文件从 index 移除,回到工作区状态
⚠️ 注意:
git reset默认是--mixed模式(即保留工作区)
✅ 场景 2:删除仓库中已存在的文件(且已 commit),但不想让其继续存在
比如你提交了 .env 文件,后来发现不应该上传:
方法:git rm --cached <file>
bash
git rm --cached secret.txt
- 从缓存中删除该文件(不会删除本地文件)
- 之后你需要
git commit来提交这次删除
示例:
bash
# 删除文件,但保留本地副本
git rm --cached config.json
# 提交删除
git commit -m "Remove config.json from repo"
# 如果你还想永久清除它(防止未来恢复)
git push origin main
✅ 补充:如果你不小心 push 了不该有的文件,可以用
git filter-branch清除历史(慎用❗)
🔹 三、如何还原某个已提交的文件?
你问到了:
"去掉仓库中已经 commit 到的文件用
git checkout指定的 commitid 文件名?这里的 commitid 有位数限制吗?"
✅ 正确做法:git checkout <commit_id> <file>
示例:
bash
git checkout b3a8f2d5 src/utils.py
- 把
src/utils.py恢复到b3a8f2d5那个版本 - 只影响这个文件,不影响其他文件
- 不会改变当前分支
✅ 前提:必须知道那个 commit ID
🚨 关于 Commit ID 的位数限制:
- Git 的 commit ID 是 SHA-1 哈希值(40 位十六进制)
- 你可以用 前7~10 位作为缩写(只要唯一即可)
✅ 例如:
bash
git show a1b2c3d # 能识别出唯一的一个 commit
👉 最好用
git log --oneline查看简短 hash
🔄 git checkout vs git restore (注意!命名冲突)
| 命令 | 功能 | 特点 |
|---|---|---|
git checkout <commit> <file> |
把某个文件恢复到之前的版本 | 旧版语法,仍在支持 |
git restore --source=<commit> <file> |
同上,更现代 | 推荐! |
✅ 推荐使用
git restore(Git ≥ 2.23)
🔹 四、回退到某个版本:reset vs revert
这是最常见的误区!
| 操作 | 是否重建历史 | 影响哪些人 | 使用场景 |
|---|---|---|---|
git reset --hard <commit> |
✅ 破坏性 | 所有人受影响 | 本地开发,误提交 |
git revert <commit> |
❌ 安全 | 所有人都能拉取 | 修复线上 bug |
✅ 1. git reset --hard <commit>
bash
git reset --hard b3a8f2d5
- 把当前分支指针指向
b3a8f2d5 - 所有后面的 commit 都被物理删除
- 工作区和暂存区也同步更改
- ✅ 适用于本地开发,没 push 时
⚠️ 重要提醒:不要对远程分支用
reset --hard!
✅ 2. git revert <commit>
bash
git revert b3a8f2d5
- 创建一个新的 commit,内容是"反向应用 b3a8f2d5"
- 安全!不会破坏历史
- ✅ 用于生产环境修复错误
✅ 举例:
bash# 假设你提交了一个错代码 git log # commit 1: bad code # commit 2: good code git revert 1 # 创建一个"撤销 1"的 commit
💡
revert是"做逆操作",不是"删除"。
🔹 五、git reset --soft origin/master 是做什么的?
你可能打错了,应该是:
bashgit reset --soft origin/master或者:
bashgit reset --soft HEAD~1
解释:
--soft:只移动 HEAD 指针,暂存区和工作区不变origin/master:远程分支的最新 commit
✅ 实际作用:
bash
git reset --soft origin/master
- 把当前分支的 HEAD 指针移到
origin/master - 所有本地更改仍然在暂存区或工作区(你还能重新提交)
- 常用于:放弃本地提交,但保留代码
💡 举个例子:
- 你写了两个 commit,但还没 push
- 你想"忘记"这两个 commit,但保留代码
git reset --soft HEAD~2→ 你的代码还在,git add重新提交即可
🔹 六、git commit --amend --no-edit
作用:
- 修改上次提交的内容(比如补错、改 message)
--no-edit:保持原 message 不变
✅ 举例:
bashgit add fix.txt git commit --amend --no-edit
- 把
fix.txt添加到最近一次 commit 中 - commit ID 不变(因为只是补充内容)
- 不能用于修改已 push 的提交(否则导致冲突)
⚠️ 注意:只能对最后一次提交操作
🔹 七、git merge vs git rebase
这是分支管理中最核心的概念之一。
| 特性 | git merge |
git rebase |
|---|---|---|
| 合并方式 | 产生一个"合并 commit" | 把你的 commit"挪到"目标分支后面 |
| 历史是否干净 | ❌ 有多个分支线 | ✅ 更线性、清晰 |
| 是否修改历史 | ❌ 不改 | ✅ 会改(需谨慎) |
| 适用场景 | 团队协作、公开分支 | 个人分支、本地开发 |
✅ git merge 示例(标准流程)
bash
git checkout feature
git merge main # 合并 main 分支到 feature
- 生成一个"合并提交"
- 历史像一棵树
✅ git rebase 示例(重构历史)
bash
git checkout feature
git rebase main
- 把
feature上的所有 commit 都"重新播放"在main的最新基础上 - 像一条直线
💡 优点:分支历史干净,便于阅读
⚠️ 危险:如果已经 push 过去了,再 rebase 会导致其他人 pull 失败
🔹 八、git pull vs git fetch
| 命令 | 行为 | 是否自动合并 |
|---|---|---|
git fetch |
拉取远程分支信息,不改变本地分支 | ❌ |
git pull |
fetch + merge,自动合并 |
✅ |
✅ 推荐先用
fetch,再手动merge或rebase,避免意外冲突
建议流程:
bash
git fetch origin # 获取远程最新状态
git checkout main
git rebase origin/main # 把本地分支基于远程更新
🔹 九、常用高级命令(推荐掌握)
| 命令 | 用途 | 示例 |
|---|---|---|
git log --oneline --graph |
查看带图的提交历史 | git log --oneline --graph |
git reflog |
查看所有 HEAD 变化(可找回被 reset 的 commit) | git reflog |
git cherry-pick <commit> |
把某次 commit 应用到另一个分支 | git cherry-pick abcdef |
git stash |
临时保存未提交的更改 | git stash / git stash pop |
git branch -D <name> |
强行删除分支(含未合并的) | git branch -D feature |
git tag v1.0 |
给某个 commit 打标签 | git tag v1.0 |
✅ 总结与建议
| 问题 | 回答 |
|---|---|
git add . vs -A vs -u |
<A> 万能;-u 仅改已有文件;. 一般情况足够 |
| 如何 unstage 文件? | git restore --staged file 或 git reset HEAD file |
| 如何删除已 commit 的文件? | git rm --cached file + git commit |
| 如何恢复旧版本文件? | git checkout <commit> file |
| commit ID 最少几位? | 7 位以上(保证唯一) |
| 如何回退? | reset --hard(危险) or revert(安全) |
reset --soft 作用? |
移动HEAD,保留工作区和暂存区 |
amend --no-edit |
补充最后提交内容,ID不变 |
merge vs rebase |
merge 安全,rebase 干净 |
pull vs fetch |
pull = fetch + merge,推荐分开用 |
🎯 学习建议(实战路线)
- 每天练习 1 个命令 (如
git reset,git rebase) - 用一个测试项目模拟多人协作(自己 fork 自己)
- 故意制造错误,然后用 Git 修复(比如误删文件、搞乱 history)
- 画图理解 HEAD / branch / commit
🧩 附录:经典图示(帮助记忆)
A---B---C (main)
\
D---E (feature)
git merge feature → 产生 F(合并)
git rebase main → D', E' 在 C 后面,变成直线
🎁 最后送你一句口诀:
"
git add -A万能,git reset --hard要小心,revert安全,rebase美观。"
如果你愿意,我可以给你设计一个 Git 小项目练习计划 ,从 clone 到 PR 完整走一遍!也可以分享一些 避坑指南(比如:别在 shared branch 上 rebase 😅)
欢迎继续提问~
流程范式:------❤️
① 切换主开发分支(假设名称是develop),拉取最新代码
git checkout develop
git pull
② 切换个人开发分支(假设名称是feat_gcx),合并最新代码
git checkout feat_gcx
git branch (这步可有可无,确认一下是否切过来了)
git merge develop
③ 若没有冲突,可以直接推到远程仓库
git push
④ 若有冲突,则先把冲突部分删除,再进行提交
git add -A
git commit -a -m "XXX"
git push
⑤ 开启劳累的一天
⑥ 提交代码,和4步骤一模一样。
# 第一次提交 CR
git add .
git commit -m "feedas-123"
git push origin HEAD:refs/for/master
# 第二次提交 CR
git add .
git commit --amend --no-edit
// git commit --amend -m "修改的信息"
git push origin HEAD:refs/for/master