前言:
Git 是我们程序员的日常伴侣,但有时它的命令也像天书。这份指南(灵感源自一份充满“胡话”的个人笔记)希望能用更轻松、直观的方式,帮你梳理常用的 Git 命令,让你在代码的版本控制中更加得心应手,少一些“哎呀,我刚才干了啥?”的时刻。
(注:带 * 标记的是较旧的命令,现在推荐使用更现代、职责更清晰的对应命令,但了解它们仍有必要。)
一、 当前状态检查与工作区撤销
git status
作用: 检查当前仓库的状态,显示哪些文件被修改了、哪些文件已暂存、哪些是未跟踪的新文件。
通俗说: “让我看看现在是个什么情况?” 这是你迷茫时的第一步。
git restore <file>
作用: 撤销工作区中指定文件的修改,让它恢复到最近一次提交或暂存后的状态。
注意: 这个操作会丢弃你未保存的修改,请谨慎使用!按下回车前确认清楚。
通俗说: “这文件改错了,恢复原样吧。”
*git checkout -- <file>
作用: (旧命令) 功能同上,用于撤销工作区文件的修改。由于 checkout 命令身兼数职(切换分支、恢复文件等),容易混淆,现在更推荐使用 restore。
通俗说: “老办法恢复文件。”
二、 暂存区的操作 (Staging Area)
git add <file>
或 git add .
作用: 将工作区的修改添加到暂存区,准备进行下一次提交。. 代表添加所有修改。
通俗说: “这些改动(写完的‘胡话’或代码)我确认了,放到准备提交的篮子里。”
git restore --staged <file>
作用: 将文件从暂存区撤销,但保留工作区的修改。即 add 的反操作。
通俗说: “刚才 add 的那个文件,先不提交了,拿回来再看看。”
*git reset HEAD <file>
作用: (旧命令) 功能同上,用于撤销暂存区的修改。同样,现在更推荐使用 restore --staged。
通俗说: “用老办法把文件从暂存篮子里拿回来。”
git rm --cached <file>
作用: 从暂存区和版本库中删除文件,但保留工作区的文件。常用于 .gitignore 文件生效前就被错误 add 的文件。
通俗说: “这个文件我不想要版本控制了(比如忘了加 .gitignore),但本地文件先留着。”
三、 提交与历史记录
git commit -m "Your commit message"
作用: 将暂存区的所有修改作为一个版本提交到本地仓库。务必写清楚提交信息!
通俗说: “把篮子里的东西打包存档,贴上标签(说明这次改了啥)。” 写好 message,方便日后回顾,也方便同事理解。
git log
作用: 查看提交历史记录。
通俗说: “翻翻历史记录本,看看之前都提交了些啥。”
git reset --soft HEAD^
作用: 撤销最近一次的提交,但保留那次提交的所有修改在暂存区。适合提交后发现漏了东西或 message 写错了,想重新提交。HEAD^ 指上一个提交。
通俗说: “撤销上次打包,但东西还放在篮子里,方便我修改一下再打包。”
git reset --hard HEAD~1
作用: 彻底撤销最近一次的提交,并且丢弃那次提交的所有修改(工作区和暂存区都会被重置到上上个提交的状态)。HEAD1 同 HEAD。
警告: 这是个危险的操作,会永久丢失数据!执行前请三思!
通俗说: “强力时光机,回到上个版本,中间的修改全不要了!慎用!”
git reflog
作用: 显示所有 HEAD 的移动记录,包括被 reset --hard 丢弃的提交。是恢复误操作(如 reset --hard 后悔了)的救命稻草。
通俗说: “终极后悔药!记录了你每一次‘传送’,即使是‘硬核时光机’也能试着找回之前的状态。”
四、 分支与合并
git switch <branch>
作用: 切换到指定分支。这是推荐的新命令。
通俗说: “换个平行宇宙(分支)看看。”
*git checkout <branch>
作用: (旧命令) 切换分支。现在推荐使用 switch。
通俗说: “用老办法切换分支。”
git branch -m <old-branch-name> <new-branch-name>
作用: 重命名分支。
通俗说: “给这个平行宇宙改个名字。”
git merge --no-ff -m "Merge message" <branch-to-merge>
作用: 将指定分支合并到当前分支。--no-ff 会强制创建一个合并提交记录,即使是快进合并,有助于保持分支历史清晰。
通俗说: “把另一个宇宙的成果合并到我这儿,并明确记录这次合并动作。”
git merge --squash <branch-to-merge>
作用: 将指定分支上的所有提交压缩成一个变更集放入当前分支的暂存区,需要手动进行一次 commit。合并后不保留原分支的详细提交历史。
通俗说: “把另一个宇宙的所有改动打包成一个大包裹,放到我的暂存篮子里,我再统一提交一次。”
git cherry-pick <commit-hash>
作用: 将指定的某一个提交应用到当前分支。
通俗说: “从别的宇宙(或历史记录)精准地拿过来一个特定的修改。”
git rebase <base-branch>
作用: 将当前分支的提交“变基”到指定分支的最新提交之后。会改写当前分支的提交历史,使其看起来像是在 base-branch 最新版本之后才开始开发的。
注意: 不要对已经推送到公共仓库的共享分支执行 rebase!
通俗说: “让我的开发历史接在主线最新的地方,看起来更线性。小心使用,尤其是在团队协作时。”
五、 清理工作区
git clean -fd
作用: 删除工作区中所有未被 Git 跟踪的文件和目录。-f 是强制执行,-d 是包含目录。
警告: 极其危险!会永久删除未跟踪的文件(比如编译生成的文件、日志,但也可能误删你的新代码文件)。使用前务必用 git clean -nfd 预览将要删除的内容。
通俗说: “工作区大扫除,没被 Git 管理的东西(比如 node_modules)都给我消失!务必小心!”
六、 储藏:你的临时工作区 "烘干桶" (Stash)
当你正在一个分支上开发,突然需要切换到其他分支处理紧急任务,但当前工作又不方便提交时,stash 就派上用场了。
git stash
或 git stash push -m "message"
作用: 将当前工作区和暂存区的修改(未提交的)临时保存起来,让工作区恢复到干净状态。可以加 -m 添加描述。
通俗说: “写了一半的‘胡话’或代码,先放进‘烘干桶’存起来,我得去干点别的。”
git stash list
作用: 显示所有储藏的列表。
通俗说: “看看‘烘干桶’里都存了哪些东西。”
git stash apply stash@{N}
作用: 应用指定的储藏(如 stash@{0} 是最新的),但不从储藏列表中删除它。
通俗说: “把‘烘干桶’里的第 N 件东西拿出来用,但桶里还留一份。”
git stash pop stash@{N}
作用: 应用指定的储藏,并从储藏列表中删除它。
通俗说: “把‘烘干桶’里的第 N 件东西拿出来用,并且把它从桶里彻底拿走。”
git stash drop stash@{N}
作用: 删除指定的储藏。
通俗说: “这个‘烘干桶’里的东西不要了,扔掉。”
git restore --source=stash@{N} -- <file>
作用: 从指定的储藏中恢复特定文件到工作区。
通俗说: “只想要‘烘干桶’里第 N 件东西里的某个文件,把它给我拿出来。”
*git checkout stash@{N} -- <file>
作用: (旧命令) 功能同上。
通俗说: “用老办法从‘烘干桶’里拿特定文件。”
结语
Git 命令繁多,但日常高频使用的就是这些。理解它们的作用和场景,多加练习,就能从容应对版本控制的各种情况。希望这份带点“胡话”风格的指南能让你觉得 Git 不再那么枯燥。记住,大胆尝试(尤其是在自己的练习仓库里),并善用 git status 和 git log 确认状态,必要时还有 reflog 这颗后悔药。祝你编码愉快!