目录
(一)Git工作区、暂存区、版本库/本地仓库和远程仓库的概念
一、git介绍
(一)Git工作区、暂存区、版本库/本地仓库和远程仓库的概念
图片来自菜鸟教程
- 工作区(workpace):就是本地项目目录
- 暂存区(staging area):又称为索引区(index),它是工作区与本地仓库之间的一个过渡。执行命令git add就是将代码改动提交到暂存区
- 版本库/本地仓库(local repository):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。记录了代码各版本的状态,在需要时可以恢复代码状态到工作区。git commit就是将暂存区代码变动提交到本地仓库
- 远程仓库(remote repository):当你需要备份或者与其他人员共同管理项目时,则需要将项目pull到远程仓库
(二)远程仓库介绍
git在本地环境运行,如果你想通过 Git 分享你的代码或者与其他开发人员合作,则需要将数据放在一个大家都能访问的服务器上。例如:GitHub、Gitee(码云)就是公共远程仓库。
1、GitHub官网https://github.com/https://github.com/
2、Gitee(码云)官网Gitee - 基于 Git 的代码托管和研发协作平台https://gitee.com/
当然我们也可以自己搭建私有的git远程仓库。例如:GitLab。至于还有哪些开源的git仓库管理系统,以及如何搭建,不在本文范围内,以后可能会写一篇文章来介绍。
(三)git 分支介绍
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
有人把 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。 理解和精通这一特性,你便会意识到 Git 是如此的强大而又独特,并且从此真正改变你的开发方式。
二、git使用
介于当初学习git的时候,网上很少讲到git使用的整个流程,碰了不少坑。这里将会记录常用的使用步骤,并且淡化分支管理概念,先不管分支管理的使用。
这里补充一下git bash的很多命令和linux使用相同,例如cd、ls、mkdir等操作,在linux中进行文件操作就不用退出git
(一)git使用流程
当我们有一个项目需要用git来进行版本控制(按下面步骤,将代码提交到本地仓库,才是正常操作,否则会出现问题提示或者没有正确提交代码)
1、使用git init:初始化一个仓库
# 在项目根目录
git init
2、使用git add:当我们要提交第一个版本时,需要先将整个项目添加到暂存区
git add [file/dir/.]
# 示例:git add .
# . :代表项目根路径所有文件
# 也可以是单个文件,git add [文件1] [文件2] [文件..]
# 也可以是子目录,git add [目录1] [目录2] [目录..]
3、使用git commit:将暂存区的代码变化提交到 本地仓库
第一次git commit时,会提示我们需要设置提交的用户信息,包括用户名和邮箱,我们可以在提交前先设置。
git config user.name 'xxx'
git config user.email 'xxx@xxx.xxx'
# --global(可选):对所有仓库生效
然后再提交代码(第一次提交时默认会创建master分支,并提交至master分支)
git commit [option]
# 示例:git commit -m '代码提交'
# -m (必选): 提交说明
# -a (可选): 如果觉得在提交之前还需要add太繁琐,使用该参数可跳过,但也只是对修改和删除文件有效, 新文件还是要 git add,不然就是 untracked 状态
# 可以提交暂缓区的单个文件,git commit -m [option] [文件1] [文件2] [文件..]
工作区/暂存区没新变更时,commit会提示
(二)git远程仓库使用
- 代码版本上传到远程仓库
1、使用git remote add:如果本地没有配置远程仓库地址,需要设置远程仓库地址,才可以将代码pull上该仓库
注:在配置和上传前,需要手动到远程仓库管理系统创建一个项目仓库,得到远程仓库地址。例如GitHub中的一个仓库
配置远程地址
git remote add 仓库别名 远程仓库地址
# 示例:git remote add rigin https://gitHub.com/xxx/xxx.git
# 仓库别名:自行命名,不能与已有仓库配置重名
2、使用git push:配置了远程仓库,将本地仓库(即本地最后git commit了的代码版本)代码上传到该远程仓库并合并(这里先不讨论合并冲突所导致的合并失败,文章后面会专门进行说明)
git push 仓库别名 本地分支名:远程分支名
# 示例:git push origin master
# 如果本地分支名与远程分支名相同,则可以省略冒号
push时,本地没新变更会提示
- 远程代码下载
有下面两种方式
1、使用git clone:将远程代码拷贝到本地。用于第一次代码下载到本地,后续用git pull将远程代码更新到本地
git clone 远程仓库地址
# 示例:git clone https://github.com/xxx/xxx.git
2、使用git pull获取远程代码并合并到本地(这里先不讨论合并冲突所导致的合并失败,文章后面会专门进行说明)
# 没有配置远程仓库的话,需要先git remote add 添加远程仓库
git pull 远程仓库名 远程分支名:本地分支名
# 示例:git pull origin main:master
# 如果远程分支和本地分支名一样,可省略冒号后面的部分
# git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写
>>>使用git fetch和git merge合并分支,和git pull效果一样
# 先获取远程仓库代码,示例:git fetch origin
git fetch 远程仓库名
#将远程代码合并到本地当前分支,示例:git merge origin/master
git merge 远程仓库名/远程分支名
pull,远程没新变更会提示
三、git分支管理
本章节介绍分支管理。
(一)分支管理命令
1、使用git branch查询和新增分区。
git branch #查询此本地仓库所有分支
git branch 分支名 #添加分支
2、使用git checkout切换当前分区:切换不同分区,git会还原你的工作目录到该分区最后git commit的状态
git checkout 分支名
不git commit当前版本新修改就无法切换分支
3、使用git merge合并分区:将分区b合并到当前分区
git merge 分支b
四、git代码冲突
(一)冲突情况说明
注:版本就是git commit次数,版本针对的是文件,只要一个文件出现任何不同修改就会中断操作。
1、本地拉取/推送
本地拉取
- 当远端有更新,本地库没有有变化,拉取操作远端会覆盖本地库(远端版本高于本地)
- 当远端修改,本地库也有修改,拉取操作会产生冲突文件(远端版本和本地版本冲突)
- 当本地库修改,而远端没有变化,拉取不会产生变化(本地版本高于远端版本)
本地推送
- 当本地库版本低于远端版本,则无法推送,必须先拉取在操作,否则报错
2、分支合并
- 当资源分支版本高于目标分支时,合并,资源分支同名文件会覆盖目标分支;
- 当目标分支版本高于资源分支时,合并,提示Already up-to-date.(已经更新),目标分支内容不会变化;
- 当目标分支和资源分支同名文件都有改动时,会报冲突,需手动解决;
(二)冲突解决方式
事先预防
本地拉取/推送:为了不产生冲突,最简单的方案就是修改文件前,先git pull获取远程最新的代码,同步完成后再对代码进行修改,保证远程代码的版本低于本地版本
分支合并:平时开发不要在master或者develop分支做提交,要保证目标分支版本始终是最低的(提交次数最少),这样才能保证每次提交的版本都高于目标分支。如果目标分支(例如master)被保护起来,其他分支只能通过发起merge合并请求来合并的话,目标分支的版本始终是低于资源支的,也就不会产生冲突文件了。
解决冲突
不管本地push/pull还是本地分支merge,冲突本质就是git在合并操作时,对同一文件(只要对文件有修改且git commit了的都算不同版本)出现不同修改
即冲突处理方案是一样的,git会标记冲突文件,在本地解决冲突文件。再git commit提交本地仓库,根据需要git push远程即可。
例子1:merge分支合并冲突
master分支,test.txt文件
bate分支,test.txt文件
master分支是项目确定主分支,将bete合并到master,出现冲突提示
可以使用git diff查看冲突地方,我这里直接查看文件
本地master分支上会出现 (master|MERGING)标志
手动将文件里的该保留的保留,该删除的删除,
“<<<<<<< HEAD"到”======="之间是当前分支(master)之前的修改
“=======”到“>>>>>>> beta”是beta分支上的修改,根据需要进行保留或者删除
最终想要修改成这样,
修改文件,保存文件,再git add 和 git commit操作,冲突解决!
例子2:本地推送冲突
远程仓库master分支的test.txt
本地master分支的test.txt
本地推送,出现冲突提示
可以使用git diff查看冲突地方
本地master分支上会出现 (master|MERGING)标志
手动将文件里的该保留的保留,该删除的删除,
“<<<<<<< HEAD"到”======="之间是当前分支(master)之前的修改
“=======”到“>>>>>>> beta”是beta分支上的修改,根据需要进行保留或者删除
最终想要修改成这样,
修改文件,保存文件,再git add 和 git commit操作,最后push,冲突解决!
例子3:本地拉取冲突
这里只展示冲突提示,解决方案同上面两个例子,不再举例说明
五、git 常用命令解释
(一)本地仓库git 命令
git init #初始化本地仓库
git add . #将工作区所有内容添加到暂存区
git add 文件1 #将文件1添加到暂存区
git add /目录1 #将子目录1添加到暂存区
git commit -m "" #将暂存区内容提交到本地仓库
git commti -am "" #跳过add步骤将工作区变更提交到本地仓库
git status #显示暂存区修改,即查看在你上次提交之后是否有对文件进行再次修改
git merge 分区b #合并分区b到对当前分区
(二)远程仓库git 命令
git remote add 远程仓库别名 远程仓库地址 #添加远程仓库配置
git remote -v #查看远程仓库配置
git remote rm 远程仓库名 #删除远程仓库配置
git remote rename 旧仓库名 新仓库名 #修改远程仓库名
git push 远程仓库名 本地分支:远程分支 #本地推送至远程
git pull 远程仓库名 远程分支名:本地分支名 #远程拉取至本地
git fetch 远程仓库名 #远程拉取本地
git merge 远程仓库名/远程分支名 #将远程合并到本地当前分支
(三)分支管理git 命令
git branch #查看分支
git branch 分支名 #新建分支
git checkout 分支名 #切换分支
git merge 分支A #将分支A合并到当前分支
git diff #查看冲突差异
最终编辑2022-8-25