
The author thanks OpenAI0. 使用场景本文用于记录常见 Git 操作尤其适合以下情况本地有一个正式上传目录用于修改、commit、push本地还有一个试运行目录只想从 GitHub 拉取最新版并测试希望避免误操作导致测试文件、运行痕迹、notebook 自动修改等内容被 push 到 GitHub。本文中的路径和仓库地址均使用占位符WORK_DIR 本地工作目录 REPO_NAME 仓库文件夹名 REPO_URL GitHub 仓库地址 BRANCH 分支名例如 main示例cd WORK_DIR\REPO_NAME1. Git 的几个层级可以把 Git 理解成几层工作区 working tree ↓ git add 暂存区 staging area ↓ git commit 本地提交 commit ↓ git push 远端 GitHub对应关系如下状态含义是否上传 GitHub工作区改动文件被改了但还没准备提交没有暂存区已经git add准备进入 commit没有本地 commit已经保存成一个 Git 版本还没有除非 pushpush已经上传 GitHub是一句话改文件 ≠ commit commit ≠ push push 才是上传 GitHub2. 进入仓库进入本地仓库目录cd WORK_DIR\REPO_NAME例如cd D:\your\local\path\REPO_NAME3. 最常用检查命令3.1 查看当前状态简洁查看git status--short或者查看分支同步状态git status-sb常见输出解释M file.txt表示文件被修改了但还没有暂存。M file.txt表示文件已经暂存准备 commit。A new-file.txt表示新文件已经暂存。?? new-file.txt表示新文件还没有被 Git 跟踪。## main...origin/main表示本地 commit 和 GitHub 同步。## main...origin/main [ahead 1]表示本地比 GitHub 多 1 个 commit还没有 push。4. 查看改了哪些文件只看修改统计gitdiff--stat查看具体改动gitdiff查看某个文件的改动gitdiff--path/to/file.txt5. 查看已经暂存了什么如果已经执行过git add想看准备 commit 的内容gitdiff--cached--stat查看暂存区具体内容gitdiff--cached检查空白错误gitdiff--check检查暂存区空白错误gitdiff--cached--check6. 暂存文件准备 commit建议显式写文件名不要随便使用git add.更安全的方式是git add--file1.txt file2.txt path/to/file3.md如果是删除文件也可以使用git add-u但要注意git add -u会暂存所有已跟踪文件的修改和删除。7. 提交 commit提交前先检查git status--short gitdiff--cached--stat gitdiff--cached--check确认无误后提交git commit-mYour commit messagecommit 成功后只是保存在本地 Git 历史中还没有上传 GitHub。8. 判断 commit 有没有 push查看本地是否领先远端git status-sb如果看到## main...origin/main [ahead 1]说明本地有 1 个 commit 尚未 push。查看还没有 push 的 commitgit log--oneline origin/main..HEAD如果有输出例如abc1234 Update documentation说明这个 commit 还在本地没有上传。9. 上传 GitHubpush确认本地 commit 没问题后git push注意git push 只上传已经 commit 的内容。 未提交的工作区改动不会被 push。例如当前状态## main...origin/main [ahead 1] M temp-output.txt这时执行git push只会上传那个[ahead 1]的 commit不会上传temp-output.txt的未提交改动。10. 恢复不想要的本地改动如果看到M file.txt并且确认不要保留这个本地修改可以执行git restore--file.txt恢复后检查git status--short如果没有输出说明工作区干净。如果想恢复多个文件git restore--file1.txt path/to/file2.md11. clone 时提示目录已存在如果执行git clone REPO_URL出现fatal: destination path REPO_NAME already exists and is not an empty directory.说明当前路径下已经有一个非空的REPO_NAME文件夹。先进入该目录检查cd WORK_DIR\REPO_NAME git status-sb git remote-v如果看到origin REPO_URL (fetch) origin REPO_URL (push)说明它已经是目标 GitHub 仓库不需要重新 clone。如果只是想更新最新版应该进入已有仓库后执行 pull 或 fetch/reset而不是再次 clone。12. 拉取 GitHub 最新版12.1 普通拉取如果本地没有乱改可以执行git pull--ff-only推荐使用--ff-only它只允许快进合并不会自动生成额外的 merge commit。执行后检查git status-sb如果显示## main...origin/main说明本地和 GitHub 同步。13. 直接 git pull 会怎样假设当前状态是## main...origin/main M analysis/example.ipynb说明本地和远端 commit 同步但analysis/example.ipynb被本地修改过。这时如果直接执行git pull--ff-only可能出现两种情况。情况 AGitHub 最新版没有改到这个文件此时pull可能成功其他文件会更新但本地修改过的文件会继续保留。也就是说GitHub 新版能拉下来 本地修改文件不会被自动覆盖。情况 BGitHub 最新版也改到了这个文件此时pull通常会中止并提示本地改动可能被覆盖。Git 不会强行覆盖本地文件GitHub 新版内容也不会正常合并进当前工作区。一句话直接 git pull 不会自动覆盖本地修改。 如果远端也改了同一个文件pull 往往会中止。 想安全更新就先处理本地修改再 pull。14. 如果只想丢弃某一个文件的本地改动例如状态显示## main...origin/main M analysis/example.ipynb如果不想保留这个本地修改执行git restore--analysis/example.ipynb git pull--ff-only git status-sb如果最后显示## main...origin/main说明本地和 GitHub 已同步。15. 如果想保留本地文件备份再拉取如果不确定本地 notebook 或其他文件是否有用可以先复制备份。PowerShell 示例Copy-Item.\analysis\example.ipynb.\analysis\example.local-backup.ipynb然后恢复 Git 管理的原文件git restore--analysis/example.ipynb再拉取最新版git pull--ff-only这样原始的本地文件会被备份为analysis/example.local-backup.ipynb而 Git 仓库中的analysis/example.ipynb会恢复并更新为 GitHub 版本。一句话想保留本地文件先 Copy-Item 备份。 想丢弃本地修改直接 git restore。 想强制同步 GitHubgit fetch git reset --hard origin/main。16. 强制同步 GitHub 最新版如果某个目录只是用于拉取和试运行不需要保留本地修改可以使用git fetch origin git reset--hard origin/main git status-sb这会强制让本地已跟踪文件恢复到 GitHubmain的最新状态。注意git reset--hard origin/main会丢弃本地已跟踪文件的修改。例如M analysis/example.ipynb这种修改会被恢复为 GitHub 版本。这个操作适合试运行目录不建议在正式写作或开发目录中随便使用。17. 检查并清理未跟踪文件git reset --hard只恢复 Git 已跟踪的文件不会删除新生成的未跟踪文件。先预览将要删除的未跟踪文件git clean-fdn确认这些文件都不要后再执行git clean-fd注意git clean-fd会删除未被 Git 跟踪的新文件和新文件夹。执行前一定先用git clean-fdn预览。18. 试运行仓库与上传仓库隔离有时同一个 GitHub 仓库会在本地保留两个目录Upload/ 正式上传目录用于修改、commit、push 到 GitHub Run/ 试运行目录只用于拉取 GitHub 最新代码并测试运行这种情况下Run/不应该承担上传功能避免误操作导致测试文件、运行痕迹或 notebook 自动改动被 push 到 GitHub。核心原则是Upload 负责上传。 Run 负责试运行。 Run 可以拉取最新版但尽量禁止 push。19. 让试运行目录可以 pull但不能 push如果希望试运行目录能继续从 GitHub 拉取最新版但禁止误 push可以修改 push 地址cd WORK_DIR\Run git remoteset-url--push origin DISABLED_PUSH_URL git remote-v之后应该看到类似origin REPO_URL (fetch) origin DISABLED_PUSH_URL (push)这样仍然可以正常拉取git pull--ff-only但如果误执行git pushpush 会失败因为 push 地址已经不是 GitHub 仓库地址。这是试运行目录最推荐的保护方式。20. 恢复试运行目录的 push 地址如果以后确实需要让这个目录重新具备 push 能力可以恢复 push 地址git remoteset-url--push origin REPO_URL git remote-v如果看到origin REPO_URL (fetch) origin REPO_URL (push)说明 push 地址已经恢复。不过建议正式上传仍然只在Upload/目录中进行。21. 让运行目录彻底脱离 Git如果某个目录以后只用于运行不需要继续pull或push可以删除.git。PowerShellcd WORK_DIR\RunRemove-Item-Recurse-Force.git删除.git后该目录就不再是 Git 仓库。之后这些命令都会失效git status git pull git push优点是绝对不会误上传。缺点是以后不能在该目录中直接拉取最新版只能重新 clone 或重新复制代码。22. 推荐固定工作流如果本地有两个目录Upload/ 正式上传目录 Run/ 试运行目录推荐分工如下Upload/ 可以修改、git add、commit、push Run/ 只允许 fetch、pull、reset不允许 push第一次配置试运行目录时执行cd WORK_DIR\Run git remoteset-url--push origin DISABLED_PUSH_URL git remote-v以后更新试运行目录时执行cd WORK_DIR\Run git fetch origin git reset--hard origin/main git status-sb这样Run/始终保持为 GitHub 最新代码的本地测试副本而正式修改和上传只在Upload/中完成。23. 常用完整流程情况 A已经 commit只需要 pushcd WORK_DIR\REPO_NAME git status-sb git log--oneline origin/main..HEAD git push git status-sb看到[ahead 1]就说明有本地 commit 没 push。情况 B改完但没 commit需要手动提交cd WORK_DIR\REPO_NAME git status--short gitdiff--stat gitdiff--check确认只改了预期文件后git add--file1.txt file2.md git status--short gitdiff--cached--stat gitdiff--cached--check git commit-mYour commit messagegit push情况 C有不想提交的本地改动例如M temp-output.txt M analysis/example.ipynb如果确认不要保留git restore--temp-output.txt analysis/example.ipynb恢复后检查git status--short情况 D试运行目录想更新到 GitHub 最新版cd WORK_DIR\Run git fetch origin git reset--hard origin/main git status-sb如果想顺便清理未跟踪文件先预览git clean-fdn确认不要后再清理git clean-fd24. 不建议随便提交的内容一般不要随便提交临时运行结果 大型原始数据 自动生成的缓存文件 编辑器自动配置文件 notebook 自动执行计数变化 日志文件 无关图片或中间结果除非明确知道它们就是本轮任务要提交的内容。更安全的提交方式永远是git add--明确文件1 明确文件2 明确文件3不要偷懒git add.git add .容易把不该提交的文件一起加进去。25. 关键判断口诀git status --short看有没有本地文件改动。git status -sb看本地 commit 有没有领先远端。[ahead 1]说明有 1 个 commit 还没 push。git log --oneline origin/main..HEAD查看哪些 commit 还没上传。git push只上传 commit不上传未提交改动。git add .慎用容易把无关文件一起加进去。git pull不会自动覆盖本地修改。git fetch git reset --hard origin/main适合试运行目录强制同步 GitHub 最新版。git remote set-url --push origin DISABLED_PUSH_URL适合让试运行目录可以拉取但不能误 push。26. 最后总结最安全的本地分工是Upload/ 正式上传目录 Run/ 试运行目录正式上传目录可以修改 可以 git add 可以 commit 可以 push试运行目录只用于拉取最新版 只用于测试运行 不保留本地修改 禁止 push推荐固定策略cd WORK_DIR\Run git remoteset-url--push origin DISABLED_PUSH_URL以后更新试运行目录git fetch origin git reset--hard origin/main git status-sb一句话Upload 负责上传。 Run 负责试运行。 Run 可以拉取最新版但禁止 push。