摘要:刚学编程时,很多人以为Git就是
add、commit、push三连。但真正入职参与多人协作后,却发现代码经常冲突、提交历史乱成一锅粥、甚至不小心把同事的代码覆盖了。本文结合真实的公司协作流程,带你从零基础吃透Git,并附上职场新人的“急救避坑指南”,建议收藏!
一、 为什么Git是入职的第一道坎?
面试造火箭,入职拧螺丝。当你通过层层面试拿到Offer,入职第一天,你的Leader大概率会发给你一个Git仓库地址,然后说:“去把代码clone下来,配一下环境。”
这个时候,如果你只会git clone,一旦遇到拉取失败、代码冲突、或者不小心提交错文件,就会瞬间手足无措。Git不仅是保存代码的工具,更是团队协作、代码审查(Code Review)甚至“自救”的核心。今天这篇保姆级教程,我将带大家分三个阶段彻底掌握它:新手村(单机基础) -> 职场实战(多人协作) -> 后悔药(错误急救)。
二、 第一阶段:新手村任务(单机基础操作)
1. 安装与初始化配置(入职第一天必做)
安装完Git后,第一件事是配置你的用户名和邮箱(这决定了你提交代码时的署名)。
# 配置全局用户名和邮箱(把名字换成你在公司的花名/拼音)gitconfig--globaluser.name"你的名字"gitconfig--globaluser.email"你的邮箱@company.com"# 查看配置是否生效(按 q 退出)gitconfig--list2. 准备工作:新建你的代码文件夹并打开命令行
很多新手看教程时,打开终端(黑框框)就开始敲命令,结果发现报错。因为你必须先进入你想存放代码的那个文件夹。
第一步:建一个工作文件夹
在你的电脑桌面上,新建一个文件夹,名字叫git-demo(或者叫“我的第一个仓库”)。
第二步:在文件夹里打开命令行(新手最容易卡住的地方)
- Windows 系统:
双击进入git-demo文件夹,在文件夹顶部地址栏里,把里面的路径全部删掉,输入cmd,然后按回车。你会看到弹出一个黑框框,前面的路径就是你的git-demo文件夹。这就是“在当前目录下打开命令行”。
(或者:按住键盘上的Shift键,然后在文件夹空白处点击鼠标右键,选择“在此处打开 PowerShell 窗口”或“在终端中打开”) - Mac 系统:
打开“终端(Terminal)”应用,输入cd(注意 cd 后面有一个空格),然后直接把git-demo文件夹拖拽到终端窗口里,按回车。
第三步:验证自己在哪里
为了确保我们在正确的文件夹下,输入以下命令(Windows 输入ls或dir,Mac 输入ls):
ls# Windows/Mac/Linux 查看当前目录下的文件dir# Windows 查看当前目录下的文件💡 提示:如果你发现里面是空的,说明你成功进入了刚刚新建的文件夹!
3. 初始化仓库与基础四连(理解原理)
在公司,你通常是先clone(克隆)远程仓库,但这里我们先讲init(初始化),帮你理解Git到底在做什么。
在刚才的终端里,输入:
# 初始化一个本地仓库。这个命令会在当前文件夹下创建一个隐藏的 .git 文件夹,用来记录版本信息。gitinit此时你会看到终端提示Initialized empty Git repository in ...,说明成功了。
💡 核心概念加油站:Git 的“三个区”到底是什么? 在敲接下来的命令前,你必须先弄懂 Git
最核心的“三个区”概念。别怕,我们用“去超市买东西”来打个比方:工作区(Workspace):就是你电脑里能看到的文件夹(比如 git-demo)。相当于超市的货架,你在这里挑选商品(修改代码)。
暂存区(Staging Area / Index):一个临时存放修改的地方。相当于购物车。你挑好东西先放进购物车,但还没结账,随时可以把东西拿出去(撤销修改)。
版本库(Repository / Local Repo):就是那个隐藏的 .git 文件夹。相当于收银台结账后的小票/本地档案库。东西一旦结账(提交),就会在本地留下永久的历史记录。
远程仓库(Remote Repo):公司的GitLab/GitHub服务器。相当于云端的总仓库。
它们之间的转换关系(核心):
git add:把商品从“货架”放进“购物车”(工作区 -> 暂存区)
git commit:去收银台结账,把小票存进“本地档案库”(暂存区 -> 本地版本库)
git restore --staged:把购物车里的东西拿出来,放回货架(暂存区 -> 工作区)
git push:把本地档案库的货物打包,快递到“云端总仓库”(本地版本库 -> 远程仓库)
💡 注:git push 是团队协作的关键一步,只有推送到远程仓库,你的同事才能看到并拉取你的代码。
理解了这四个区,我们再看接下来的操作,你就会豁然开朗。
接下来,我们在文件夹里新建一个文本文件,比如index.html,随便写点内容。然后在终端里敲出“基础四连”:
# ==========================================# 第一连:查看状态(对比前)# ==========================================gitstatus# 查看当前文件状态,此时 index.html 会显示为红色(未追踪)# ==========================================# 第二连:添加到暂存区# ==========================================gitadd.# 把当前目录下所有修改(包括新建、修改、删除)添加到暂存区gitaddindex.html# 【特定文件用法】如果只想添加某一个文件,可以用这个命令gitstatus# 再次查看状态,此时 index.html 会变为绿色(已暂存,等待提交)# ==========================================# 第三连:正式提交到本地版本库# ==========================================gitcommit-m"feat: 完成登录页面的UI开发"# 提交暂存区的内容,并附上描述信息# ==========================================# 第四连:推送到远程仓库(团队协作必做)# ==========================================# 如果你是第一次推送,并已经在 GitHub/GitLab 上建好了空仓库,拿到地址后,先把它绑给 origingitremoteaddorigin https://github.com/你的用户名/你的仓库名.git# 手动把远程地址绑给 origin 这个代号# 然后再推送gitpush-uorigin main# 把本地 main 推上去,第一次推送时,加上 -u 参数,将本地分支与远程 main 分支关联# git push # 如果已经关联过远程分支,直接执行这一句即可💡 注意:在你执行 git remote add origin … 之前,Git 根本不知道 origin 是谁,所以直接敲 git push -u origin main 会报错。我们这里先手动告诉 Git:“以后我说 origin,指的就是这个地址。”
💡 职场建议:提交信息(Commit Message)千万不要写“修改”、“update”、“提交”。推荐使用feat:(新功能)、fix:(修复Bug)、docs:(文档)等前缀。
4. 查看历史与差异
# 查看提交历史(按q退出)gitlog--oneline# 查看工作区与暂存区的代码差异gitdiff三、 第二阶段:职场实战(多人协作流程)
1. 入职第一天:把公司代码克隆到本地(git clone)
你入职后,Leader 会发给你一个 Git 仓库地址(类似https://gitlab.company.com/team/project.git)。你需要做的第一件事,就是把这个远程仓库完整地“搬”到你的电脑上。
操作步骤:
# 第一步:在你的电脑上建一个存放代码的文件夹(比如 D:\work),然后在里面打开命令行# 第二步:执行克隆命令,把远程仓库下载到本地gitclone https://gitlab.company.com/team/project.git# 克隆远程仓库到本地,会自动创建一个 project 文件夹并初始化好 .git# 第三步:进入克隆下来的项目文件夹cdproject# 进入项目目录,后续所有操作都在这个目录下进行# 第四步:验证远程仓库别名(新手必看)gitremote-v# 查看远程仓库地址,你会看到 origin 后面跟着你刚才 clone 时输入的 URL💡 什么是 origin?
origin 是 Git 给远程仓库起的默认名字。你在 clone 时输入了完整的 URL,Git 就自动把这个 URL 存成了 origin。以后你写 git pull origin main,就相当于告诉 Git:“去那个叫 origin 的远程仓库,拉取 main 分支的代码”。不用每次都输入长长的 URL,非常方便。
💡 提示:clone是入职后最没有门槛的操作,但一定要确认你 clone 的是正确的仓库地址。如果 clone 报错,通常是权限问题(找 Leader 给你开仓库权限)或者网络问题。
💡 新手加油站:分支到底是什么?(河流与港口的比喻)
很多新手 clone 完代码,看到 main 分支就懵了:为什么不能直接在上面写?新分支为什么能用 main 的代码?推送到远程后,为什么 main 上看不到我的改动?
我们用“两条河流”来彻底理解:
main 是主干河流:A -> B -> C 是主河流的流向,C 是 main 当前最新的入海口。
feature/user-login 是支流:你从 C 这个位置挖出一条支流。支流里的水(代码)天然带着主干河流 A、B、C 所有的历史。D -> E 是你在这条支流上新的开发记录,E 是支流当前最新的入海口。
两条河流互不干扰:你在支流里怎么折腾,主干河流 main 都不会受影响。这就是为什么推送到远程后,main 分支完全看不到你的改动——它们此时是两条平行的河道。
让新手观察:
gitbranch# 查看本地分支,* 表示当前所在分支gitlog--oneline--graph--all# 查看提交历史的分支图2. 分支管理:永远不要在 main 分支上直接开发
注意: 你刚 clone 下来时,Git 已经自动把你放在了默认分支(通常是 main)上。你可以敲 git branch 确认一下,前面带 * 号的就是你当前所在的分支。虽然你现在就在 main 分支上,但千万不要直接在这里写代码!
公司的主干分支(通常是main或master)是受保护的,你无法直接推送代码上去。开发新功能必须切分支。
#首先gitbranch# 查看本地分支,前面带 * 号的就是你当前所在的分支# 1. 先切换到主分支gitcheckout main# 从当前分支切换到 main 分支# 2. 拉取远程最新代码(重要!防止基于旧代码开发,引发后续冲突)gitpull origin main# 从远程 main 分支拉取最新代码并合并到本地# 3. 创建一个新的功能分支并切换到该分支gitcheckout-bfeature/user-login# -b 表示新建分支,feature/user-login 是分支名(公司通常用 feature/xxx 命名)# 4. 在这个分支上开发、add、commit# ... 编写代码 ...gitadd.# 把工作区的所有修改添加到暂存区gitcommit-m"feat: 实现用户登录逻辑"# 提交到本地版本库,附上描述信息3. 提交代码与发起合并请求(MR/PR)
开发完成后,将本地分支推送到远程仓库。
# 将本地分支推送到远程,并建立关联gitpush-uorigin feature/user-login# -u 表示将本地分支与远程分支关联,以后直接 git push 即可推送成功后,去公司的 GitLab/GitHub 网页端,发起一个Merge Request (MR)或Pull Request (PR),让同事进行代码审查(Code Review)。审查通过后,由负责人合并到main分支。
疑问
❓ 两条河流怎么才能汇合?
Git 的设计哲学是:河流之间是隔离的,想要汇合需要人工开闸放水。
你推送后,远程仓库就是上面图画的那样:main 和 feature/user-login 是两条平行的河道,互不干扰。
如果推送到远程就自动合并到 main,那公司的主干河流早就泛滥成灾了,谁写了个 Bug 都会直接污染所有人的代码。
❓ 谁来操作合并?
由人来操作,而不是 Git 自动完成的。 标准流程如下:1.你发起 MR/PR:在网页端填写标题和描述(申请开闸放水)。
2.同事审查代码(Code Review):他们逐行看你改了哪些代码,可以留言要求修改。
3.你根据反馈继续修改:本地改完后 git add . → git commit → git push,MR 会自动更新。
4.负责人点击 Merge 按钮(开闸放水):审查通过后,由你或 Tech Lead 在网页端点击 Merge。这时 Git才会把两条河流汇聚在一起,建一个新的港口 F:
看图说话:合并时,Git 会把 main 的最新入海口 C 和 feature 的最新入海口 E 汇合,生成一个新的港口 F。
合并完成后,你的代码就正式流入了 main。之后其他同事再 git pull origin main 时,就能看到你的代码了。删除已合并的功能分支:合并后,这条支流的水已经汇入主干,可以在网页端点击“Delete branch”把支流填平,保持仓库整洁。
一句话总结:
你负责在自己的支流(分支)上写代码并推送 → 发起 MR → 同事审查 → 负责人点 Merge(开闸放水) →
代码才真正进入主干河流(main)。任何人都不能绕过审查直接往 main 上推代码。
4. 解决代码冲突(最让新人头疼的环节)
场景复现:你在 feature/user-login 分支上开发,你的同事也在 main 分支上修改了同一个文件(比如 index.html),并且他已经合并到了远程 main。此时你准备提交代码,却发现你的分支已经落后于主干了。
💡 新手疑问:为什么是在本地把 main 合并到 feature,而不是反过来? 很多新手会想:“我要提交代码,难道不是把我的feature 合并到 main 吗?为什么反而要把 main 合并到我这里?”
答案很简单:主干河流(main)是受保护的,你本地没有权限直接操作它。 把 main 合并到 feature,相当于“在支流里先把主干最新的水引过来,在安全的本地环境里解决冲突、测试通过”。等你的支流完全没问题了,再到网页端发起MR,由负责人把支流正式汇入主干。
1. 确保你在自己的功能分支上
gitcheckout feature/user-login# 切换到你的分支2. 查看当前工作区是否干净(如果有未提交的代码,请先 commit 或 stash)
gitstatus# 查看状态,确保没有未完成的修改3. 把 main 分支的最新代码合并到当前分支
gitmerge main# 把 main 分支的最新代码合并到当前分支,此时可能产生冲突如果发生冲突,Git 会在终端提示类似:CONFLICT (content): Merge conflict in index.html。此时 Git 会暂停合并,等待你手动解决冲突。
🔧 解决冲突的详细步骤:
第一步:找到冲突的文件
再次运行 git status,你会看到 Unmerged paths 下面列出了所有冲突的文件(通常是红色的)。
第二步:打开文件,手动解决冲突
用编辑器(VS Code 等)打开冲突文件,你会看到类似这样的标记:
<<<<<<< HEAD<h1>欢迎来到登录页(你的代码)</h1>=======<h1>请在此处登录(同事的代码)</h1>>>>>>>> main<<<<<<< HEAD 到 ======= 之间:是你当前分支的代码。
======= 到 >>>>>>> main 之间:是main 分支合并过来的代码。
你需要做的:和同事沟通,决定保留哪段代码(或者把两者融合)。删除 <<<<<<<、=======、>>>>>>> 这三行标记,留下正确的业务代码。
第三步:重新提交
gitaddindex.html# 把解决冲突后的文件重新添加到暂存区gitcommit-m"fix: 解决与main分支的代码冲突"# 提交这次冲突解决的记录🚑 新手救命稻草:如果冲突太多,我想放弃怎么办?
如果你看到满屏的冲突,完全不知道怎么改,千万不要乱删代码。你可以随时“取消合并”,回到合并前的状态:
gitmerge--abort# 中止本次合并,恢复到执行 git merge main 之前的状态执行后,你的分支会回到没合并之前的样子。你可以先找同事求助,理清思路后再重新 git merge main。
一句话总结:
冲突不可怕,先 git status 找文件 → 打开文件删标记 → git add + git commit。实在搞不定就 git merge --abort 重来。
四、 第三阶段:Git急救指南(错误如何修改?)
人在江湖飘,哪有不挨刀。新手遇到报错最容易慌,甚至乱敲命令把代码搞丢。记住一个口诀:遇到任何问题,先敲git status看状态,然后再对症下药。下面我整理了职场新人最常遇到的 6 个“灾难现场”及抢救方案。
🚨 灾难1:代码写崩了,想撤销还没add的修改
场景复现:你改了半天代码,越改越乱,想直接放弃,回到最后一次 commit 时候的样子(此时你还没执行git add)。
抢救命令:
gitrestore.# 放弃所有工作区的修改(危险!不可逆)gitrestore index.html# 只放弃 index.html 这一个文件的修改状态对比:执行前,git status显示文件是红色(在工作区)。执行后,代码直接回到上次提交的状态,你的乱改全没了。
⚠️ 警告:这个命令是不可逆的,你刚刚写的代码会直接消失,连git reflog都救不回来,慎用!
🚨 灾难2:手滑git add了,但还没commit,想撤回来
场景复现:你不小心把node_modules或者一堆无关文件git add .加进去了,或者觉得代码没写好,想从暂存区拿回来。
抢救命令:
gitrestore--staged.# 把所有文件从暂存区撤回工作区gitrestore--stagedindex.html# 只撤回 index.html 这一个文件状态对比:执行前,git status显示文件是绿色(在暂存区)。执行后,文件变回红色,但代码修改完好无损,只是回到了工作区。
🚨 灾难3:刚commit完,发现漏了个文件或注释写错了
场景复现:你敲完git commit -m "...",突然发现漏了一个关键文件没提交,或者提交信息有个错别字。
抢救命令:
gitaddforgotten_file.js# 把漏掉的文件先补上gitcommit--amend-m"feat: 补充遗漏文件"# 覆盖上一次的提交,并修改注释状态对比:git log中不会多出一条提交记录,而是直接把上一次的提交“替换”掉了。
⚠️ 警告:仅限本地未推送到远程(未push)的提交!如果你已经 push 了,再 amend 会导致本地和远程冲突,极其麻烦。
🚨 灾难4:刚commit完,想撤回暂存区重新检查(未 push)
场景复现:你敲完git commit -m "xxx",突然发现提交信息写错了,或者发现多提交了一个文件,你想撤销这次提交,但不想丢失代码,想回到“已add但未commit”的状态重新整理。
抢救命令:
gitreset--softHEAD~1# 撤销上一次 commit,代码保留在暂存区(绿色状态)状态对比:
- 执行前:
git status显示nothing to commit, working tree clean(干净状态)。- 执行后:再次敲
git status,你会看到刚刚提交的文件又变回了绿色(Changes to be committed)。你的代码一行没丢,只是退回了暂存区,你可以重新修改代码或者重新git commit。💡 对比记忆:
- 想退回暂存区(绿色):
git reset --soft HEAD~1- 想退回工作区(红色):
git reset HEAD~1(默认的 mixed 模式)- 想彻底销毁这次提交(危险):
git reset --hard HEAD~1⚠️ 警告:依然仅限本地未
push的提交!如果已经push到了远程,不要用reset,否则会造成远程和本地的历史冲突。
git reset 有三个常用模式,区别就在于把代码“退”到了哪个区:
– – soft(软重置):只撤销 commit,代码完好无损地留在暂存区(绿色)。这正好符合你的需求。
– – mixed(默认,即 git reset HEAD~1):撤销 commit,代码退回工作区(红色)。
– – hard(硬重置):撤销 commit,代码直接销毁(不可逆)。
🚨 灾难5:忘记切分支,直接在main上写代码并commit了
场景复现:入职第一天太激动,忘了切分支,直接在main分支上开发并提交了一次。现在想把这笔提交移到自己的功能分支上。
抢救命令:
gitlog--oneline# 先看一眼,记住你刚刚的提交gitreset HEAD~1# 撤销刚才的 commit,但保留代码在工作区(HEAD~1 表示退回上一次提交)gitcheckout-bfeature/user-login# 新建并切换到正确的分支gitadd.# 重新添加代码gitcommit-m"feat: 实现用户登录逻辑"# 在正确的分支上重新提交状态对比:执行
reset HEAD~1后,main分支回到了你写代码之前的状态,而你的代码变成了红色(未追踪)。接下来你切到新分支重新提交,main分支就被彻底解救了。
🚨 灾难6:终极救命稻草——不小心git reset --hard把代码搞丢了
场景复现:你本来想撤销一点东西,结果手贱敲了git reset --hard,屏幕一闪,你辛辛苦苦写了一天的代码全没了,此时你万念俱灰。
抢救命令:
gitreflog# 查看引用日志(时光机),这里记录了你的所有操作你会看到类似这样的输出(重点看最前面的哈希值):
a1b2c3d (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1 f4e5d6c HEAD@{1}: commit: feat: 写完了一天的代码找到你误操作之前的那条记录(比如f4e5d6c),然后:
gitreset--hardf4e5d6c# 穿越回那个版本,代码瞬间复活💡 提示:只要你的.git文件夹没被删除,git reflog能救回绝大多数误删的提交。这是每个程序员都必须知道的保命技能!
⚠️ 职场红线警告:绝对不要git push -f
有些新手在遇到本地和远程冲突时,为了图省事,会使用git push -f(强制推送)覆盖远程分支。这是极其严重的生产事故!它会直接抹掉你同事提交的代码,轻则被痛骂,重则直接辞退。遇到冲突,老老实实git pull然后手动解决,绝不能强推。
💡 新手急救速查表(建议截图保存):
| 灾难场景 | 抢救命令 | 危险等级 |
|---|---|---|
| 想撤销未 add 的修改 | git restore . | 🔴 高(不可逆) |
| 想撤回已 add 未 commit | git restore --staged . | 🟢 安全 |
| 漏文件/改注释(已commit 未 push) | git add .+git commit --amend | 🟡 中(限未 push) |
| 想退回暂存区重新检查(已commit 未 push) | git reset --soft HEAD~1 | 🟢 安全 |
| 提错分支想转移 | git reset HEAD~1→ 切分支 → 重新add + commit | 🟢 安全 |
| 代码被 reset --hard 搞丢 | git reflog→git reset --hard <哈希值> | 🟢 安全(保命) |
五、 老司机的职场忠告(写给新人)
- 勤拉取,早提交:每天开工前先
git pull,功能拆分得小一点,频繁提交,这样冲突最少。 - 不清楚状态时,先
git status:不管遇到什么报错,先敲这个命令,它会告诉你当前处于什么状态,该怎么做。 - 不要提交无关文件:学会使用
.gitignore文件,把node_modules、.env、*.log等文件排除在外。 - 遇到冲突不要乱删代码:看不懂冲突时,叫上修改该文件的同事一起看,沟通是解决冲突最好的工具。
六、 总结
Git的学习曲线是前陡后缓的。新手期只要掌握add、commit、push、pull和解决冲突就足够应对80%的工作。遇到报错时,善用搜索引擎和git status,你的Git水平一定会突飞猛进。
如果这篇文章帮你避开了Git的坑,欢迎点赞、收藏、关注!你在使用Git时踩过最大的坑是什么?欢迎在评论区分享你的“血泪史”!