Git版本控制入门与实战完整教程:代码管理的必备技能
我刚开始写代码的时候,项目文件夹里全是"最终版""最终版2""绝对最终版"这种文件,改坏了不知道怎么回去。后来学了Git,所有版本都能管理,随时回退,分支随便开,再也不怕改坏代码。Git是程序员必备技能,今天从零开始教你用Git。
什么是版本控制
版本控制就是记录文件的每次修改,随时能查看历史、回退到任意版本。就像游戏的存档系统,随时读档。
没有版本控制的问题:
1. 代码改坏了回不去。
2. 多人改同一份代码,合并困难。
3. 不知道谁改了什么、什么时候改的。
4. 想试新功能又怕搞坏现有代码。
Git解决了这些问题,是目前最流行的版本控制系统。
Git是分布式版本控制,每台电脑都有完整仓库,不依赖服务器。对比以前的SVN(集中式),Git更快更灵活。
安装Git
Windows:去git-scm.com下载安装包,一路下一步。安装后右键菜单会有"Git Bash Here"。
Mac:终端输入git,会提示安装Xcode命令行工具,按提示装。或者用brew install git。
Linux:apt install git(Ubuntu/Debian),yum install git(CentOS)。
装完验证:终端输入git --version,能看到版本号就行。
我Windows上用Git Bash(自带终端),比cmd好用,支持Linux命令。
配置Git
安装后先配置用户信息:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
配置默认分支名:
git config --global init.defaultBranch main
配置编辑器(可选):
git config --global core.editor "code --wait"(用VS Code编辑提交信息)
查看配置:
git config --list
这些配置只需做一次,全局生效。我配置完就再没改过。
Git基本概念
几个核心概念要先搞清楚:
仓库(Repository):Git管理的项目目录,里面有个.git隐藏文件夹,存所有版本数据。
工作区(Working Directory):你看到的文件夹,实际编辑文件的地方。
暂存区(Staging Area):git add后文件进入暂存区,是提交前的准备区。
本地仓库(Local Repository):git commit后文件存到本地仓库,形成版本记录。
远程仓库(Remote Repository):GitHub/Gitee上的仓库,多人协作的中心。
流程:工作区 → git add → 暂存区 → git commit → 本地仓库 → git push → 远程仓库。
我刚学时老是搞混暂存区和本地仓库,后来理解了:暂存区是"购物车",commit是"结账"。
创建仓库
方法一:在现有目录初始化
cd到项目目录,输入git init。会创建一个.git文件夹,这个目录就成了Git仓库。
方法二:克隆远程仓库
git clone https://github.com/ 用户名/仓库名.git
会把远程仓库下载到本地,自动关联远程。
我一般先在GitHub建仓库,然后clone到本地。
基本操作
查看状态:git status。看哪些文件改了、哪些在暂存区。这个命令最常用,随时敲。
添加到暂存区:
git add 文件名:添加指定文件。
git add .:添加所有修改。
git add *.js:添加所有js文件。
提交:
git commit -m "提交说明"
提交说明要写清楚改了什么,别写"update"这种没用的。好的提交说明:fix: 修复登录页空白问题。add: 新增用户头像上传功能。
提交规范建议用约定式提交:feat(新功能)、fix(修bug)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(杂项)。
查看历史:git log。看所有提交记录。git log --oneline简洁模式,一行一条。git log --graph看分支图。
查看差异:git diff。看工作区哪些改了。git diff --staged看暂存区的差异。
撤销修改:
git checkout -- 文件名:撤销工作区修改(还没add)。
git reset HEAD 文件名:从暂存区撤回(add了但没commit)。
git reset --soft HEAD~1:撤销上次commit,保留修改。
git reset --hard HEAD~1:撤销上次commit,修改也丢了。慎用。
我刚开始用git reset --hard丢过代码,后来学会先用--soft。
忽略文件
有些文件不想纳入版本控制(临时文件、编译产物、密钥),用.gitignore文件忽略。
创建.gitignore文件,写规则:
node_modules/:忽略node_modules目录。
.env:忽略环境变量文件。
*.log:忽略所有日志文件。
dist/:忽略打包目录。
.DS_Store:忽略Mac系统文件。
不同语言有不同的.gitignore模板,去github.com/github/gitignore找对应语言的模板,复制来用。
我每个项目第一件事就是建.gitignore,别把node_modules提交上去(几百兆)。
分支管理
分支是Git最强大的功能,可以同时开发多个功能互不影响。
查看分支:git branch。前面带*的是当前分支。
创建分支:git branch 分支名。或git checkout -b 分支名(创建并切换)。
切换分支:git checkout 分支名。或git switch 分支名(新版推荐)。
合并分支:先切到目标分支(比如main),git merge 源分支名。
删除分支:git branch -d 分支名(合并后删除)。git branch -D 分支名(强制删除)。
重命名分支:git branch -m 新名字。
分支策略:
main/master:稳定版本,只合并测试好的代码。
develop:开发分支,日常开发在这。
feature/xxx:功能分支,开发新功能。
fix/xxx:修bug分支。
hotfix/xxx:紧急修复。
我工作流:从main切出feature分支开发,完成后合并回main,删掉feature分支。保持main随时可用。
合并冲突
两个分支改了同一行代码,合并时冲突。Git会标记冲突部分:
<<<<<<< HEAD
你的代码
=======
别人的代码
>>>>>>> 分支名
解决冲突:手动编辑文件,选择保留哪部分(或两部分合并),删掉冲突标记。然后git add文件,git commit。
冲突解决技巧:
1. 看清楚两边的改动,理解为什么冲突。
2. 跟改代码的同事沟通,确认保留哪部分。
3. 用git diff看冲突。
4. VS Code有冲突解决界面,选"接受当前""接受传入""接受两者",比手动改方便。
我刚开始遇到冲突就慌,后来用VS Code的合并编辑器,点击选择就行,很方便。
远程仓库
远程仓库在GitHub、Gitee、GitLab上。
添加远程:git remote add origin https://github.com/ 用户名/仓库名.git。origin是远程的别名。
查看远程:git remote -v。
推送到远程:git push origin main。第一次推用git push -u origin main,-u设置上游关联,以后直接git push。
拉取远程:git pull origin main。拉取并合并。
fetch和pull的区别:git fetch只下载不合并,git pull下载并合并。建议用fetch看清楚再合并。
克隆远程:git clone 仓库地址。自动关联远程。
我每天工作流:早上git pull拉最新代码,开发完git push推上去。
SSH免密配置
每次push输密码麻烦,配SSH免密。
1. 生成SSH密钥:ssh-keygen -t ed25519 -C "你的邮箱"。一路回车。
2. 密钥在~/.ssh/目录下,id_ed25519是私钥(别给任何人),id_ed25519.pub是公钥。
3. 复制公钥内容:cat ~/.ssh/id_ed25519.pub。
4. GitHub设置-SSH and GPG keys-New SSH key,粘贴公钥。
5. 测试:ssh -T git@github.com。看到"You've successfully authenticated"就行。
6. 远程地址改成SSH格式:git remote set-url origin git@github.com:用户名/仓库名.git。
配完后push不用输密码了。我配了SSH后再没输过密码。
实用技巧
几个进阶技巧:
1. stash暂存:git stash暂存当前修改,git stash pop恢复。切分支但不想提交时用。
2. cherry-pick:git cherry-pick 提交hash,把某个提交单独应用到当前分支。
3. tag标签:git tag v1.0.0标记版本。git push origin v1.0.0推送标签。
4. rebase变基:git rebase main,把当前分支的提交移到main最新提交之后。比merge历史更整洁,但会改写历史,团队协作慎用。
5. reflog:git reflog看所有操作记录,包括reset掉的。救命命令,reset --hard丢代码能用reflog找回。
6. alias别名:git config --global alias.st status,以后git st等于git status。
7. bisect二分查找bug:git bisect start,git bisect bad,git bisect good 提交hash,自动二分定位引入bug的提交。
我用reflog找回过好几次误删的代码,这个命令一定要知道。
GitHub使用
GitHub是全球最大的代码托管平台。
创建仓库:登录GitHub-New repository,填名字,选Public/Private,Create。
Fork:复制别人的仓库到自己账号,方便修改。
Pull Request(PR):把自己分支的修改请求合并到目标仓库。开源协作的核心。
Issues:报bug、提建议、讨论问题。
GitHub Pages:免费托管静态网站。
Actions:CI/CD自动化。
Stars:收藏项目。
我GitHub上放了几个开源项目,也给别人提过PR,开源协作很有意思。
团队协作流程
标准团队协作流程:
1. 项目负责人在GitHub建仓库,设好分支保护规则(main不能直接push)。
2. 每人clone仓库或fork。
3. 开发前git pull拉最新代码。
4. 切feature分支开发:git checkout -b feature/新功能。
5. 开发中频繁commit,小步提交。
6. 开发完push到远程:git push origin feature/新功能。
7. 在GitHub发Pull Request,请求合并到main。
8. 团队review代码,提意见。
9. 修改后合并。
10. 删除feature分支。
这个流程叫GitHub Flow,简单实用。大项目用Git Flow,更复杂。
常见问题解决
问题1:push被拒绝(non-fast-forward)
原因:远程有你本地没有的提交。解决:git pull先拉取合并,再push。
问题2:commit了不该commit的文件
解决:git rm --cached 文件名(从仓库移除但保留本地文件),加到.gitignore,重新commit。
问题3:提交信息写错了
解决:git commit --amend -m "新的信息"。修改最近一次提交。
问题4:代码回退后想恢复
解决:git reflog找到之前的commit,git reset --hard 提交hash。
问题5:合并冲突太多不知道怎么处理
解决:git merge --abort放弃合并,回到合并前状态。理清思路再来。
我的Git习惯
分享我的Git使用习惯:
1. 每个小功能完成就commit,别攒一大堆。
2. commit信息写清楚,用约定式提交格式。
3. 每天push一次,备份到远程。
4. 开新功能一定切分支,不在main上直接改。
5. 合并前先pull,减少冲突。
6. .gitignore第一时间建好。
7. 善用git status和git log,随时了解状态。
这套习惯用了三年,代码管理井井有条,从没丢过代码。
总结
Git是程序员的必备技能,看起来命令多,其实常用的就那十几个:init、clone、add、commit、push、pull、status、log、branch、checkout、merge。把这些用熟,日常开发够了。进阶的rebase、cherry-pick、bisect用到再学。Git学好了,代码管理不再混乱,团队协作效率翻倍。
