279 lines
7.0 KiB
Markdown
279 lines
7.0 KiB
Markdown
# 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` 目录都要保留在本机。
|
||
|