目录
拓展阅读:促进团队合作的代码管理
一、什么是代码管理?
代码管理,又称版本控制系统,是软件开发过程中不可或缺的一部分。它的发展历程与计算机技术的进步和软件开发实践的变化紧密相关。在早期的软件开发中,代码管理并不受重视,因为项目规模较小,开发团队成员较少,协作的需求不高。然而,随着计算机技术的发展,软件项目变得更加庞大和复杂,团队成员也越来越多,代码管理的必要性逐渐凸显。
最初,代码管理依赖于简单的文件备份和复制,但这很快被证明是低效且容易出错的。随后,集中式版本控制系统出现,他们通过一个中央服务器来管理所有文件的变更和历史记录。这种方法提高了效率,但仍然存在单点故障的风险。现在,分布式版本控制系统逐渐成为主流,它们没有中央服务器,每个开发人员都拥有一个完整的版本库副本。这样,即使中央服务器发生故障,开发人员也可以继续工作。
二、为什么需要分布式版本控制系统及Git的诞生
随着开源软件的兴起,代码管理的需求也越来越大。开源软件项目往往由来自世界各地的志愿者共同开发,代码管理变得尤为重要。Linux内核的开发就是一个很好的例子。Linux内核是一个巨大的项目,由来自世界各地的开发者共同参与。早期,Linux内核的开发使用的是一种名为BitKeeper的集中式版本控制系统,但随着项目的不断壮大,集中式版本控制系统逐渐变得难以管理。于是,Linus Torvalds亲自设计并开发一个分布式版本控制系统(Distributed Version Control System,DCVS),名为Git。Git迅速取代了BitKeeper,成为了Linux内核开发的默认版本控制系统。
三、Git的发展
Git发展到现在,已经成为了全球最流行的分布式版本控制系统之一。实际上,不仅是开源软件使用Git管理代码,很多大型企业也使用Git来管理代码。因此,学会使用Git进行代码管理,已经成为软件开发者的必备技能。
基于Git技术的代码管理网站也越来越多,比如国外的有GitHub、GitLab等,国内的则有Gitee、GitCode等。这些网站提供了一个在线的代码仓库,开发者可以在上面分享和协作代码。开发者既可以在上面查看他人的代码,也可以上传自己的代码供他人查看和协作。企业如果需要代码管理服务,但并不想自建服务器,也可以选择这些网站。如果害怕代码泄露,企业可以在这些代码管理网站上使用私有仓库,只有授权的用户才能访问代码。
现代流行的IDE普遍支持Git,比如Eclipse、IDEA、Visual Studio Code、PyCharm等。这些IDE内置了Git客户端,使得开发者可以在IDE中直接使用Git管理代码仓库。
四、使用Git管理你的项目代码
作为一个软件开发的初学者,你可能没有代码管理的需求。但如果你需要和你的小伙伴协作开发一个小项目,不妨试着使用Git来管理你的代码,在实践中逐渐掌握Git的使用方法。
4.1 Git的基本概念
网络上的Git教程汗牛充栋,但很多教程为了让初学者快速上手,往往直接讲授命令操作,却把一些概念讲解得过于简单。有的时候即使操作成功,但初学者往往一头雾水。为了帮助大家更好地理解与使用Git,这里先介绍一些最基本的概念。
- 工作区(Working Directory):工作区是开发者用来编辑代码的地方,未加入暂存区的文件不能提交到仓库。
- 暂存区(Stage):暂存区是Git用来保存将要提交的文件的地方,Git会跟踪加入暂存区的文件。
- 仓库(Repository):仓库是Git用来保存代码历史记录的地方,可以将暂存区中的文件提交到仓库。
- 本地仓库(Local Repository):本地仓库指的是开发者自己电脑上的代码版本库。
- 远程仓库(Remote Repository):远程仓库指的是代码管理网站或某个远程服务器上的代码版本库。
- 提交(Commit):提交是Git用来保存代码历史记录的一个版本。
- 分支(Branch):分支是用来保存代码不同版本的地方。Master分支是默认的分支,用来保存项目的主要代码。
- 分支合并(Merge):分支合并指的是将两个分支的代码合并到一起。比如A、B两个小伙伴可以对同一个分支进行开发,当A完成开发后,可以将A的代码合并到Master分支上,当B完成开发后,也可以将B的代码合并到Master分支上。从而实现了协同开发。
- 推送(Push):推送是用来将本地仓库的代码提交到远程仓库的一个操作。
- 拉取(Pull):拉取是用来从远程仓库获取最新代码的一个操作。
- 克隆(Clone):克隆是用来复制一个远程仓库到本地仓库的一个操作。
- 冲突(Conflict):冲突指的是两个分支修改了同一个版本的文件,导致无法直接合并的情况。
工作区、暂存区与仓库的概念是Git中最基本的概念,也是初学者最容易混淆的概念。可以查看如下图进一步深入理解:
Git中还有很多其他的基本概念,如标签、星号(*)、HEAD、.gitignore等,但作为初学者暂时无需了解,仅需掌握上面讲解的核心概念即可。
4.2 Git操作入门
下面,我们通过一个应用场景来说明Git的基本概念。
应用场景:
你想要将本机的某一个IDE中的项目先纳入本地Git仓库管理,并希望待项目整体框架编写完毕以后,将本地Git仓库中的代码提交到代码管理网站上分享给你的小伙伴让他们可以查看和协作。
0. 安装Git客户端
首先,你需要在你的电脑上安装Git客户端。Git客户端的安装方法因操作系统而异,请自行搜索相关教程。有的IDE自带Git,有的则需要你自行安装。
1. 新建项目
假设你是一个软件开发新手,正在开发一个名为HelloWorld的软件。你希望在本机的IDE上使用Git来管理代码。首先,你在IDE中新建了一个HelloWorld项目,这个项目现在还未纳入Git管理,就是一个普通的项目。这时候你在项目中新建了一个HelloWorld.java文件,并添加了一些代码。
2. 创建本地仓库
接下来,你决定将这个项目纳入Git管理,因为只有纳入管理,才能使用Git跟踪、控制你对项目中每个文件的修改。你创建了一个HelloWorldRepo的Git Repository。然后,将HelloWorld项目添加到HelloWorldRepo中。这时,HelloWorld项目就纳入了Git管理。现在你的HelloWorld项目中的所有文件(假设包含了HelloWorld.java与Test.java这两个文件),已经在Git的工作区中,但并未被Git跟踪。创建仓库对应的Git命令是git init
。
3. 将文件加入暂存区
接下来,你决定将HelloWorld.java文件纳入Git跟踪,但Test.java还未编写完成,暂时不纳入Git跟踪。这时,可将HelloWorld.java文件添加到Git的暂存区中。现在你对HelloWorld.java文件的修改已经纳入Git跟踪,这时对HelloWorld.java文件的修改不会被Git忽略,而对Test.java文件的修改不会被Git跟踪。实际上,项目中的某些文件可以不用放入暂存区,比如本机IDE相关的配置文件、日志文件等。添加文件到暂存区的Git命令是git add <file>
。一般来说每次对文件进行有效修改后,都应调用该命令再次将文件加入暂存区。
4. 提交修改到本地仓库
接下来,你决定将HelloWorld.java文件提交到Git的本地仓库中。这时,Git会根据你对HelloWorld.java文件的修改,生成一个快照,并将其保存到本地仓库中。你可以对HelloWorld.java文件进行多次修改,每次修改后,都可以将修改提交到本地仓库中。而仓库中会保存所有对HelloWorld.java文件的修改历史。提交修改对应的Git命令是git commit -m <message>
。其中<message>
指的是你提交修改的说明。注意,因为Test.java未放入暂存区,所以进行提交的时候,Test.java的修改不会被提交到本地仓库中。
5. 关联远程仓库
接下来,你决定将本地仓库与代码管理网站上你新建的远程仓库关联起来。关联本地仓库对应的Git命令是git remote add origin <url>
。其中<url>
指的是远程仓库的URL地址。这时,你的小伙伴就可以通过这个URL地址来访问你的远程仓库了。
6. 推送修改到远程仓库
接下来,你决定将本地仓库中的所有修改推送到远程仓库中。可以使用git push -u origin master
命令来实现。其中-u
参数表示将本地仓库的master分支与远程仓库的master分支关联起来。关联后,以后再提交修改时,就可以使用git push origin master
命令了。所以注意了,Commit
与Commit and Push
是有区别的,Commit
只是将修改提交到本地仓库中,而Commit and Push
是将修改提交到本地仓库,并将其推送到远程仓库中。
7. 克隆远程仓库
接下来,你的小伙伴决定克隆你的远程仓库。这时,你的小伙伴就可以通过git clone <url>
命令来克隆你的远程仓库了。通过在IDE中进行正确配置,小伙盘可以直接在IDE中查看远程仓库的代码,并进行修改。
8. 拉取远程仓库的修改
接下来,你的小伙伴对HelloWorld.java文件进行了修改,并将其提交到了远程仓库中。这时,你可以通过git pull
命令来拉取远程仓库的修改。注意,git pull
命令在实际执行时,会先执行git fetch
命令来拉取远程仓库的修改,然后再执行git merge
命令来合并远程仓库的修改。
9. 解决冲突
多个人对仓库中的同一个文件进行了修改,难免会发生冲突。比如,你的小伙伴在100号版本的HelloWorld.java文件中添加了一行代码并提交并推送到远程仓库,而你也在相同版本的HelloWorld.java文件中添加了一行代码并尝试提交并推送到远程仓库,这时,Git就会提示你发生了冲突。你需要先解决冲突,然后再将修改提交到本地仓库中。解决冲突的Git命令是git mergetool
。一个关于使用Git尽量避免冲突的最佳实践是:在每次需要开始修改代码时,总是先执行git pull
命令来拉取远程仓库的修改。
掌握了以上的基本概念后,你就可以开始使用Git来管理你的项目代码了。当然到具体实践的时候,你还需要查看在你的IDE中如何进行正确的配置。如果使用了代码管理网站,你还需要查看每个网站提供的相关文档来了解如何具体使用。
在命令行还是在IDE中使用Git?
- 使用命令行:可以让你更加灵活地使用Git。你可以通过命令行来执行各种Git命令,比如
git add
、git commit
、git push
等。你也可以通过命令行来查看Git的状态、日志、分支等信息。 - 使用IDE:可以让你更加方便地在IDE中查看和管理你的代码。你可以通过IDE的图形界面来查看Git的状态、日志、分支等,并且可以通过IDE来执行各种Git命令,比如
git add
、git commit
、git push
等。但总的来说,灵活性还是命令行更高一些。
建议:
初学者可以先使用命令行来学习Git的基本概念和基本用法,然后再逐渐过渡到使用IDE来管理你的项目代码。
五、Git的社会价值
Git不仅仅是一款版本控制系统,它更是一种文化、一种哲学,深刻地影响着软件开发领域乃至整个社会的创新与发展,它已经成为了推动技术创新、促进知识共享的重要工具。Git所带来的社会价值非常巨大,可以从如下几个方面进行讨论:
1. 开发模式的转变
传统的集中式版本控制系统在处理大型项目和团队协作时显得力不从心,而Git的分布式特性允许开发者在本地拥有完整的代码库,能够独立工作而不受网络限制。这种模式提高了开发效率,增强了团队协作,也为远程工作和全球协作提供了可能。我们应该认识到,掌握Git不仅是学习一项技术,更是适应现代软件开发工作方式的必要条件。
2. 开源运动与Git相互成就
Git的普及与开源运动的蓬勃发展密不可分。在Git诞生前,开源运动就已经开始蓬勃发展,但那时,开源项目往往由一个人或少数几个人维护,并没有形成真正意义上的团队协作。而Git的出现,彻底改变了开源项目的协作方式。自Git诞生以后,大量的基于Git的代码托管平台涌现出来,这使得开源项目可以更加方便地实现团队协作。Git和开源运动,可以说是相互成就。开源运动的发展,提出了大规模合作开发的需求,而Git的出现,则使得大规模合作开发成为了可能。
可以说Git是一把钥匙,它打开了通往开源世界的大门。通过Git参与开源项目,不仅可以学习到技术,还可以获得宝贵的实践经验,提高自身的专业技能和综合素质。
4. 代码的共享与传播
代码的共享与传播是Git和开源运动的共同成果。通过Git,开发者可以轻松地将自己的代码推送到公共仓库,供其他人学习与使用。这种代码共享的机制极大地降低了技术传播的门槛,使得更多的人能够接触到先进的技术与知识。
对于学子而言,通过Git不仅可以查看他人优秀的代码,还可以将自己的代码轻松分享给他人。大家可以通过共享和传播代码,提升自己的技术能力,同时也在分享与传播中逐渐培养其他方面的能力,如沟通能力、团队协作能力等。
总结:
Git的社会价值远远超越了其作为技术工具的范畴,它深刻地重塑了软件开发的生态,推动了开源运动的蓬勃发展,并加速了代码共享与传播的进程。正如中国古代哲学家孔子所言:“三人行,必有我师焉。”Git的普及恰恰体现了这一思想,每一位开发者都能在协作中学习,共同进步。对于学子而言,掌握Git不只是学习一项技术,更是深入理解现代软件开发理念的过程,是在实践中培养开放心态、协作精神和共享意识的重要途径。古语有言“博观而约取,厚积而薄发”,通过Git的学习和实践,学子们能够广泛吸收知识,积累经验,最终在软件开发的道路上发挥出自己的潜力,为技术创新和社区发展贡献力量。
参考资料
Git与码云(gitee)入门-如何在实验室和宿舍同步你的代码(1)
Git与码云(Gitee)入门-如何在实验室和宿舍同步你的代码(2)
Git学习笔记
思考与练习
- 找到教材所附的Git示例代码仓库,并在代码管理网站上查看。
- 下载并安装Git客户端,尝试使用
git clone
命令克隆教材实例代码仓库到本地的某个目录。 - 使用命令行操作Git。(完成本题时强烈建议使用AI辅助编程工具进行辅助)
- 新建一个目录
src
,放入一些文本文件,如Test.txt
; - 命令行下进入
src
目录,初始化一个Git仓库,命令如下:cd src
,切换到src目录。git init
,这时src目录及其子目录下的文件在工作区,你无法将这些文件提交到仓库中。
- 在命令行设置Git的用户身份信息(姓名,邮箱),这里分为设为
test
与[email protected]
,命令如下:git config --global user.name "test"
git config --global user.email "[email protected]"
- 将
src
目录及其子目录下的所有文件添加暂存区,然后提交到仓库:git add .
,将src
目录及其子目录下的所有文件添加到暂存区。git commit -m "第一次提交"
,提交成功后暂存区中的文件版本进入了仓库。注意:命令中双引号中的为注释,内容可以任意填写,但最好能说明本次提交的目的。
- 使用
git status
查看当前工作区中和暂存区中的文件状态。 - 在
Test.txt
中添加一行内容,然后使用git status
查看状态。 - 在
src
目录中新建一个文件Test2.txt
,然后使用git status
查看状态。- 与步骤6中的状态信息进行比较。
- 仿照步骤四,进行第二次提交。
- 使用
git log
命令查看提交日志。 - 在代码管理网站上创建一个远程仓库(不要初始化),并复制仓库的URL,如
https://gitee.com/test/testsrc.git
。 - 关联本地仓库与远程仓库并推送本地分支到远程仓库,命令如下:
git remote add origin https://gitee.com/test/testsrc.git
,关联命令git push -u origin "master"
,将本地的 master 分支推送到远程仓库的 origin 源分支上。
- 刷新代码管理网站对应远程仓库的网页,查看是否成功推送。
- 新建一个文件
TestRemote.txt
文件,随便输入一些内容。使用git add TestRemote.txt
加入暂存区。 - 在本地提交然后将提交推送到远程仓库,命令如下:
git commit -m "third commit"
git push origin master
- 再次刷新代码管理网站中远程仓库的网页,查看是否成功推送。
- 让你的小伙伴克隆远程仓库到他的电脑。(此实验也可在同一电脑上的不同目录进行)
- 在他的电脑上创建目录
repo
,命令行下进入repo
目录 - 执行
git clone https://gitee.com/test/testsrc.git
,就可以将远程仓库克隆到本地repo
目录下的testsrc
目录中。
- 在他的电脑上创建目录
- 修改
testsrc
目录中的TestRemote.txt
文件,然后提交到远程仓库。 - 在原来的电脑上,使用
git pull
命令将小伙伴的提交拉取到本地。 - 处理冲突:现在A、B两台电脑都通过
git pull
获取仓库中的最新提交。- 分别在A、B两台电脑上对
TestRemote.txt
文件做出不同的修改。 - 在A电脑上添加(
git add
)、提交(git commit
)TestRemote.txt
并推送(git push
)到远程仓库。 - 在B电脑上添加(
git add
)、提交(git commit
)TestRemote.txt
并尝试推送(git push
)到远程仓库。查看是否产生冲突。 - 打开产生冲突的
TestRemote.txt
,删除掉git添加的特殊标记,解决冲突后,重新添加、提交与推送。
- 分别在A、B两台电脑上对
- 刷新代码管理网站中远程仓库的网页,查看是否成功推送。
- 新建一个目录
- 尝试在IDE创建一个Java项目,并使用Git与代码管理网站进行代码管理。
- 能否感受到自从学会"使用博客发表文章,使用Git参与开源项目、管理自己的项目代码"以后,自己的知识得到了沉淀,自己的能力得到了提升,自己逐渐有了开源、共享精神。
- 4.1:在博客中发表一篇文章,内容是关于“学会了博客与Git对我的收获”,文章中最好应该包含一些实际的例子。
- 4.2:尝试使用Git来管理你的这篇使用Markdown格式编写的博文。