掌握 Git:基于实践掌握的流程
Git简介
1.什么是 Git?
Git 是目前世界上最先进、最流行的分布式版本控制系统(Distributed Version Control System)。
简单来说,它就像是开发者的“时光机”和“存档点”。无论你的项目代码经历了多少次修改,Git 都能精准地记录每一次变动,并允许你随时回到过去的任何一个版本。
2.核心特点
-
分布式架构: 与传统的集中式版本控制(如 SVN)不同,Git 在每个人的电脑上都保存了完整的仓库历史。即使没有网络,你也可以提交代码、查看历史;即便服务器宕机,任何一个人的本地库都能用来恢复数据。
-
强大的分支机制: 这是 Git 的“杀手锏”。创建和切换分支极快,鼓励开发者为每个新功能开辟独立的分支。这就像在平行宇宙中工作,互不干扰,直到功能成熟后再合并。
-
极致的速度与安全: Git 绝大部分操作是在本地完成的,速度极快。同时,它使用 SHA-1 哈希算法对内容进行校验,确保代码在传输或存储过程中不会被意外损坏或篡改。
3. Git 的三个状态与工作区域
理解 Git 的运行逻辑,必须掌握文件在系统内部流转的三个区域:
-
工作区 (Working Directory): 当前你在磁盘上看到的、正在编辑的项目文件。
-
暂存区 (Staging Area / Index): 一个文件,保存了下次将要提交到版本库的文件列表信息。它作为工作区与仓库之间的缓冲区。
-
本地仓库 (Local Repository / .git directory): 保存项目所有元数据和对象数据库的地方,存储了所有已提交的历史版本。
4. 主要功能优势
-
高效的分支管理:Git 的分支本质上只是一个指向特定提交对象的指针。创建、切换和合并分支的操作几乎是瞬时完成的,这极大鼓励了基于功能分支的开发模式。
-
本地执行:绝大多数 Git 操作只需访问本地文件和资源,无需联网。这种离线工作的能力显著提升了开发响应速度。
-
协作模式:通过
Push(推送)和Pull(拉取)机制,Git 支持极其复杂的协作流(如 Git Flow 或 GitHub Flow),允许数千名开发者共同维护同一个项目。
Git工作流程
一般工作流程如下:
-
从远程仓库中克隆 Git 资源作为本地仓库;
-
从本地仓库中checkout代码然后进行代码修改;
-
在提交本地仓库前先将代码提交到暂存区;
-
提交修改,提交到本地仓库;本地仓库中保存修改的各个历史版本;
-
在需要和团队成员共享代码时,可以将修改代码push到远程仓库。
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
Git的工作流程图如下:

Git的基本指令
Git常用的一些指令
1)git clone - 克隆仓库内容 2)git push - 推送到远程仓库 3)git add - 向本地仓库中添加文件 4)git commit - 提交工作区内容到版本库 5)git checkout - 切换分支 6)git pull - 从远程仓库拉取内容到工作台
1.本地仓库的指令
1)git init - 初始化仓库。该命令执行完后会在当前目录生成一个 .git 目录,所有 Git 需要的数据和资源都存放在这个目录中。
2)git add . - 添加文件到暂存区。如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交。
3)git commit - 将暂存区的内容提交到本地仓库。所有的更新都会被提交,包括文件、内容更改等。
2.远程仓库的指令
2.1远程仓库操作
1)显示所有远程仓库-git remote - v 2)添加远程版本库-git remote add [别名] [url 地址] 3)删除远程仓库-git remote rm name 4)修改仓库名-git remote rename old_name new_name
2.2从远程仓库获取项目
git clone [项目地址] git pull [项目地址] git fetch [项目地址] git merge [目标地址]/[分支]
git clone - 从远程库中克隆项目到本地,是一个包含整个项目的版本库文件夹。该命令通常用于新用户 clone 项目,熟练之后基本都是用 git pull直接拉取项目。
git pull - 从远程仓库下载代码并合并到本地仓库中。
git fetch - 从远程仓库获取最新的更新内容(即本地没有的数据)。
git merge - 将远程仓库上的所有更新内容(假设已经被推送到服务器了)合并到你的当前分支
2.3上传项目到远程仓库
从将本地的分支版本上传到远程并合并可以使用 git push,如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,可以省略冒号:
git push <远程主机名> <本地分支名>
注意: 1)如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
git push --force origin master
2)删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete master
3.其他重要指令
查看仓库状态
git status
删除版本库中的文件
git rm xxx.txt
[删除后要进行git commit -m “XXX”才算真正的删除]
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
git rm -f xxx
查看文件中修改了的内容
git diff xxx.txt 比较当前工作空间与staging area,查看工作空间的变化
git diff --cached 比较staging area与本地仓库,查看暂存区中变化
git diff HEAD 比较当前工作空间与本地仓库
git diff newbranch 比较当前工作空间与newbranch分支
git diff tag1 tag2 比较tag1与tag2
git diff tag1:file1 tag2:file2 比较tag1的file1与tag2的file2
git diff tag1 tag2 file 比较tag1与tag2的file文件
git diff --stat 统计有差异的文件个数
查看历史记录
git log git log 查看全部提交日志 git log -5 查看最近5次的提交日志 git log –p 查看所有提交日志及修改的内容 git log –p --author=“scott” 查看所有scott提交日志及修改内容 git log --since=“2011-05-24” 查看2011-05-24以后所有的提交日志 git log --graph 查看提交日志,以图形方式显示 git log --since=“2 days ago” 查看这两天的提交日志 git log --until=“2011-05-25” 查看截止2011-05-25所有的提交日志 git log --name-only 查看所有修改过的文件 git log --pretty=oneline 查看提交日志,一行显示 git log --pretty=format:%h:%s 查看提交日志,显示sha1及提交comments
还原文件
git revert和git reset的区别: git revert 是撤销某次操作,此次操作之前的commit都会被保留 git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 git reset --hard 取消commit,取消add,取消源文件修改 git reset --soft 取消commit git reset --mixed 取消commit,取消add,是默认模式 git reset --hard HEAD (比较下) 恢复到HEAD状态 git reset --hard HEAD^ 彻底撤销最近一次提交 git reset --hard HEAD~3 彻底撤销最近3次提交 git reset --soft HEAD~3 撤销最近3次commit,恢复到index状态,并且工作空间文件内容不变 git reset HEAD filename 删除暂存的文件 git revert 撤销某次提交,此次操作之前的commit都会被保留,但撤销也会作为一次提交进行保存。 git commit --amend 修改最后一次提交。 如果上次提交时遗漏了文件,可以在提交后将文件加入缓存然后用该命令提交即可。 如果缓存中内容没有任何修改,只更新修改的提交注释。
4.分支管理指令
1.创建分支
git branch (branchname) git checkout -b (branchname) //创建新分支并立即切换到该分支下
2.切换分支
git checkout (branchname)
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
3.合并分支
git merge
你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
4.列出分支
git branch
没有参数时,git branch 会列出你在本地的分支
$ git branch * master
master就是本地分支
5.删除分支
删除完合并的分支
$ git branch -d newtest Deleted branch newtest (was c1501a2).
基于Gitlab的实践对Git的实现
1.获取SSH Key配置
在开始之前,我们需要让服务器识别到我的电脑,密钥的作用就是不用每次都输入账号密码。
1.1生成密钥:在终端输入生成:
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
这个一直敲回车就行,不用设置密码。
1.2复制公钥:
cat ~/.ssh/id_ed25519.pub
复制屏幕上显示的以 ssh-ed25519 开头的整段长文本。
1.3绑定Gitlab:
登录 GitLab -> 右上角头像 -> Settings -> SSH Keys。
把刚才复制的内容粘贴进去,点击 Add key。


也可以直接搜索关键字,如下:

2.克隆项目
项目负责人已经创建好了仓库,你只需要把它下载到本地。
-
在项目主页点击蓝色按钮 Clone,复制 Clone with SSH 下的链接。
-
在本地文件夹打开终端,输入:
git clone git@gitlab.com:xxx/project-name.git
3.创建分支
新手准则:永远不要直接在 main 分支改代码! 为了互不干扰,每个人都应该在自己的“独立房间”里干活。
# 1. 切换到开发主分支(通常是 develop 或 main) git checkout develop # 2. 拉取远程最新代码,确保你是基于最新版开发的 git pull origin develop # 3. 创建并切换到一个属于你的新分支 git checkout -b feature/login-fix
提示:分支名建议叫 feature/功能名 或 fix/缺陷名。
4.开发提交
现在你可以写代码了。写到一个阶段后,记得保存你的进度。
-
查看改了什么:
git status -
暂存文件:
git add .(把所有修改过的文件打包) -
确认提交:
git commit -m "feat: 完成了登录页面的样式调整"
注意:提交信息一定要写清楚你做了什么,严禁写 "111" 或 "update",方便对每个人的草操作进行清晰的理解。
5.推送与合并请求
1.推送到远程:
git push origin feature/login-fix
2.发起 MR (Merge Request):
-
打开 GitLab 网页,你会看到一个黄色的提示框 "Create Merge Request",点击它。
-
Target Branch(目标分支)选择
develop或项目约定的主分支。 -
Assignee(指派人)选择你的项目负责人或导师。
-
点击 Submit merge request。
6.审核,冲突与部署
代码评审 (Code Review):负责人可能会在你的代码下留言,让你修改。你直接在本地修改、再 add、commit、push,MR 会自动更新。
解决冲突:如果别人改了和你同一行代码,Git 会提示冲突。别怕,找组长带你手动选一下保留哪行代码即可。
自动部署:一旦负责人点击 Merge(合并),GitLab 会自动触发 CI/CD 流水线。
-
你可以在项目侧边栏的 Build -> Pipelines 看到进度。
-
当小图标变绿 ✅ 时,恭喜你,你的代码已经成功部署到服务器上了!
常见的报错及解决方法
1. 权限被拒绝 (Permission Denied)
新手最常遇到的第一个门槛。
-
报错信息(截图中会出现):
git@gitlab.com: Permission denied (publickey).fatal: Could not read from remote repository. -
大白话翻译: “你是谁?我不认识你,我不能让你下载代码。”
-
原因: 你的 SSH 密钥(SSH Key)没配置好,或者配置了但没生效。
-
解决方法:
-
检查本地是否有密钥:
ls ~/.ssh/id_ed25519.pub。 -
如果没有,重新运行
ssh-keygen。 -
核心一步: 确保你把
cat出来的完整内容复制到了 GitLab 网页的SSH Keys设置里。
-
2. 拒绝推送 (Updates were rejected / Non-fast-forward)
当你急着下班提交代码时,最讨厌看到这个。
-
报错信息(截图中会出现):
error: failed to push some refs to 'gitlab.com:...'hint: Updates were rejected because the remote contains work that you do not have locally. -
大白话翻译: “云端仓库有你本地没有的新代码,你不能直接覆盖它!”
-
原因: 你的同事在你提交之前,已经抢先一步把他的代码合并进去了。
-
解决方法:
-
先拉后推: 运行
git pull origin <分支名>。 -
Git 会把云端的代码拉下来和你本地的合并。
-
合并完成后,再次运行
git push。
-
3. 代码冲突 (Automatic merge failed; fix conflicts)
新手最害怕的报错,其实它是 Git 在保护你的代码。
-
报错信息(截图中会出现):
CONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result. -
大白话翻译: “你和同事改了同一个文件的同一行,我不知道该听谁的,你自己选吧!”
-
解决方法:
-
打开报错的文件,你会看到类似
<<<<<<< HEAD和>>>>>>>的标记。 -
手动抉择: 删掉不想要的代码,保留想要的代码,并去掉那些怪异的符号。
-
完成提交:
git add .->git commit -m "fix: 解决冲突"->git push。
-
4. 提交到了错误的分支 (Detached HEAD / Wrong Branch)
写了半天发现自己在 main 分支上,心跳加速。
-
表现: 运行
git status发现自己在main分支,而规范要求在feature/xxx分支。 -
自救方案(不丢代码):
-
先暂存:
git add .和git commit -m "临时保存"。 -
创建新分支:
git branch feature/my-real-work。 -
切过去:
git checkout feature/my-real-work。 -
回滚主分支: 这样你的改动就带到了新分支,主分支也可以恢复原状。
-
最后,给三条建议:
-
早起第一件事:
git pull。只要你 pull 得够快,冲突就追不上你。 -
提交前看一眼:
git status。确认你在哪个分支,改了哪些文件。 -
寻求支援: 遇到复杂的冲突,不要自己乱删文件夹,叫上改同一块代码的同事,当面商量怎么合并。
更多推荐




所有评论(0)