FAQ Library
全部常见问题
把首页里的高频问答整理成一页更完整的 Git FAQ,方便集中阅读和后续持续扩充。
pull 与同步
`git pull` 会先执行 fetch,再把上游分支整合进当前分支。官方文档说明它可以走 `--ff-only`、`--rebase`、`--no-rebase` 或 `--squash` 等不同路径,所以结果取决于你的命令参数和 `pull.rebase`、`pull.ff` 等配置。想减少意外,最稳妥的习惯仍然是先 fetch,再明确决定是 merge 还是 rebase。
官方手册把区别讲得很明确:`--soft` 只移动 HEAD,保留暂存区和工作区;`--mixed` 会把暂存区重置到目标提交,但保留工作区改动;`--hard` 会同时改写 HEAD、暂存区和工作区。也就是说,真正危险的是 `--hard`,因为它会直接覆盖当前文件状态。
reset 与恢复
很多时候可以。Git 官方在 `git reset` 文档里专门说明了 `ORIG_HEAD` 和 reflog 的用途:reset、merge、pull 这类操作通常会留下可回溯的引用。只要对象还没被垃圾回收清理掉,通常都能先通过 reflog 找到原来的提交,再决定是新建分支还是回退引用。
因为 stash 默认保存的是已跟踪文件在工作区和暂存区中的改动。官方文档说明,如果你还想把未跟踪文件一起收进去,需要用 `git stash push -u`;如果连忽略文件也要一起处理,则使用 `-a`。另外,`git stash apply` 会保留 stash,而 `git stash pop` 会在成功应用后尝试把它移出列表。
不一定。官方 `git switch` 文档把 detached HEAD 描述成一种用于检查历史提交或做临时实验的状态,此时 HEAD 指向的是某个提交而不是分支名。它本身不是错误;如果你在这个状态下做出的提交值得保留,只要立刻新建一个分支把它接住就可以。
stash 与切换
Git 官方书把两者都视为整合历史的正常方式:merge 会保留分叉结构,rebase 会把你的提交重新放到新的基底上,让历史更线性。但官方书也特别强调,不要 rebase 那些已经离开你本地仓库、并且别人可能已经基于它继续工作的提交。简单说,个人本地整理历史常用 rebase,已共享历史默认更安全的是 merge。
官方 `git switch` 文档说明,当切换分支会导致本地改动丢失时,Git 会直接中止操作。这不是故障,而是保护机制。通常你有三种稳妥处理方式:先提交、先 stash,或者在你确认可以丢弃本地改动时再显式使用 `--discard-changes`。