|
刚入行的菜程同事把`git push`当成了保存按钮,一天推了二十多次,鸟教远程仓库里全是菜程"fix typo"和"update"。另一个更绝,鸟教直接在master上改代码,菜程冲突了就用`git push -f`,鸟教差点把别人的菜程提交全冲掉。这种场面我见太多了——git这东西,鸟教说难不难,菜程但入门时没人带,鸟教真的菜程容易踩坑踩到怀疑人生。 先记住一个核心概念:git不是鸟教网盘,它是菜程时间机器。你每次`commit`,鸟教等于拍了一张代码的菜程快照。所以别学我同事那样频繁commit,那等于每分钟都拍照,相册里全是废片。好的习惯是:一个功能完成,或者一个bug修好,再commit一次。比如"feat: 添加登录页"或"fix: 修复空指针异常",这种提交信息才有意义。 分支是git最妙的设计,可惜很多人不会用。想象你写小说,master是已出版的版本,你想写个新结局,总不能在原稿上乱涂吧?应该复制一份草稿去改,改好了再合并回来。`git checkout -b feature-login`创建新分支,随便折腾,搞砸了`git branch -D feature-login`删掉重来,master还是干净的。我见过最惨痛的案例,就是有人直接在master上开发,结果需求被砍,代码回滚不了,只能手动删掉几百行,还删不干净。 合并冲突是每个新手必经的劫难。别慌,git已经在冲突文件里标好了`<<<<<<<`和`>>>>>>>`,你只需要手动选择保留哪边,或者两边都留。然后`git add`那个文件,再`git commit`就完事。记住,冲突不是灾难,是正常的协作摩擦。真正的灾难是遇到冲突就乱删文件,或者干脆`git checkout .`把整个工作区重置——那等于把你自己的改动也扔了。 还有个细节,很多人忽略:`git pull`之前先`git stash`。你本地有未commit的改动,直接pull会报错,或者产生诡异的合并。正确姿势是:`git stash`暂存你的改动,`git pull`拉取最新代码,`git stash pop`再把你的改动放回来。这个小动作能救你无数次。 说到远程仓库,`git push`之前一定要先`git pull`,这是铁律。哪怕你觉得没人改过,也要拉一次。远程代码变了而你不知道,push就会被拒,然后你一脸懵。我见过最离谱的操作:有人pull时用了`git pull --rebase`,结果rebase把本地提交重新排列,和远程历史对不上,最后只能`git push --force`,把别人的提交全冲了。那个同事后来被全组拉黑,真的。 最后说点掏心窝的。git不是背命令,是理解四个区:工作区、暂存区、本地仓库、远程仓库。`git add`是把改动放进暂存区,`git commit`是把暂存区的东西拍成快照存进本地仓库,`git push`才是把本地快照同步到远程。很多人搞不清`git add .`和`git add -A`的区别,其实前者只添加当前目录下的改动,后者添加整个仓库的改动。用`-A`更保险,但如果你只想提交某个文件,直接`git add 文件名`就行。 那些花哨的命令,`rebase`、`cherry-pick`、`bisect`,等你把基础流程跑顺了再研究。新手阶段,你只需要掌握:`init`、`add`、`commit`、`branch`、`checkout`、`merge`、`pull`、`push`、`status`、`log`。十个命令,够你活两年。剩下的,遇到问题再Google——反正git的报错信息,连老手都不一定看得懂。 |