git 的 .gitignore 规则文件 、git restore 、 git reset

# 创建 .gitignore 规则文件:在 git 仓的根目录下若无则新建 .gitignore 规则文件:
touch .gitignore

# 编辑 .gitignore 并 commit 它,使之生效。


# .gitignore 规则编辑时注意事项:
# 1. 所有的注释只能是独占单行注释,不能在有效代码后注释!否者不生效!比如错误示范:
#    实例: MDK/ #忽略MDK目录下所有内容 (跟在有效代码后注释,非法!!!)
# 2. 注意务必使用 UTF-8 编码格式去编辑 .gitignore 文件。

# .gitignore 使用小提示:
# 1. 提前准备好 .gitignore 文件,再 git init 创建仓,.gitignore规则直接生效;
# 2. 删除MDK下已跟踪的信息:git rm --cached MDK/ -r
# 3. 根据文件夹的排他性,比如.o文件,可以比较检测前后变化,定位变动的.o文件;

# 忽略所有.o文件
*.o

# 忽略MDK目录下所有内容
MDK/

.gitignore” 规则只对未跟踪的文件有效,对已跟踪的文件无效。

# 若已存在想忽略但已经被跟踪的文件,则可以:
# 1. 编辑 .gitignore 文件,添加新的忽略规则

# 2. 从 Git 中移除已跟踪的对象,比如 debian/binary
git rm -r --cached debian/binary/

# 提交更改
git commit -m "忽略 debian/binary 目录"

1. .gitignore 的“管辖范围”是固定的

Git 官方文档对 .gitignore 的定义非常明确:它只作用于未被跟踪的文件

  • 当一个文件被 git add 并提交后,它的元数据(inode、路径)就永久记录在了 Git 的对象数据库中。

  • 之后 .gitignore 里的规则,在 Git 看来属于“事后提醒”,但 Git 会回答:“对不起,这个文件我认识,它已经是我的资产了,我不能无视它的变化。”

2. git rm --cached 执行后的状态变化

你提到的 git rm --cached 是标准的“请出去”操作,执行后状态会如下:

状态执行前 (.arts/ 已被跟踪)执行 git rm --cached .arts/ 后提交后
Git 索引/暂存区有记录删除了无记录
工作区 (本地磁盘)文件存在文件依然存在(不会被物理删除)文件依然存在
Git 是否继续提示变更修改会显示 modified不再提示(因为被 .gitignore 命中了)彻底消失于版本库

Git 的优先级其实很简单:

tracked(已跟踪)> .gitignore > untracked(未跟踪)

           文件是否已被 Git 跟踪?
          /                     \
         是                     否
         ↓                      ↓
   .gitignore 无效         .gitignore 是否匹配?
   始终显示修改               /          \
                            是          否
                            ↓           ↓
                       忽略不提示    提示为未跟踪

你的 .arts/ 文件已经在第一个 commit 里被跟踪了,所以 .gitignore 对它们就是无效的.gitignore 的职责只有一个:git add 时,自动跳过匹配的未跟踪文件。它不对已跟踪文件产生任何作用。

打个比方:

  • 已跟踪的文件就像 Git 已经认识的人 — 不管他穿什么衣服(修改了什么),Git 都会注意到
  • .gitignore 像门口保安,只拦住还没进来的人(未跟踪文件)
  • 保安不会把已经坐在屋里的人赶出去

所以只需要 git rm --cached 把他们"请出去"(从跟踪列表删除),之后再 .gitignore 就能拦住他们了。

💎 总结一句话

你的认知完全正确:已经进门的(已跟踪),保安(.gitignore)管不着;得先请出去(git rm --cached),保安才会拦住它。

git ignore 语法规则

Pattern Syntax

Here are some common patterns and how they match:

PatternExplanation/MatchesExamples
Blank lines are ignored
text commentLines starting with # are ignored
nameAll name files, name folders, and files and folders in any name folder/name.log
/name/file.txt
/lib/name.log
name/Ending with / specifies the pattern is for a folder. Matches all files and folders in any name folder/name/file.txt
/name/log/name.log

no match:
/name.log
name.fileAll files with the name.file/name.file
/lib/name.file
/name.fileStarting with / specifies the pattern matches only files in the root folder/name.file

no match:
/lib/name.file
lib/name.filePatterns specifiing files in specific folders are always realative to root (even if you do not start with / )/lib/name.file

no match:
name.file
/test/lib/name.file
**/lib/name.fileStarting with ** before / specifies that it matches any folder in the repository. Not just on root./lib/name.file
/test/lib/name.file
**/nameAll name folders, and files and folders in any name folder/name/log.file
/lib/name/log.file
/name/lib/log.file
/lib/**/nameAll name folders, and files and folders in any name folder within the lib folder./lib/name/log.file
/lib/test/name/log.file
/lib/test/ver1/name/log.file

no match:
/name/log.file
*.fileAll files withe .file extention/name.file
/lib/name.file
*name/All folders ending with name/lastname/log.file
/firstname/log.file
name?.file? matches a single non-specific character/names.file
/name1.file

no match:
/names1.file
name[a-z].file[range] matches a single character in the specified range (in this case a character in the range of a-z, and also be numberic.)/names.file
/nameb.file

no match:
/name1.file
name[abc].file[set] matches a single character in the specified set of characters (in this case either a, b, or c)/namea.file
/nameb.file

no match:
/names.file
name[!abc].file[!set] matches a single character, except the ones spesified in the set of characters (in this case a, b, or c)/names.file
/namex.file

no match:
/namesb.file
*.fileAll files withe .file extention/name.file
/lib/name.file
name/
!name/secret.log
! specifies a negation or exception. Matches all files and folders in any name folder, except name/secret.log/name/file.txt
/name/log/name.log

no match:
/name/secret.log
*.file
!name.file
! specifies a negation or exception. All files withe .file extention, except name.file/log.file
/lastname.file

no match:
/name.file
*.file
!name/*.file
junk.*
Adding new patterns after a negation will re-ignore a previous negated file
All files withe .file extention, except the ones in name folder. Unless the file name is junk
/log.file
/name/log.file

no match:
/name/junk.file

Git Restore 与 Reset --Hard 核心区别

二者都可以丢弃修改,但影响范围和操作层级不同:

对比项git restoregit reset --hard
作用目标工作区/暂存区工作区/暂存区/​提交历史
安全级别相对安全⚠️ ​高危操作
影响范围单个文件/指定路径整个项目
历史修改不改变提交历史改变提交历史
HEAD位置保持不动HEAD指针移动

🧩 1. git restore (现代安全方式)

# 丢弃工作区所有未暂存的修改
git restore .

# 丢弃暂存区的修改(保留工作区修改)
git restore --staged <file>

# 同时丢弃工作区+暂存区修改
git restore --worktree --staged <file>
  • 定位​:精细控制,仅作用于文件层级
  • 特点​:不动历史提交,不改变HEAD指针
  • 适用场景​:撤消本地未提交的修改

💥 2. git reset --hard (强力清除)

# 丢弃所有未提交的修改(工作区+暂存区)
git reset --hard

# 重置到指定提交(丢弃后续所有提交)
git reset --hard commit_id
  • 定位​:原子级清除,影响整个仓库状态
  • 特点​:会改变提交历史,移动HEAD指针
  • 危险点​:永久删除未提交的代码和未推送的提交

⚖️ 使用场景决策树

🚨 重要提示

  1. 执行 reset --hard ​前务必确认​:
    git status # 查看将被删除的内容
  2. 已推送的提交避免使用 reset --hard,会破坏团队协作历史
  3. 推荐使用 git restore 替代旧版 git checkout --

📌 ​黄金法则​:日常修改丢弃用 restore,历史版本回退用 reset --hard + 指定commit

同时将本地仓库推送到 GitHub 和 Gitee(码云)

  1. 查看当前远程配置

    git remote -v
  2. 添加多个远程仓库

    # 添加 Gitee
    git remote add gitee https://gitee.com/mapleay/display_-ic_-demo_-stm32-h743-iit6-ltdc_from-scratch.git
    
    # 添加 GitHub
    git remote add github https://github.com/your_username/your_repo.git
    
    #日常同步推送(两种方式)
    git push gitee main
    git push github main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值