Files

279 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Git 基础知识
Git 是一个版本控制工具。它可以记录文件夹在不同时间点的状态,让我们知道改了什么、什么时候改的,也可以把本地内容同步到 GitHub 这样的远程仓库。
## 三个核心位置
`工作区 workspace`
你平时直接看到和编辑的真实文件夹,比如 Obsidian 里的 `.md` 笔记、图片、模板等。
`本地仓库 local repository`
工作区里有一个隐藏目录 `.git` 后,这个文件夹就成为 Git 本地仓库。`.git` 里保存提交历史、分支、远程地址等信息。
`远程仓库 remote repository`
放在 GitHub、Gitee 等平台上的仓库。比如:
```text
https://github.com/Ki5ter/Obsidian.git
```
本地仓库和远程仓库不是同一个东西。`commit` 只提交到本地,`push` 才会上传到远程。
## 常见概念
`stage/index 暂存区`
准备放进下一次提交的改动。可以理解为“这次 commit 我要带上的内容清单”。
`commit 提交`
一次本地快照。提交后,Git 会记住当前这批改动。
`branch 分支`
一条提交历史线。常见主分支名是 `main``master`
`remote/origin`
远程仓库地址的别名。通常把 GitHub 远程仓库命名为 `origin`
`push 推送`
把本地 commit 上传到远程仓库。
`pull 拉取`
从远程仓库下载最新改动,并合并到当前本地分支。
`fetch 获取`
只下载远程仓库信息,不自动合并。
`origin/master`
本地记录的远端 `origin``master` 分支的位置。它不是远端本身,而是本地上次获取到的远端状态。
## 基本工作流程
1. 打开工作区,也就是要纳入版本控制的文件夹。
2. 执行 `git init`,把文件夹初始化成本地 Git 仓库。
3. 配置远程仓库,也就是添加 `origin`
4. 修改、新增或删除文件。
5. 把改动加入暂存区。
6. 提交到本地仓库。
7. 推送到远程仓库。
对应命令:
```powershell
cd "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes"
git init
git remote add origin https://github.com/Ki5ter/Obsidian.git
git add .
git commit -m "Initial Obsidian notes backup"
git push -u origin main
```
如果当前分支叫 `master`,推送命令也可以是:
```powershell
git push -u origin master
```
## main 和 master
`main``master` 都可以作为主分支名。
现在 GitHub 新仓库通常默认使用 `main`,旧仓库或某些工具可能默认使用 `master`
把当前分支改名为 `main`
```powershell
git branch -M main
```
第一次推送并设置上游分支:
```powershell
git push -u origin main
```
`-u` 的意思是把本地分支和远程分支关联起来。设置过一次后,以后可以直接使用:
```powershell
git push
git pull
```
## origin、master 和 push
`origin` 是远端仓库地址的别名。它保存在本地 Git 配置里,不是 GitHub 天生的名字。
```powershell
git remote add origin https://github.com/Ki5ter/Obsidian.git
```
如果需要推送到多个远端,可以添加多个别名:
```powershell
git remote add backup https://example.com/backup.git
```
`master` 是分支名,也可以叫 `main``dev``notes`。分支可以理解为一个指向最新提交的指针。
```powershell
git push origin master
```
这条命令表示把本地 `master` 分支推送到 `origin` 远端。它不会自动推送其他本地分支。
第一次推送时常用:
```powershell
git push -u origin master
```
`-u` 会设置上游关系。之后在本地 `master` 分支上执行 `git push``git pull`Git 会自动使用 `origin/master`
## 常用检查命令
查看当前仓库状态:
```powershell
git status
```
查看当前分支:
```powershell
git branch
```
查看本地分支和远程分支关系:
```powershell
git branch -vv
```
查看远程仓库地址:
```powershell
git remote -v
```
查看提交历史:
```powershell
git log --oneline --decorate -5
```
查看某个路径是否被 ignore 命中:
```powershell
git check-ignore -v --no-index -- "密码本/任意测试文件.md"
```
查看某个路径是否还被 Git 跟踪:
```powershell
git ls-files -- "密码本" "服务器迁移"
```
## .gitignore 的作用
`.gitignore` 用来告诉 Git:哪些未被跟踪的新文件不要加入版本控制。
推荐把只在仓库根目录生效的目录写成:
```gitignore
/密码本/
/服务器迁移/
```
开头的 `/` 表示仓库根目录,结尾的 `/` 表示目录。
如果只写:
```gitignore
密码本
```
也能生效,但它会匹配仓库中任何位置名为 `密码本` 的文件或目录,不如 `/密码本/` 精确。
已经被 Git 跟踪过的文件不会因为加入 `.gitignore` 自动消失。需要执行:
```powershell
git rm --cached -r -- "目录或文件名"
```
这会从 Git 跟踪列表中移除文件,但保留本地实际文件。
## 清理历史中的敏感内容
如果敏感文件已经推送到远程仓库,只在最新提交中删除还不够,旧提交里仍然可能看到。
清理历史的思路是:重写本地提交历史,让每个相关提交都不再包含敏感路径,然后强制替换远端分支。
示例:
```powershell
git filter-repo --path "密码本/" --path "服务器迁移/" --invert-paths
git fetch origin
git push --force-with-lease origin master
```
`git filter-repo` 不是 Git 自带命令,需要单独安装。`--invert-paths` 表示反转路径选择:保留其他所有路径,移除 `--path` 指定的路径。
普通 `git push` 只允许向前追加提交。重写历史后,本地提交 ID 已经变化,远端会拒绝普通 push,因此需要:
```powershell
git push --force-with-lease origin master
```
`--force-with-lease``--force` 更安全。它会检查远端分支是否仍停在本地记录的位置;如果别人已经推送了新提交,它会拒绝覆盖。
敏感信息如果已经泄露过,清理 Git 历史只是补救之一。密码、Recovery Key、Token 等应视为已经泄露,优先更换或吊销。
## Obsidian 笔记库使用 Git 的注意事项
Obsidian 笔记库适合用 Git 备份,因为大多数内容都是 Markdown 文本文件。
建议提交:
```text
.md 笔记
图片、附件
模板
必要的 .obsidian 配置
```
谨慎提交:
```text
密码、密钥、Token
个人隐私内容
插件缓存
特别大的二进制文件
```
建议忽略:
```gitignore
/.obsidian/workspace*.json
/.obsidian/cache/
/.vs/
/密码本/
/服务器迁移/
```
`workspace*.json` 是 Obsidian 的窗口和布局状态,通常和具体电脑有关。`.vs/` 是 Visual Studio 本地缓存,也不适合提交。
如果笔记库在 OneDrive 里,要注意 `.git` 目录必须真实保留在本机。否则 Git 或 Visual Studio 可能会报错,例如:
```text
not a git repository
Permission denied
The cloud file provider is not running
```
处理方式是在资源管理器里右键笔记库文件夹,选择:
```text
始终保留在此设备上
```
重点是整个笔记库和 `.git` 目录都要保留在本机。