前言
作为代码入门的新手小白,一定都有一个共有的痛点——我该如何保存我每天编写的代码?诸如此类的问题还有:我的下一步更改是否正确?如果错误我该如何回到我想要会到的地方重新开始更改?......
很多朋友或许会采用最原始简单的方法——cvz大法!
诚然,这对于简单的小量,简单的代码编写确实高效且简便,例如写一道不算长的算法题,无非就是把错误的地方删掉再写,或者不断地 CTRL+Z 回退到所需要的地方,但对于以后的个人项目,甚至是多人协作开发的大型项目,这种方法是不可取的,作者本人在完成学校期末课程设计的时候也才用过类似笨方法,于是桌面便多了许多的 .zip文件
但我们接下来介绍的 Git 便可以很好的解决我们的痛点
一、Git——分布式版本控制的革命
Git 是一个分布式版本控制系统。 它的核心任务是管理和跟踪文件内容的变化,让你在需要时可以回到任何一个“历史版本”。
Git不是简单的"代码备份工具",而是一个分布式版本控制系统。与传统的集中式版本控制(如SVN)不同,Git的每个开发者都拥有完整的代码仓库历史,这意味着:
- 无需依赖中央服务器:即使网络断开,也能正常工作
- 更安全的版本管理:每个分支都有完整的版本历史
- 更高效的协作:多人同时工作不会互相阻塞
二、Git工作流程:从初始化到远程仓库
1. 创建本地仓库(从零开始)
//在我们所需要管理代码的根目录创建本地的Git仓库,在集成终端中输入代码
git init
这行代码会添加一个隐藏目录仓库 默认创建一个master分支
重要提示:同一个项目中不能有多个Git仓库,否则会导致版本管理混乱。管理代码,只能有一个仓库。
2.理解关于Git的几个区域
在创建好本地仓库后,想要真正使用好Git进行我们的代码管理,还需要理解以下几个代码区域
- 工作区
- 暂存区
- 本地仓库
- 远程仓库
简单走一遍这四个区域:我们编写代码的地方就是工作区,通过git代码我们可以先将工作区的代码先提交到暂存区,再经过git代码检查确认无误,再将其提交到我们的本地仓库进行保存,最后完成了每天的进程、任务,我们可以提交到例如Gitee,Github的远程代码仓库中,这样即使本地仓库被我们删除,也可以线上访问到我们以前的代码文件
三、Git核心操作:理解命令背后的原理
1. 仓库状态检查:git status
git status
一个高素养程序员:在任何决定前,都应先用git status了解仓库状态。它会告诉你:
- 哪些文件在工作区(未跟踪)
- 哪些文件在暂存区(已添加但未提交)
- 当前分支和远程分支的同步状态
最佳实践:每次修改代码后,先
git status,确认你打算提交的内容。
2. 添加文件到暂存区:git add
git add fileName // 添加单个文件
git add fileName1 fileName2 // 添加多个文件
git add . // 添加所有修改文件
3. 提交暂存区文件到本地仓库:git commit
git commit -m "message"
其中message是我们对这次代码提交的简单注释,在实际编写时要做到尽量精简准确
关键点:
- 按功能提交:不要"每编写一点代码就提交",而是"完成一个功能后提交一次"
- 提交信息规范:使用"动词开头",如
add,fix,update,清晰描述修改内容 - 每次提交是文件的完整版本:Git存储的是文件的新版本,不是"差异"
为什么不是"自增ID" ?如前所述,Git是分布式系统,自增ID在多人协作时会冲突,而SHA-1哈希是基于内容的唯一标识。
4. 查看差异:git diff
git diff fileName // 查看本地代码文件与仓库的差异
git diff --staged // 查看暂存区代码文件与仓库的差异
注意:重大提交前,先git diff确认修改内容,避免提交错误。
5. 将本地仓库代码提交到远程仓库:git push
我们需要先创建一个远程仓库,以国内阿里的Gitee为例,简单的完成创建后(需确保远程仓库和本地仓库管理的是同一个项目),我们可以根Gitee进行全局配置
git config --global user.name "Chenxxx"
git config --global user.email "109453xxxx@qq.com"
//具体根据Gitee进行输入
全局配置之后我们便可以将本地仓库与远程仓库进行连接并提交代码了
// 初次建立连接,若以后再提交代码无需重新连接
git remote add origin https://gitee.com/chenxxxx/111.git
// 将本地仓库代码提交到远程仓库
git push -u origin "master"
至此我们便完成了我们一整套代码提交流程,随着我们不断地学习和成长,Git不只是一个代码管理方式,以后进行项目开发,多人协作编程等会更加体现出其重要性以及给我们带来的便利
6. 查看提交历史:git log
git log # 详细提交历史,这会显示当前分支的提交历史,按时间顺序倒序排列
git log --oneline # 简洁提交历史
输出示例:
以上是一段输出示例,其中最前面的“乱码”是Git随机生成的hash值,其随机且唯一性为多人协作编程的代码提交带来了极大的便利
HEAD -> master 表示当前我们所在的分支为master主分支,以后进行大型项目的多人协作开发,每个人会在不同的分支编写代码,就需要切换不同的分支进行代码管理,再有项目组长进行多分支融合
origin/master 表示这是一次远程仓库提交,origin为你远程仓库的默认名称,当前在master分支上,且本地和远程的master是同步的 后面的信息则是我们本地仓库提交时输入的“message”
面试小贴士:为什么Git使用SHA-1哈希值作为唯一ID,而不是自增ID?
答:Git是分布式系统,多个开发者可能同时提交。自增ID在分布式环境中容易冲突(谁先提交?下一个ID给谁?),而SHA-1哈希值是基于内容的唯一标识,保证了在任何环境下都能正确标识版本。
四、Git高级操作:版本管理的利器
1. 版本跳转:git reset
git reset --hard HEAD^ // 回退到上一个版本
git reset --hard HEAD^n // 回退n个版本
git reset --hard + hashID // 回退到指定版本
理解:HEAD代表当前指针,^表示向前回退一个版本。
2. 查看指针移动历史:git reflog
git reflog
为什么重要:git reset后,如果想找回被回退的版本,git reflog会显示HEAD指针的所有移动历史。
3. 撤销修改:git checkout
git checkout -- fileName // 撤销工作区的修改,恢复为仓库中的版本
关键点:git checkout -- fileName会完全覆盖工作区的修改,不会保留任何更改。
4. .gitignore文件
.gitignore 是一个告诉 Git 哪些文件或目录不要纳入版本控制的配置文件。
换句话说:你不想让 Git 跟踪某些文件(比如日志、缓存、依赖包、密码文件等),就可以把它们写进 .gitignore,Git 就会自动忽略它们。
// 忽略所有 .log 文件
*.log
// 忽略 node.js 项目的依赖目录
node_modules/
5.一张图总结Git本地仓库管理
通过 git add 将工作区代码提交到暂存区(stage),对暂存区代码进行git status确保所提交的代码与预想无误,再通过git commit将暂存区代码确认提交到本地仓库,HEAD指针指向新提交的代码hashID,通过git reset移动HEAD指针,进行版本跳转
五、Git最佳实践总结
- 小步提交:不要"一次提交所有修改",而是"完成一定意义的工作后再提交",多次“add”,少“commit”
- 提交信息规范:清晰描述修改内容,使用"动词开头",简介准确
- 先diff再commit:重大修改前确认差异
- 分支管理:主分支(master/main)用于稳定版本,功能开发在分支上进行
- 远程仓库:使用Gitee/GitHub等平台进行协作,避免直接操作远程仓库
六、结语
Git不只是一个简单的代码管理方式,更是我们代码小白的一段学习路程,我们可以通过每天的“push”,记录我们代码学习的路程,每当学习遇到瓶颈,学习想要放弃的时候,看到这一路过来的“push”,或许会重新充满斗志。
同时,Gitee作为一个开源代码管理平台,我们也可以从此借鉴到许多优秀的创作者的开源项目,我们也同样可以在上面分享我们的创意,相互交流学习,彼此促进。
三十功名尘与土,八千里路云和月。愿你我共勉。