Git入门教程
Git分布式版本控制工具
Git 是目前全球最流行的分布式版本控制系统(DVCS),由 Linus Torvalds 于 2005 年为管理 Linux 内核开发而创建。它允许开发者高效地跟踪代码变更、协作开发,并支持离线工作和灵活的分支管理。
认识Git
分布式 vs 集中式
- 集中式(如 SVN):所有代码存储在中央服务器,开发者必须联网才能提交 / 获取代码,依赖中央服务器的完整性。
- 分布式(Git):每个开发者本地都有完整的代码仓库(包括历史记录),无需联网即可提交、查看历史,分支管理更高效。
Git分布式版本控制工具对系统制定了若干目标:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万的并行的分支)
- 完全分布式(去中心化,中心服务器不是必须的)
- 有能力高效管理类似
Linux
内核一样的超大规模项目(速度和数据量)
三个工作区域
- 工作区(Working Directory):本地磁盘上实际编辑的文件。
- 暂存区(Staging Area/Index):临时保存改动的区域,可选择性提交部分文件。
- 本地仓库(Local Repository):通过
git commit
将暂存区内容提交到本地仓库。
GitHub
GitHub
是全球最大的代码托管平台(远程仓库)和开发者社区,主要基于 Git
版本控制系统,为开发者提供代码存储、版本管理、协作开发等服务。它不仅是程序员进行项目开发的重要工具,也是技术交流、开源项目分享的核心平台。
核心功能
- 代码托管与版本控制
- 基于 Git 技术,开发者可以将本地代码上传到 GitHub 的远程仓库,实现代码的云端存储。
- 通过 Git 的分支管理、提交记录、版本回滚等功能,方便多人协作时追踪代码变更,避免冲突。例如,开发者可在自己的分支修改代码,完成后通过 Pull Request(PR) 提交合并请求,经审核后整合到主分支。
- 协作开发工具
- Issues:用于跟踪项目中的问题(如 Bug、功能需求),支持标签分类、指派负责人、关联 PR 等,便于团队分工和进度管理。
- Projects:可视化项目看板,可通过拖拽任务卡片(如 “待办”“进行中”“已完成”)管理开发流程。
- Discussions:类似论坛的功能,用于团队或社区成员讨论技术细节、项目规划等非代码类内容。
- 开源社区生态
- 全球数百万开源项目托管在 GitHub 上,涵盖编程语言(如 Python、JavaScript)、框架(如 React、Django)、工具(如 VS Code 插件)等。用户可免费查看、下载代码,甚至参与贡献(通过 Fork 仓库、提交 PR 等方式)。
- Stars:用户可对喜欢的项目 “点赞”,类似收藏功能,也反映项目的受欢迎程度。
- Fork:复制他人仓库到自己账号,便于基于原项目二次开发。
Git基础
Git工作流程
工作流程图:
- clone(克隆):从远程仓库中克隆代码到本地仓库
- checkout(检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加):在提交代码前先将文件提交到暂存区
- commit(提交):提交本地仓库。本地仓库中保存修改的各个历史版本
- fetch(抓取):从远程仓库拉到本地库,不进行任何的合并动作,一般操作较少
- pull(拉取):从远程仓库拉到本地仓库,自动进行合并(merge),然后放到工作区,相当于
fetch
+merge
- push(推送):修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
Git基本配置
配置全局用户名和邮箱
步骤
- 打开
Git Bash
- 设置用户信息
git config --global user.name "gezishan" #设置用户名
git config --global user.email "3508474917@qq.com" #设置电子邮箱
查看配置信息
git config --global user.name
git config --global user.email
为常用命令配置别名
有些命令指令参数很多,又经常用到,我们可以使用别名简化输入。
步骤
- 打开用户目录,创建
.bashrc
文件
或打开 Git bash
,输入:
touch ~/.bashrc
- 在
.bashrc
文件中编辑内容,设置命令别名
#配置git提交日志命令的别名
alias git-log = 'git log --pretty=oneline --all --graph --abbrev-commit'
#配置用于输出当前目录所有文件及基本信息命令的别名
alias ll = 'ls -al'
Git常用命令
获取本地仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
- 在本地电脑的任意位置创建一个空目录(如test)作为我们的本地
Git
仓库 - 进入这个目录,点击右键打开
Git bash
窗口 - 执行
git init
命令 - 若创建成功,可在文件夹下看到**隐藏的
.git
**目录
此时我们创建的这个目录就是工作目录,工作目录除.git
目录的区域就是工作区,.git
目录中包含暂存区和本地仓库。
基础操作指令
Git
工作目录中对于文件的修改(增加,删除,更新)会存在几个状态,这些修改的状态会随着我们执行Git
命令而发生变化。
每次提交都形成一个版本。
使用命令来控制这些状态之间的转换:
git add #(工作区 -> 暂存区)
git commit #(暂存区 -> 本地仓库)
查看修改状态
- 作用:查看文件修改状态(暂存区、工作区)
- 命令:
git status
添加工作区到暂存区
- 作用:添加工作区一个或多个文件 [的修改] 到暂存区
- 命令:
git add 单个文件名|通配符
例:将所有修改添加到暂存区:git add .
提交暂存区内容到本地仓库
- 作用:提交暂存区内容到本题仓库的当前分支
- 命令:
git commit -m "注释内容"
查看提交日志
在前面为常用命令配置别名中配置git-log
中就包含了下面这些参数,所以后续可以直接使用指令git-log
- 作用:查看提交记录
- 命令:
git log [options]
- options
- –all 显示所有分支
- –pretty=oneline 将提交信息显示为一行
- –abbrev-commit 简短输出的
commitId
- –graph 以图的形式显示
- options
查看所有操作日志
- 作用:查看所有操作日志,包括提交日志,版本回退,版本跳转操作等。
- 命令:
git reflog
版本切换
-
作用:切换到指定版本
-
命令形式:
git reset --hard <commitID>
commitID
可以使用git log
或git reflog
查看
忽略列表
前面提到,可以使用git add .
将所有文件的修改添加到暂存区,如果有些文件不需要添加,可以使用忽略列表配置不需要纳入Git
管理的文件。
- 在工作目录中创建一个名为
.gitignore
的文件(文件名称固定),列出要忽略的文件模式。下面是文件内容的示例:
#忽略所有.a文件
*.a
#忽略doc目录下的所有文件
doc/
#忽略doc目录下的所有.txt文件
doc/*.txt
分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的BUG修改,开发新的功能等,以免影响开发主线。
常用命令
查看本地分支
- 命令:
git branch
head指向的分支为当前分支,master
为主分支。
创建本地分支
- 命令:
git branch <分支名>
切换分支
- 命令:
git checkout <分支名>
我们还可以直接切换到一个不存在的分支(创建并切换)
- 命令:
git checkout -b <分支名>
删除分支
不能删除当前分支,只能删除其他分支。
-
命令:
git branch -d <分支名>
删除分支,进行各种检查。例如:会检查当前分支是否合并到父分支中,若未合并,
Git
会认为此操作可能是误操作,删除会失败。 -
命令:
git branch -D <分支名>
删除分支,不进行任何检查。
合并分支
一个分支的提交可以合并到另一个分支
-
命令:
git merge <分支名>
要将A分支合并到B分支,首先要切换到B分支,然后再执行
git merge <A分支>
,表示将A分支合并到当前分支上。一般情况是将其他分支合并到master
分支(主分支)。合并其实就是内容更新的合并,将其他分支的更新合并到本分支有时会形成新的提交,此时需要定义描述信息。
合并后的版本顺序
当两个分支都有许多版本节点,将其他分支合并到当前分支后,当前分支的版本顺序是怎样的呢?
经过实验,分支合并后的版本顺序如上图所示:将dev
分支合并到当前master
分支后,dev
的所有版本按顺序在master
分支之上,因为当前分支经过合并后形成了新的版本,于是形成了新的版本meger dev
,当前分支的当前版本指向meger dev
,dev分支的当前版本指向dev update2
。
合并冲突
上面提到,分支合并是将其他分支的更新内容合并到当前分支的过程,当分支A和分支B都对同一份文件进行修改,在进行合并时,Git
不知道该使用分支A
的修改还分支B
的修改,合并将报错失败。这就是合并冲突。Git
提示需要将冲突解决后才能合并成功。
冲突解决
Git
不知道该使用分支A
的修改还是分支B
的修改,所以它将两种修改都保留在文件中,让开发者自己决定使用何种修改。
如上图所示:Git
对文件的修改显示出当前分支对该文件的修改部分和待合并分支对该文件的修改部分。将该文件改成自己想要的样子即可解决冲突。
在Git
的实现上,其实只要出现合并冲突,再进行一次代码提交形成新的版本(该新版本Git将视为你解决了冲突)即可合并成功。
分支使用流程与规范
在实际开发中,一般有如下分支使用规范与流程
- master(生产)分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支。
- develop(开发)分支
是从master
分支中创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完毕后,需要合并到master
分支,准备上线。
- feature/xxxx分支
从develop
中创建的分支,一般是同期并行开发,但在不同时期时创建的分支,分支上的研发任务完成后合并到develop
分支上。
- hotfix/xxxx分支
从master
派生的分支,一般作为线上bug
修复使用,修复完成后需要合并到master
、test
、develop
分支。
- 还有一些其他分支,如
test
分支,pre
分支(预上线分支)等等。
远程仓库
前面我们已经知道了Git
中存在两种类型的仓库,即本地仓库和远程仓库。那么我们将如何搭建Git
远程仓库呢?我们可以借助互联网上提供的一些代码托管服务平台来实现。比较常用的有:GitHub
、码云
、GitLab
等。
- GitHub(https://github.com)是面向开源及私有软件项目的托管平台,因为只支持
Git
作为唯一的版本库格式进行托管,故名GitHub
,是全球最大的代码托管平台。 - 码云(https://gitee.com)是国内的一个代码托管平台,由于服务器在国内,所以相比
GitHub
,码云速度更快。 - GitLab(https://about.gitlab.com)是一个用于仓库管理系统的开源项目,使用
Git
作为代码管理工具,并在此基础上搭建起来的web服务,一般用于企业,学校,单位等内部网络搭建git
私服。
gtiee项目托管
注册
首先进入到gitee
的官网,根据提示注册一个自己的账号。
创建仓库
点击右上角+
号,在下拉菜单中选择创建仓库。填写仓库名,仓库介绍等进行仓库创建。创建完成后是这样的:
- 仓库的
https地址
为https://gitee.com/GeZisShan/gitee_test.git
。观察一下,发现它的格式为https://gitee.com/<账号名>/<仓库名>.git
。https
地址一般用于网页可视化访问仓库。 - 仓库的
SSH地址
为git@gitee.com:GeZisShan/gitee_test.git
。观察一下,发现它的格式为git@gitee.com:<账号名>/<仓库名>.git
。SSH地址一般用于远程仓库的SSH连接的定位。 - 同时平台推荐根据账号的名字和绑定的电子邮箱在
git
控制台中进行一个全局的配置:
git config --global user.name "GeZiShan"
git config --global user.email "3508474917@qq.com"
(这里我的gitee
的账号名为GeZiShan
,邮箱为3508474917@qq.com
)上述代码在前面已经讲过,这里不在赘述。
- 页面还给出一个简单的创建仓库的
demo
,见上图。
身份认证
创建仓库后,可以将本地仓库的项目推送至创建的远程仓库,在推送时需要进行身份认证,有权限的人才有资格推送至远程仓库,常见的身份认证方式有1.账号-密码认证
,2.公钥-私钥认证
。
账号-密码认证
每次都要输入账号和密码,较为复杂,公钥-私钥认证
较便捷一点。下面介绍公钥-私钥认证
:
公钥-私钥认证
使用SSH
公钥可以使我们的电脑和Gitee
通信的时候使用安全连接(Git的Remote要使用SSh地址)。
1. 生成SSH
公钥
-
在
Git Bash
中输入:ssh-keygen -t rsa
(rsa
时非对称密钥的一个算法) -
不断回车确定,如果公钥存在则会被覆盖。
-
获取密钥:
cat ~/.ssh/id_rsa.pub
(这个代码其实就是将密钥拷贝到文件中)
2.gitee
平台中配置SSH
公钥
- 点击在右上角的我的,在下拉菜单中选择设置,设置界面的左侧菜单选择 SSH公钥。
- 填写一下公钥标题,将生成的公钥粘贴到下方。
*小知识:不同平台的Git Bash
中的复制粘贴快捷键有所不同,我的windows平台的复制快捷键为:Ctrl + Insert
,粘贴快捷键为:Shift + Insert
。
3.Git Bash
中验证公钥是否配置成功
- 命令:
ssh -T git@gitee.com
该命令会尝试与Gitee
远程服务器根据设置的SSH公钥建立SSH安全连接,初次连接需要确认一下。
如图所示出现 “successfully” 字样就说明公钥配置成功,测试连接成功!
项目推送
- 在本地仓库中配置其对应的远程仓库
- 命令:
git remote add <远程仓库的本地别名> <远程仓库的SSH地址>
绝大多数情况下本地仓库对应的远程仓库只有一个,一般将远程仓库的本地别名
统一写为origin
。
对于我的远程仓库,我的命令为
git remote add origin git@gitee.com:GeZisShan/gitee_test.git
- 查看当前本地仓库对应的远程仓库
git remote
- 将本地项目推送至远程仓库
- 命令:
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]]
- 若远程分支名和本地分支名相同,则可只写本地分支名
git push origin master
- -f 表示强制覆盖(很少用)
--set-upstream
推送到远端的同时建立起本地分支和远端分支的关联关系(后面再推送时,不用再指定关联关系)。git push --set-upstream origin master
- 若当前分支已经和远端分支关联,则可以省略分支名和远端名
git push
将master分支推送到已关联的远端分支- 注:使用
git branch -vv
命令可以查看本地仓库分支与远程仓库分支的对应关系
- 若远程分支名和本地分支名相同,则可只写本地分支名
项目克隆
前面将了将【项目推送】即将本地仓库的项目推送至远程仓库,对应的,还有【项目拉取】,即将远程仓库中的项目克隆到本地。
-
命令:
git clone <远程仓库的SSH路径> [生成的本地目录名]
-
解释:该命令会在当前所在目录创建一个目录,目录内容就是项目内容,目录名称为指定的名称,若不指定本地目录名,目录名默认为远程仓库名。
项目抓取与拉取
在团队协作中,通常进行一次项目克隆即可,当远程仓库中的项目发生更新后,本地端只需随之更新即可,而不是将本地的旧项目删了再重新克隆。
远程分支和本地分支一样,我们可以进行merge
操作,只需先把远程仓库里的更新都下载到本地,再进行操作。
抓取
- 命令:
git fetch [remote name][branch name]
- 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并。
- 注:如果不指定远程名称和分支名,则抓取所有分支。
可以理解抓取是一个缓存下载的过程,它不会去更新本地项目的当前分支。
要将当前本地分支合并到最新的远程分支上,可以使用git merge [远程分支]
命令,相当于将本地项目更新到最新状态。
拉取
- 命令:
git pull [remote name][branch name]
- 拉取指令就是将远端仓库的修改到本地并自动进行合并,等同于
fetch+merge
。 - 注:如果不指定远程名和分支名,则抓取所有并更新当前分支。
在很多情况下,是将远程分支的内容下载后,直接将本地分支更新合并,每次使用git fetch
命令后再使用git merge
命令太麻烦了,于是就有了git pull
命令。
与远程的合并冲突
在进行远程多人协作中,A,B用户修改了同一个文件,A用户将本地文件修改后推送至远程仓库,此时B拉取远程仓库的提交,合并远程仓库的分支就会产生合并冲突。
因为远程仓库的分支也是分支,所以合并冲突的解决和本地分支的合并冲突的解决一致,这里就不再赘述。
IDEA中使用Git
预配置Git
打开Intellij IDEA
(我下面的演示是基于2024.2.3版本),idea会自动检查Git
的位置,也可以手动配置Git
的位置。选择file->Settings
(文件->设置
),找到Version Control
(控制版本
)的Git
选项:
操作Git
本地已经有了一个项目,它现在还不是Git
项目,我们需要将这个项目放在码云(gitee)的仓库中,和其他开发人员继续协作开发。
1.创建远程仓库
参考远程仓库-gitee项目托管-创建仓库
。
2.初始化本地仓库
创建完成后,资源管理器打开项目目录就会创建出.git
的隐藏文件,idea的顶部快捷菜单也会出现Git当前分支
操作的菜单项,菜单视图显示的是当前分支的分支名,该菜单项的下拉菜单会有很多操作,具体如下:
可以看到,在初次创建本地仓库后,许多文件标红,这是在提示这些文件的更新未提交,我们可以选择顶部当前分支操作菜单项的下拉菜单选择提交操作,或者使用快捷键【Ctrl+K】,此时即可将代码提交到本地仓库产生一个新的版本。
3.项目推送至远端仓库
选择当前分支操作菜单项的下拉菜单选择推送操作,或者使用【ctrl+Shift+K】,初次推送时要配置远程仓库的地址:
也可使用提交并推送完成代码的本地提交后再推送至远程,提交后可查看版本节点树:
4.拉取远程仓库
克隆
在顶部菜单栏选择【VSC->从版本控制中获取】,当项目初始化为本地仓库后,VSC
菜单项会变成Git
菜单项,此时选择【Git->克隆】,
填写好URL和目录信息后点击克隆即可将远程的项目克隆到本地。弹窗如下:
从远端拉取项目更新本地代码
Git开发规范
- 切换分支前先提交当前分支的修改。
- 代码及时提交,提交后不容易丢失。
学习资料来自网络。