Git 工程指引(命令+问题)

Git 工程常用指令

  • [Git Bash](#Git Bash)
  • 重要的参数
  • 冲突
  • 辨析
      • [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)
      • [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 . vs git add -A vs git 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)
    • [✅ 小结表格:](#✅ 小结表格:)
  • [🔹 二、撤销暂存区中的文件(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>(旧方式))
      • [✅ 场景 2:删除仓库中已存在的文件(且已 commit),但不想让其继续存在](#✅ 场景 2:删除仓库中已存在的文件(且已 commit),但不想让其继续存在)
        • [方法:`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 checkout vs git restore (注意!命名冲突))
  • [🔹 四、回退到某个版本:`reset` vs `revert`](#🔹 四、回退到某个版本:reset vs revert)
      • [✅ 1. `git reset --hard <commit>`](#✅ 1. git reset --hard <commit>)
      • [✅ 2. `git revert <commit>`](#✅ 2. git revert <commit>)
    • [🔹 五、`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 merge vs git rebase)
      • [✅ `git merge` 示例(标准流程)](#✅ git merge 示例(标准流程))
      • [✅ `git rebase` 示例(重构历史)](#✅ git rebase 示例(重构历史))
    • [🔹 八、`git pull` vs `git fetch`](#🔹 八、git pull vs git fetch)
    • [🔹 九、常用高级命令(推荐掌握)](#🔹 九、常用高级命令(推荐掌握))
    • [✅ 总结与建议](#✅ 总结与建议)
    • [🎯 学习建议(实战路线)](#🎯 学习建议(实战路线))
    • [🧩 附录:经典图示(帮助记忆)](#🧩 附录:经典图示(帮助记忆))
    • 流程范式:------❤️

Git Bash

git客户端升级至2.26及以上版本

git流程

重要的参数

HEAD、head和master

  • HEAD 在 Git 中表示当前 活动分支 的最新提交
  • 每个分支(如 mainfeature 等)在 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 的别名

  1. 打开你的终端。
  2. 输入命令git config --list来列出所有配置的别名。
  3. 在输出的列表中查找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

git 您有偏离的分支,需要指定如何调和它们

git 提交冲突

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 -Agit 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 是做什么的?

你可能打错了,应该是:

bash 复制代码
git reset --soft origin/master

或者:

bash 复制代码
git 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 不变

✅ 举例:

bash 复制代码
git 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,再手动 mergerebase,避免意外冲突

建议流程:

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 filegit 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. 每天练习 1 个命令 (如 git reset, git rebase
  2. 用一个测试项目模拟多人协作(自己 fork 自己)
  3. 故意制造错误,然后用 Git 修复(比如误删文件、搞乱 history)
  4. 画图理解 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
相关推荐
帅得不敢出门3 小时前
精简Android SDK(AOSP)的git项目提高git指令速度
android·java·开发语言·git·elasticsearch
TG:@yunlaoda360 云老大3 小时前
阿里云国际站代理商RPA跨境服务的适用场景有哪些?
大数据·阿里云·rpa
微盛企微增长小知识3 小时前
2025企业微信服务商测评:头部服务商微盛AI·企微管家技术实力与落地效果解析
大数据·人工智能·企业微信
郑州光合科技余经理3 小时前
海外版生活服务系统源码 | 外卖+跑腿一站式平台技术解析
java·开发语言·javascript·git·spring cloud·php·生活
eggrall3 小时前
《Git 入门:从 0 到 1 玩转 Gitee 仓库》 一
git·gitee
TMO Group 探谋网络科技4 小时前
AI电商的应用:Magento 使用 Adobe 生成式 AI改造7大业务场景
大数据·人工智能·adobe·ai
UI设计兰亭妙微4 小时前
理性数据,温柔体验:北京兰亭妙微解码 Hydra Corps. 企业管理界面的 “松弛感设计”
大数据·人工智能·用户体验设计
慎独4134 小时前
家家有:从单向支出到价值循环,绿色积分如何 重构商业逻辑?
大数据·人工智能
梦里不知身是客114 小时前
flink使用 DefaultResourceCalculator(默认资源计算器) 策略
大数据·flink