面向新手的git实战教程

news2025/7/18 20:19:17

嗨!我是团子,大家好久不见呀~


记得之前在网上学习git相关知识时,看到的文章大部分都是讲解git的基本命令有哪些,用处是什么,但是自己真正上手使用git时,仍然无从下手。


所以今天就想从初始化一个git仓库开始,一边教大家实践git,一边讲解git的命令有哪些!


什么是git

在实践git之前,我们需要先理解一下什么是git。


请教了一下chatGPT,给出的答案如下图所示:

概括来说,Git是一种开源的分布式版本控制系统,可以跟踪文件的每一次修改,方便团队协作和软件开发。


git的工作区示意图如下所示,大家可以先有个印象,我们后面慢慢理解它~


安装及配置git

安装git

在了解了什么是git后,我们需要先确保自己的电脑上安装了git的全局环境,这样才能使用git来管理我们的代码。


安装git的途径有多种, 对于windows环境的用户,这里推荐去Git的官网:

https://git-scm.com/downloads下载自己的电脑系统对应的安装包,然后通过可视化界面进行安装。


Mac环境的用户推荐使用Homebrew进行安装,网上的安装教程有很多,大家可以去搜搜看~


当安装完毕后,在命令行中输入git --version,如果出现了git的版本号,则说明安装成功啦~



配置git

完成了git的安装后,我们还需要对git进行简单的配置才能进行正常的使用。


具体来说就是需要生成用户名、邮箱以及推拉代码需要的公钥和私钥


1.打开git bash窗口
2.配置git用户名

git config --global user.name "account name"

3.配置用户邮箱

git config --global user.email "account email"

4.生成公钥、秘钥(填自己的邮箱,执行后按几次enter直到结束)

ssh-keygen -t rsa -C "xxx@xx.com"

5.通过命令行或者文件夹找到 .ssh所在目录,拷贝公钥

// Mac
cd ~/.ssh (如果不在.ssh文件夹需要执行此步)
cat id_rsa.pub
// windows
默认在:C:\Users\xxx\.ssh\id_rsa.pub

6.将公钥添加到云端的代码托管平台,如:githubgiteegitlab等等,便于日后直接推拉代码。


至此就完成了git相关的配置!


git实战

接下来,我们就以协同开发一个前端算法仓库为例开始实战吧!

1.初始化代码仓库

初始化代码仓库有两种形式:

是在云端代码托管平台(本文以github为例)创建云端仓库,然后在本地空文件夹下执行:

git clone 远程项目的ssh地址

从而完成云端的项目初始化以及本地项目与远程仓库建立连接。


是在云端代码托管平台创建了云端仓库后,在本地一个空文件夹(项目文件夹,取名别用中文)下使用git init创建本地git仓库,然后使用下述命令来与远程仓库建立连接。

git remote add origin 远程项目的ssh地址

github代码托管平台为例,如果我们是项目的创建者,则需要在云端创建一个代码仓库供项目开发成员协作开发。


在我们点击Create repository按钮后,就会初始化一个空的云端仓库了。


因为此时的云仓库里啥都没有,github就会出一些提示来帮助远程仓库和本地仓库建立连接:

按照图中的说法,本地仓库和云端仓库建立连接有两种办法:

是本地空白项目文件夹下使用git init初始化本地仓库,并添加README.md文件,然后依次执行如下命令:

git add README.md // 添加项目说明文档至本地仓库缓存区
git commit -m 'first commit' // 使用commit将文档添加进本地仓库
git branch -m master // 本地生成一个master分支,用于后续项目开发

然后执行如下命令和远程仓库建立连接:

git remote add origin 远程项目地址

最后使用git push命令将本地更改同步到云端。

git push -u origin master

这里的 -u 参数的含义是在进行推送代码到远端分支,且之后希望持续向该远程分支推送时,可以在推送命令中添加 -u 参数,简化之后的推送命令输入。
这样以后执行git push就相当于执行git push origin master

是本地项目已经是初始化后的git项目时,直接执行下面三条命令即可和云端建立起连接:

git remote add origin 远程项目地址
git branch -m master 
git push -u origin master

与此同时,如果我们只是项目的开发者,并不是创建者的话,只需要在有项目开发权限情况下执行下述命令拉取远程仓库代码就行啦:

git clone git@github.com:dossweet/algorithm-practice.git

语法格式为:git clone (-b) (远程分支名) 项目地址。括号里的 -b 远程分支名用于克隆云端指定分支的代码,不加时默认为远程主分支代码。

2.协作开发

在团队协作开发中,项目成员一般会按照功能(feature)在本地创建分支(branch)进行开发,并在功能开发完毕后推送代码到云端仓库,然后等待相关人员review代码,确保代码质量无误后merge进项目主分支,然后在云端和本地删除无用的分支(可选)。


因为本文创建的只是一个案例项目,因此项目结构比较简单。


首先执行git branch命令查看本地项目分支:

因为前面我们只创建了一个master主分支,所以branch只有一个。


本地的master分支一般用作主分支来和远程主分支代码进行交互。因此我们需要先在本地创建一个新分支来编写具体的功能代码。


checkout指令用于切换分支,加上-b参数表明切换的分支需要新建。

git checkout -b sort-algorithm

然后执行git branch就可以发现本地有两个分支了,而且当前处于sort-algorithm分支。


接下来,我们在项目根目录下新建一个堆排序的js文件,并填充算法内容:


然后执行git status查看当前的仓库状态:

git status


发现文件都是红色,这表明我们编写的代码还没有录入本地。


除此之外,还多出了 .idea/ 文件,这是webstorm编辑器自带的配置文件,使用vscode编辑器会有 .vscode文件也是同理。


这种配置文件一般是不需要上传到云端代码仓库中的,因此我们需要在项目文件夹下生成 .gitignore 文件,来把不需要协作的文件放进去。


这样以后就再不会在git命令行中出现这个文件啦~


再次执行git status,发现 .idea/ 不见了,取而代之的是 .gitignore


然后执行git add . 操作把这两个文件放进本地的仓库暂存区中:

git add .

git add 文件名操作会把文件添加进本地的仓库暂存区,如果一次性想添加所有文件的话,可以直接用.来代替。


再次执行git status命令,就会发现文件变成了绿色,这表明文件已经到了本地git仓库暂存区。


接着我们执行git commit命令来把添加至本地暂存区的代码提交至本地项目仓库中。格式为:git commit -m “提交信息”

git commit -m "feat: 新增堆排序"


接着我们再执行git status命令查看文件状态,就会发现本地没有无状态的文件了,这表明所有的文件都已进入了本地代码仓库。

接着我们需要把本地完成的功能提交到云端。


通常来说,在项目开发中,我们需要在云端仓库中新建一个和本地分支命名相同的远程分支,然后本地分支完成当前功能后,将代码推送到远程同名分支,然后由项目负责人review代码,确认无误后将代码合并到远端主分支中。


因此我们需要先在远程分支中创建一个同名的分支:

然后在本地执行git push <远程主机名> <本地分支名>:<远程分支名> 将本地当前分支的代码推送到云端分支中。当本地分支与要推送的云端分支名相同时,可省略远程分支名。


我们执行下列代码:

git push origin sort-algorithm


然后云端仓库对应分支就会同步更新推送上来的分支代码为最近版本,同时出现是否pr(pull request)的提醒:

功能开发者可以自行选择是否提pr(pull request),如果功能开发完成,就可以提pr啦!


此时代码reviewer就会审查代码并给出意见。如果需要修改代码,就需要开发者本地修改后重新push;如果不需要修改,则reviewer可以merge当前pr到项目主分支。

当分支代码被merge后,本地和远程就可以选择删除sort-algorithm这个分支啦!
到此步,就完成了一次本地代码和远程代码的同步


然后在之后的每次新功能开发中,项目开发者需要先在本地执行git checkout <本地分支名> 切换到项目主分支master,执行git pull <远程主机名> <远程分支名> 获取云端仓库最新版本的代码。

git checkout master
git pull origin master


然后执行git checkout -b <本地分支名> 创建一个本地新分支继续开发新功能。或者执行git checkout <本地分支名> 在已有的分支上继续开发新功能!


以上就是我们项目开发中最常使用的一些基本命令啦!


汇总一下,大概包含如下一些指令:

git clone (-b) (远程分支名) 远程项目地址
git status
git branch
git branch -r //查看远程分支名
git branch -a //查看本地分支名+远程分支名
git branch -m <本地分支名> // 修改本地分支名
git branch -d <本地分支名> // 删除本地分支
git add <本地文件名>(全部文件时用.代替)
git commit -m "提交说明"
git push <远程主机名> <远程分支名>
git push -f <远程主机名> <远程分支名> // 强制推送,平常不推荐使用
git checkout -b <新分支名称>
git checkout <本地已有分支名称>
git pull <远程主机名> <远程分支名>
git remote add <远程主机名> <远程项目地址>
git log // 查看日志

除此之外,在项目开发中,还有一些高频进阶指令我们最好掌握:


进阶指令

1.合并操作

在多人协作开发过程中,合并操作是我们经常会遇到的一个场景。


关于合并操作,常用的两个git命令是mergerebase。关于什么时候用merge,什么时候用rebase,通过实践和总结,我得出来的结论如下:


当我们需要合并自己分支的代码项目公共分支上时,推荐使用merge指令。


因为merge指令会保留完整的commit记录,方便开发者溯源。


继续拿我们的模拟仓库来说,假设有两个开发者A、B克隆了远程主分支C1版本的代码在本地进行独立开发。


其中开发者A在本地没有创建自己的分支,直接在master分支上进行了开发,新增了一个堆排序,并提交了代码到云端主分支。

那么此时云端主分支的代码版本就变成了C2


此时,开发者B基于云端的C1分支,在本地新建了一个自己的分支dev进行开发,同时也是新增了冒泡排序这个文件。


那么在开发者B想要合并代码时,就需要借助merge操作了。


并且如果开发者B想直接merge代码到项目主分支的话,git会报错提示:当前主分支版本 (C1) 落后于远程主分支版本 (C2) ,此时我们需要先执行git pull命令,再在本地主分支上执行merge分支dev的操作,然后再推送到云端。


与此同时,因为开发者A和开发者B修改了同一个文件,那么在merge代码时就可能存在冲突问题需要解决。

代码中的冲突示意( 需要根据项目情况进行修改 ):

合并示意图如下所示:

当我们需要基于远程公共分支在本地自己的分支上进行开发时,推荐使用rebase指令 。


因为这会使我们的commit记录呈线性变化,非常清晰。


以模拟项目为例,我们本地新建了一个分支叫array-algorithm。并想在项目公共分支的基础上进行代码编写。那么此时就可以使用rebase操作,因为它会呈现出一条清晰的commit
image.png
其实rebase更准确的说法应该叫变基。


以我们的模拟项目为例,如果想要将基分支 (master) 修改到待变为基分支的array-algorithm分支上时,


就需要先执行checkout切换分支到master分支,然后执行git rebase操作,这样就会以array-algorithm的最新一次提交作为新的基底,并把master分支公共父节点之后的版本追加到新基底之后~

git checkout master
git rebase array-algorithm

2.回滚操作

在使用git进行协作开发时,回滚也是非常高频的操作之一了。


所谓回滚操作,指的是commit的代码版本有不正确之处,想要回退代码。


关于回滚操作,git中有两条指令可以实现:resetrevert。相比于reset指令来说,更推荐使用revert指令。


reset指令


reset指令指的是让代码回滚到之前的某次commit版本,同时清除这条commit之后的所有新commit。


如果开发者是在自己的分支上执行reset倒是可行,但是如果在公共分支上执行reset指令,则可能出现冲掉其他开发者提交的commit的情况,因此reset指令需要慎重使用


回到我们的项目中,本地切换分支到array-algorithm,小修改一下代码,然后重新执行commit:

然后使用git log查看本地提交记录。发现刚提交的commit为最新版本。此时如果想回退到上次的commit版本时,可以使用 git reset --soft commit id 来进行回退:

  git reset --soft 86896b7a350


此时,我们再查看提交记录,就会发现版本回退到了上次提交的版本:


一般来说,使用reset指令回退了代码后,在推送到云端仓库时会报错,提示本地代码版本落后于远程分支代码(因为回退了代码嘛),此时我们就需要使用 git push -f 来进行强制推送。
需要注意的是:强制推送会使本地代码直接覆盖远程分支代码,因此需要谨慎使用!

git push -f <远程分支名>

revert指令


相比于reset直接回退到指定版本的commit来说, revert的原理是在当前提交后面,新增一次提交,从而达到抵消掉之前commit的版本导致的所有变化。它不会改变过去的历史,所以不会存在丢失代码的风险,因此是回滚的首选方案


回到我们的项目中,在array-algorithm分支上,小修改一点代码。然后commit内容到本地仓库:

接着执行一下git log查看一下本地提交记录:

发现最新的commit id为74a5219打头。如果此时我们想要回滚commit id为86896b7a的代码,
就可以使用git revert来实现:

  git revert 86896b7a

然后执行git log,就会发现新增了一次commit,内容中删除了我们回滚的代码版本中的内容。

大家需要区分的一点是: git reset后面跟的commit id是我们想要回退到的commit版本,而git revert后面跟的commit id是开发者想要删去的commit版本。


总结

掌握git中高频指令的使用方式可以大大提高协同开发的效率。市面上也有很多可视化的工具来帮助大家更好的上手git,比如:forksmartGit


本文主要讲解了git中最基本最常用的一些指令。坦白说,git中的学问远不止这些,但个人建议大家不要狂啃理论,在实践中用到时再去学可能会记得更牢固!


下一篇聊聊前端跨域~


参考文献:
[1]https://blog.csdn.net/lala_yanzi/article/details/124962662
[2]https://blog.csdn.net/awei970512/article/details/127029596
[3]https://blog.csdn.net/Lakers2015/article/details/111318801
[4]https://juejin.cn/post/6844903749631098893
[5]https://m.runoob.com/git/git-reset.html
[6]https://geek-docs.com/git/git-cmds/git-reset.html
[7]https://juejin.cn/post/6974184935804534815

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quartz 快速入门案例,看这一篇就够了

前言 Quartz 是基于 Java 实现的任务调度框架&#xff0c;对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api&#xff0c;这意味着开发人员拥有最大的操作权&#xff0c;也带来了更高的灵活性。 什么是任务调度&#xff1f; 任务调度指在将来某个特定的时间、固…

rabbitmq topic模式设置#通配符情况下 消费者队列未接收消息问题排查解决

目录说明说明 生产者配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.# 消费者代码配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.user PostConstructpublic void twoRabbitInit() {//声明交换…

基于微信小程序云开发实现考研题库小程序项目(完整版)

今天手把手的带大家实现一款答题类的题库小程序&#xff0c;如果着急的话&#xff0c;可以直接去看文末源码.下载与项目部署。考研题库小程序云开发实战&#xff0c;完整版提供给大家学习。题库小程序&#xff0c;基于云开发的微信答题小程序&#xff0c;软件架构是微信原生小程…

YOLOv8进行改进并训练自定义的数据集

一.训练数据集准备 YOLOv8的训练数据格式与YOLOv5的训练数据格式一致&#xff0c;这一部分可以进行沿用。之前博文有发布VOC标注格式转YOLO标注格式的脚本&#xff0c;有需要可以查看。 二.项目克隆 YOLOv8项目文件可以直接去github上下载zip文件然后解压&#xff0c;也可以直…

Telerik UI for WPF 2023 R1

Telerik UI for WPF 2023 R1 之 WPF 的 Telerik 用户界面&#xff0c;WPF 控件库开发人员信任&#xff0c;快速构建美观、高性能的 WPF 业务应用程序。现在支持 .NET 6 和 7.0。 概述部分背景图像 主要特征 现代专业主题图标&#xff0c;现代专业主题 通过各种受 Office、Wind…

【机器学习】P0 基础与相关名词

机器学习基础与相关名词什么是机器学习监督学习与非监督学习Classification And RegressionClusteringModel and Function什么是机器学习 机器学习是计算机发展到一定阶段的必然产物。相比于19世纪一个房间大小的计算机&#xff0c;当前的计算机更便携&#xff0c;性能更强&am…

开源项目-旅游信息管理系统

哈喽,大家好,今天给大家带来一个开源系统-旅游信息管理系统 前台 地址:http://ip/index 账号:user 密码:123456 后台 地址:http://ip/login 账号:root 密码:123456 功能模块:旅游路线、旅游景点、旅游酒店、旅游车票、旅游保险、旅游策略、订单管理、留言管理、数据…

一篇解决Linux 中的负载高低和 CPU 开销并不完全对应

负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候&#xff0c;我们也是经常把负载找出来看一看。在线上请求压力过大的时候&#xff0c;经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗&#xff1f;我来列举几个问题&#x…

c/c++开发,无可避免的模板编程实践(篇二)

一、开发者需要对模板参数负责 1.1 为您模板参数提供匹配的操作 在进行模板设计时&#xff0c;函数模板或类模板一般只做模板参数&#xff08;typename T&#xff09;无关的操作为主&#xff0c;但是也不见得就不会关联模板参数自身的操作&#xff0c;尤其是在一些自定义的数据…

JVM基础学习

JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统&#xff0c;另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区&#xff0c;Native Interface 本地接口Class loader&#xff1a;根据给定的全限定类名来装载class文件到运行时数…

借助docker, 使用verdaccio搭建npm私服

为何要搭建npm私服 搭建npm私服好处多多&#xff0c;网上随便一篇教程搜出来都罗列了诸多好处&#xff0c;譬如: 公司内部开发环境与外网隔离&#xff0c;内部开发的一些库高度隐私不便外传&#xff0c;内网搭建npm服务保证私密性同属内网&#xff0c;可以确保使用npm下载依赖…

RPC技术选型

前言HTTP1.0 & HTTP1.1 & HTTP2.0 & RPCHTTP1.0无法复用连接HTTP1.0 协议时&#xff0c;HTTP 调用还只能是短链接调用&#xff0c;每次发送请求的时候&#xff0c;都需要进行一次TCP的连接&#xff0c;而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网…

金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~

JAVA面试撸题就来【笑小枫】微信小程序啦~ 疫情已过&#xff0c;金三银四即将到来&#xff0c;小伙伴们是否有跳槽的打算呢&#xff1f;不管有没有&#xff0c;技术不能丢&#xff0c;让我们一起来撸题吧。 博主最近整理了一批面试题&#xff0c;包括JAVA基础、多线程与锁、Red…

媒体邀约电视台对商业活动选题有什么要求?如何邀请电视台报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好随着互联网&#xff0c;移动互联网的快速发展&#xff0c;大众在电视上消磨的时间就越来越短了&#xff0c;但是随着新媒体的出现&#xff0c;传统媒体不断的跟进发展&#xff0c;不断打造自己的媒体矩阵&#xff0c;虽然离…

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

图穷了,来搞一搞(内附源码)

本章继续我们的爬虫教程&#xff0c;爬什么呢 &#xff0c;还是斗图&#xff0c;娱乐性的东西&#xff0c;为什么要爬&#xff1f; 因为我图库空了&#xff0c;发现这个网址的图库还是很丰富的。 「注意&#xff1a;如下文&#xff0c;是封装后拆分的&#xff0c;所以详情参照…

Word处理控件Aspose.Words功能演示:使用 C# 在电子邮件正文中发送 Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…

《精通Spring4.x 企业应用开发实战》第12章 Spring 的事务管理难点剖析

目录标题前言一、DAO 和事务管理的牵绊二、应用分层的迷惑三、事务方法嵌套调用的迷茫(事务传播行为)1.Spring 事务传播机制回顾2.相互嵌套的服务方法四、多线程的困惑1. Spring 通过单实例化 Bean 简化多线程问题2.启动独立线程调用事务方法五、联合军种作战的混乱1.Spring 事…

用了 ChatGPT 后,我迫不及待的问了它这 10 个问题

前言20230208 日&#xff0c;ChatGPT 已经联手微软登录必应搜索引擎&#xff0c;谷歌、百度等巨头更是紧随其后着急麻慌的推出自己的 AI 聊天产品&#xff0c;有理由相信&#xff0c;传统搜索引擎时代已经结束&#xff0c;不远的未来&#xff0c;每个人家里都会有一个可以陪你聊…

数字芯片是怎样设计出来的?

芯片在我们的生活和工作中无处不在。例如&#xff0c;交通智能卡就嵌入了一颗带有微处理器、储存单元、芯片操作系统的芯片&#xff1b;而手机的主板则集成了数百颗芯片&#xff0c;有的负责无线电收发、有的负责功率放大、还有的负责存储照片和文件、处理音频&#xff0c;完成…