什么是 git 常用命令
git 常用命令,就是每天和 Git 这个版本控制工具打交道时反复敲的那一批指令。理解它们最有效的方式不是背参数,而是按真实使用顺序把它们串起来。
这条顺序大致是:先理解三个区域,再学会查看状态、提交改动、开分支、连远程、撤销错误。搞清这一套,代码被改坏、被覆盖、被误删时的慌张感会明显下降。

核心机制:文件在三个区域之间移动
在敲任何命令之前,先记住 Git 把文件放在三个地方。
- 工作区:你正在编辑的文件。
- 暂存区:准备提交的那份快照。
- 版本库:已经存进历史里的提交。

大多数命令本质上就是让文件在这三个区域之间移动。搞不清文件现在在哪一层,命令就会越敲越乱,也不知道该往哪个方向修。
起步:config、init、clone
起步只有三条命令。
git config:设置用户名和邮箱,提交记录里显示的作者信息就来自这里。git init:把一个普通文件夹变成 Git 仓库。git clone:把远程仓库整个复制一份到本地,连提交历史一起带过来。

动手之前:先看状态
动手前先看状态,这一步最省事。git status 告诉你哪些文件改过、哪些已经加进暂存区。它几乎是最安全的命令,随便敲,不会改动任何内容。
git diff 看的是具体改了哪几行;加上 --staged 参数,就看暂存区里的改动。

先看清楚再动手,能省掉很多后悔。
提交:先 add,再 commit
提交分两步走。git add 把改动放进暂存区,git add . 表示把当前目录的改动全部放进去。
之后用 git commit -m 加一句说明,生成一次提交。

这句说明就是以后回看历史的线索。写清做了什么,比写一句 update 有用得多。
回顾历史:log 与 show
想回顾历史就用 git log,它按时间倒序列出提交;加 --oneline 可以一行一条地紧凑查看。
定位到某次提交后,git show 能看到那一次具体改了什么。改动是谁加的、什么时候加的、为什么加,这三件事都能从这里查出来。

分支:只是指向提交的指针
分支是 Git 最有价值的部分。git branch 列出分支,git branch 加名字新建分支,git switch 加名字切过去,带 -c 则是新建并切换。

分支本质上只是一根指向某个提交的指针,所以创建和切换都很快。理解了这一点,就明白为什么在 Git 里开分支不需要把整个项目复制一遍。

合并与冲突
在分支上开发完,切回主干,用 git merge 加分支名合并。
如果两条线改了同一处代码,Git 会报冲突,需要你手动决定留哪一段,改完再 add 和 commit 收尾。
冲突不是错误,它只是把选择权交回给你。逐个位置决定保留哪一边,处理起来就有章可循。

远程协作:push、pull 与 fetch
远程命令解决的是协作问题。git remote -v 查看当前连的是哪个远程仓库,git push 把本地提交推上去,git pull 把别人的改动拉下来并合并。
git fetch 只下载不合并,适合先看清楚再决定要不要合进来。git pull 与 git fetch 的区别,就是自动合并和先看后合的区别。

出错时的三条退路
出错时有三条常用退路。
git restore加文件名:把工作区的修改丢掉,恢复到上次提交的样子。git reset:回退提交,本地还没推送时用它最方便;加--hard会连改动一起清掉,要谨慎。git revert:对已经推送到远程的提交,生成一次反向提交来抵消,历史保留完整,也不会打乱别人的仓库。

同样叫撤销,git restore 改本地,git revert 加历史,方向完全相反。
临时场景:stash 收起未提交的改动
手头改了一半,突然要切分支修个紧急问题,git stash 可以把未提交的改动先收起来。
处理完再切回来,用 git stash pop 恢复,工作区就回到离开时的样子。收起来的东西还在,只是暂时不占工作区。

把它们串成一条完整链路
把这些命令串起来,其实就是一条完整链路:初始化、看状态、进暂存、写提交、开分支、合并、推远程、必要时撤销。

这条链路上的每一步都在回答同一类问题:文件现在在哪一层、历史要不要改、改动有没有推给别人。
限制与常见误区
- 搞不清文件在哪一层就急着敲命令。三个区域分不清楚,撤销和回退很容易用错方向。
- 把冲突当成错误。冲突只是把选择权交回给你,逐个位置决定保留哪一边即可。
- 在已经推送到远程的提交上直接做回退。这类场景更适合用
git revert生成反向提交,历史保留完整,也不会打乱别人的仓库。 - 用
git reset --hard处理所有问题。它会连改动一起清掉,需要谨慎。 - 提交说明随手写一句
update。这句说明是以后回看历史的线索,写清做了什么才有用。
常见问题
git status 会改动文件吗? 不会。它几乎是最安全的命令,只告诉你哪些文件改过、哪些已经加进暂存区。
git pull 和 git fetch 差在哪? git pull 拉下别人的改动并合并,git fetch 只下载不合并,适合先看清楚再决定要不要合进来。
本地还没推送的提交怎么退回去? 用 git reset 最方便,注意 --hard 会连改动一起清掉,要谨慎。
已经推到远程的提交怎么撤销? 用 git revert 生成一次反向提交来抵消,历史保留完整,也不会打乱别人的仓库。
git restore 和 git reset --hard 都会丢改动,怎么区分? git restore 加文件名,丢的是工作区里对应的修改;git reset --hard 是回退提交并连改动一起清掉,更重,要谨慎。
开分支会不会复制整个项目? 不会。分支只是一根指向某个提交的指针,创建和切换都很快。
总结
真正的熟练不是背下所有参数,而是清楚三件事:每一步文件在哪个区域、历史有没有被改写、这些提交有没有推给别人。
这三件事想明白了,命令只是手边顺手的工具。


