1小时学会Git基础知识
安装配置Git账户(git config)
下载安装(win/mac/linux):
Windows平台图像化客户端安装默认即可
Linux及Mac命令行直接安装,无需赘述。
配置Git账户:
git config --global user.name "git用户名"
git config --global user.email "git邮件地址"
其中参数:
global
表示全局配置,所有仓库版本控制都使用该账户;
local
表示本地配置,仅对当前仓库有效;
system
系统配置,表示对系统上的所有Git账户生效。最常用的的便是global
。
创建Git仓库
创建仓库有两种方式:
(1)在本地创建一个目录mkdir
,在该目录中本地初始化:
# 初始化当前目录为一个git仓库
git init
# 初始化一个名为 repository的git仓库
git init repository
(2)把远程仓库克隆到本地
git clone https://github.com/xxxx/yyyyy.git
初始化仓库后,当前的目录中会有隐藏的.git
目录,里面包含了该仓库的所有元数据及配置信息,不要熟悉的话不要轻易删除或更改。
添加与提交文件(add + commit)
添加文件到暂存区
git add . # 添加所有文件
git FILE1 # 添加单个文件
提交暂存区文件到本地仓库
git commit -m "双引号里是提交说明"
-m
参数是 给本次提交添加解释说明
查看各区域文件状态
查看仓库文件状态
git status
查看工作区文件,图形界面可以直接资源管理器中查看
ls
查看暂存区文件
git ls-files
查看提交历史
git log
回退版本(git reset)
git reset有三种模式,其中reset命令 默认的是mixed
:
- git reset --soft (软的)
- git reset --hard(硬的)
- git reset --mised(混合的)
它们的区别如下:
回退模式 | 工作区文件 | 暂存区文件 |
---|---|---|
git reset --soft | 保留 | 保留 |
git reset --hard | 丢弃 | 丢弃 |
git reset --mised | 保留 | 丢弃 |
我们需要根据不同的使用场景使用不同的参数。
#查看git 提交历史
git log
回退历史版本方法使用:
git reset --模式参数 提交ID
比较文件差异(git diff)
- 比较工作区与暂存区文件差异
git diff
如果什么都不显示,就是没有差异,表示工作区与暂存区文件是相同的。
- 比较工作区与版本库之间的差异
git diff HEAD
- 比较暂存区与版本库之间的差异
git diff --cached
- 比较两个版本之间的差异
git diff 版本ID1 版本ID2
- 比较上一个版本与当前版本的差异
git diff HEAD~ HEAD
#等同,两者取一
git diff HEAD^ HEAD
- 比较提交前的第二个版本与当前版本的差异
git diff HEAD~2 HEAD
#等同,两者取一,在后面加上数字
git diff HEAD^2 HEAD
- 比较提交前的第N个版本某个文件与当前版本的差异
git diff HEAD~2 HEAD 文件名
#等同,两者取一,在后面加上数字
git diff HEAD^2 HEAD 文件名
- 比较两个分支之间的差异
git diff branch_name1 branch_name2
- 比较两个提交之间的差异
git diff commit_hash1 commit_hash2
从版本库中删除文件(git rm)
- 删除工作区文件
# Windows:直接在目录中删除文件即可
# 类Unix:rm 文件名
如果从工作区中删除文件,想要暂存区也同步删除,需要添加(add)一次到暂存区才能完成:
即git add .
或git add filename
操作有些繁琐。
那么使用git rm
就能 同时删除工作区和暂存区的文件。
- 删除工作区+暂存区文件
git rm 文件名
- 删除所有位置文件(工作区+暂存区+本地仓库)
git rm 文件名
# 删除工作区和暂存区文件
git commit -m “delete filename xxx”
# 提交一次请求,本地仓库就跟着同步删除
- 仅删除暂存区文件,工作区保留
git rm --cached filename
# 如果需要本地仓库也同步删除,需要提交一次
- 删除某个目录下所有子目录几文件
git rm -r *
# 删除后同样需要提交一次,本地仓库才会同步删除
Git忽略文件 (.gitignore)
ignore
是忽略的意思,在仓库中这个文件的作用是:让我们忽略掉不应该加入到版本库中的文件,这样可以让仓库体积更小,结构更加干净。可以忽略所有的:日志文件
和文件夹
、所有的.class
、.o
、.env
、.zip
、.tar
、.pem
等文件。
一般来讲应该忽略:
- 系统或者软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成的日志文件、缓存文件、临时文件
- 涉及身份、密码、口令、密钥等敏感信息文件
比如在本地修改添加忽略所有的日志文件:
# 编辑忽略文件
vim .gitignore
# 添加:
*.log
忽略文件修改完毕,当我们再次提交时,Git就会自动忽略该所有的.log
文间,就不会跟着代码一起提交上去。
已经被添加到本地仓库中的忽略文件,即使修改了
.gitignore
文件配置,也不会对已存在仓库中的文件生效的,需要利用git rm
在本地仓库中删除,即git rm --cached filename
。ß
.gitignore
文件的匹配规则时逐行从上往下匹配的。
如:空行或者以#开头的行会被git忽略,一般空行用于可读性的分隔,#一般用来表示注释。
使用标准的Blob模式匹配,例如:*
通配任意个字符或所有,?
匹配单个字符,[ ]
表示匹配中括号里任意一个字符,如[abc]表示或者或b或c。如[0-9] 表示0~9任意一位数字,[A-Z]表示任意一位大写字母。
更多Git官网匹配规则:https://git-scm.com/docs/gitignore
GitHub
上也提供了许多gitignore文件模版共使用,可以根据自身需要进行选择。
SSH密钥配置
在GitHub上创建仓库Repository
后,GitHub提供了三种示例方案来关联该仓库:
(1)本地无仓库的话,可以先创建git init
一个,然后与GitHub上的远程Repo关联起来。
(2)本地已有仓库的话,如何git remote add
将本地与远程Repo绑定。
(3)还可以导入其它仓库,比如SVN,或其它平台的Repo。
GitHub远程仓库的地址有两种:
HTTPS
和SSH
,两者略有些区别。- https开头的地址:在我们把本地代码push到远程仓库时,需要验证用户名和密码。
- ssh开头的地址:推送的时候,不要验证用户名密码,但是需要在GitHub上添加SSH公钥信息。
比较推荐使用SSH这种方式,因为在2021年8月13日以后,https这种方式已经被GitHub停用了。
1.生成SSH密钥
在本地终端执行:
#setA
ssh-keygen -t ed25519 -C "git邮箱 name@example.com"
# 无特殊需求,直接三次回车确认即可,也可以在确认过程中给密钥设置一个密码。
将会在当前用户主目录中生成id_ed25519
和id_ed25519.pub
。
注意:如果你使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:
#setB ssh-keygen -t rsa -b 4096 # 如果只是生产单个密钥,直接按三次回车即可
一般默认会在本地`/Users/用户名/.ssh/`目录下,生成SSH私钥`id_rsa`和公钥`id_rsa.pub`,私钥不能泄漏,公钥需要添加到GitHub上。
2.添加SSH密钥至Github
切换到生成密钥的目录中,默认在/Users/用户名/.ssh/
,复制公钥文件id_ed25519.pub
或是id_rsa.pub
的内容。
点击GitHub个人头像,点击setting
,左侧菜单列表SSH and GPG keys
,在SSH kyes 这一项,点击绿色按钮New SSH keys
,然后把复制的公钥信息内容粘贴到key
这个输入框中,Title
标题输入自定义的名字,点击绿色按钮Add SSH key
。SSH公钥便已成功的添加到GitHub。
3.测试SSH连接
ssh -T git@github.com
会输出类似认证成功的提示:
Hi Geek0ne! You've successfully authenticated, but GitHub does not provide shell access.
再使用git clone
就可以直接克隆Repo了,如果提示输入密钥密码,输入生产密钥时设置的密码即可。
远程仓库管理操作
1.本地关联远程仓库
首先需要本地有一个仓库,不管是从GitHub上克隆clone
下来的,还是从本地初始化init
生产的。然后进行关联:
git remote add origin git@github.com:git用户名/仓库名称.git
在GitHub上创建Repo后,仓库主页会有相应的操作命令,上述命令可以直接在远程仓库主页复制使用。
- Origin 是仓库别名,可以自定义。
执行完后,可以使用git remote -v
来查看当前仓库对应的远程仓库别名和地址。
2.本地远程仓库操作
克隆仓库到本地:
git clone repo-address
拉取远程仓库:
git pull <remote>
推送更新到远程仓库:
git push <remote> <branch>
# 默认分支即为main,此条命令可以省略
git branch -M main
主分支合并:
git push -u origin main:main
# 如果本地分支与远程分支名称一致的话,只写一个main即可:
git push -u origin main
小知识:以前GitHub主分支名称一直为:
master
,后来好像涉及因为黑人种族歧视,然后就改为了main
,老黑们太敏感了。。。
本地拉取远程仓库的更新
local与remote关联后,本地想要获取远程仓库的更新,使用:
git pull origin main
# 可以直接写为:
git pull
也可以使用git fetch
来仅获取远程仓库的更新,而不会自动合并到本地仓库中。
Gitee及Gitlab的使用
Gitee中文名也叫:码云。可以看成是GitHub国内专版,具有中国特色,审查及管控机制你懂的。由于都是中文界面SSH密钥配置及创建仓库等操作也是和GitHub大同小异。
Gitlab 主要特点是:可以将代码版本管理进行私有化部署,比如可以在本地或者在云服务器上部署一个代码版本控制仓库。部署方式现在利用Docker
部署,简单方便易管理,具体部署方式可以参考Gitlab官方文档:极狐GitLab Docker 镜像
部署完成后,可以在浏览器中输入本地地址localhost
来访问本地的Gitlab业务了,输入用户名和密码后,可以在个人头像弹出来的菜单里找到偏好设置,本地化设置更改为:Chinese,Simplified - 简体中文
就可以设置成中文了。也可以在添加SSH密钥,过程和GitHub是一样类似的。
在VSCode中使用Git
在VSCode扩展中,安装Git Graph
这个扩展插件,重启VSCode后,主界面侧边菜单栏会有分支图标,就可以正常创建/管理仓库了。
VSCode中git仓库文件尾标状态:
图标符号 | 状态表示 |
---|---|
??(untracked) | 未跟踪 |
M(modified) | 已修改 |
A(added) | 已添加暂存 |
D(deleted) | 已删除 |
R(renamed) | 重命名 |
U(updated) | 已更新未合并 |
Git分支管理(branch)
Git分支概念简介
分支可以看作是版本库中的不同版本,可 以独立存在,并且以后自己的提交记录。分支非常适合团队协作和开发管理,多个开发人员可以在自己的分支中进行开发工作,然后再合并到主线代码库中。 还可以在一个分支上进行新功能开发,或者建立一个问题修复的分支来处理一些bug和缺陷。
分支的优点就是提高团队的协作效率,减少冲突和错误的影响,让团队中的每个人都能够独立开发和测试。
分支管理操作
可以在Git终端中,查看分支帮助信息:
git branch -h
查看当前所有分支:
git branch
创建&切换分支
创建一个分支:
# git branch 分支名称
git branch Dev
注意,git branch dev
只是创建该分支,但不会自动切换到该分支上,需要使用git checkout
来切换到不同的分支。
# 切换到Dev这个分支上
git checkout Dev
切换到Dev分支后,Git终端显示的分支名称也会跟着改变。
Ps:使用
git checkout
命令可能还会有潜在的问题,因为该命令还可以用来恢复文件或者目录之前的某一个状态。如果删除的某个文件和分支名称相同的话,再执行git checkout
可能会出现歧义,但checkout
默认依然是切换分支。官方在Git2.23版本开始提供了一个新的切换分支的命令:git switch
。
切换分支(无歧义,更准确)
# git switch 分支名称
git switch main
分支合并
可以使用git merge
命令 将不同的分支合并到当前分支中。如:
# 将Dev分支合并当前分支中
git merge Dev
比如将Dev分支合并到主分支main
#(1)先将当前分支切换到main分支
git switch main
#(2)再将Dev分支切换到当前mian分支
git merge Dev
在VSCode中可以使用git log
来查看分支图:
git log --graph --oneline --decorate --all
删除分支
1. 删除已合并的分支
分支被合并后是不会自动删除的,需要手动使用命令删除:
git branch -d Dev
# -d 表示 删除已经完成合并的分支
2. 删除未合并的分支
git branch -D Dev
# 未合并的分支需要用大写 -D 参数来强制删除
解决合并冲突
如果两个分支修改了同一份文件的相同的内容,Git就不知道该保留哪个分支的修改的内容。相当于同一份文件同一行代码,被两个分支所修改过,Git无法确认哪一份是最终需要保留的修改记录。最简单的即是手动修改合并冲突的文件内容,然后再添加&提交。
中止合并:当不想继续执行合并操作时可以使用下面的命令来中止合并过程:
git merge --abort
版本回退与Rebase合并
除了merge
外,Git还有一个命令rebase
也可以将不同分支修改的内容合并到一起。
之前用merge合并的时候,是先切换到main分支,然后将待合并的分支,合并到main分支上。而用rebase可以在任意分支上进行合并,且分支提交记录也会一起合并到目标分支上。
分支版本回退:
git checkout -b dev [提交版本ID]
查看提交ID 可用
git log
命令查看。
设置别名
有些命令冗长,为提高效率,可以设置别名,以此来简化输入,如:
alias graph="git log --oneline --graph --decorate --all"
设置完成后,即可使用graph
来实现命令:git log --oneline --graph --decorate --all
的操作。
Rebase操作
因为rebase可以在任意分支上,将当前分支进行合并目标分支上(rebase
),
如在dev分支上执行合并到main分支:
git switch dev #将当前分支切换到dev分支上
git rebase main #将dev分支的提交记录合并到main分支上
在main分支上 合并到dev分支:
git switch main #将当前分支切换到main分支上
git rebase dev #将main分支的提交记录合并到dev分支上
进行rebase之后,分支的结果都是一条直线,但是中间的顺序会稍微有些不同。
在执行git rebase
操作后,git会找到两个分支上的交叉点即汇聚点到最新提交的所有记录,都移动到目标分支的最新提交后面。
简单来说就是从分叉点把整个分支都移动到目标分支的最新提交记录后面。
工作流模型
结合实际工作中规范提交模型,或请自行参考如下:
该简易笔记全部手敲来自于:【GeekHour】一小时Git教程
安装配置Git账户(git config)
下载安装(win/mac/linux):
Windows平台图像化客户端安装默认即可
Linux及Mac命令行直接安装,无需赘述。
配置Git账户:
git config --global user.name "git用户名"
git config --global user.email "git邮件地址"
其中参数:
global
表示全局配置,所有仓库版本控制都使用该账户;
local
表示本地配置,仅对当前仓库有效;
system
系统配置,表示对系统上的所有Git账户生效。最常用的的便是global
。
创建Git仓库
创建仓库有两种方式:
(1)在本地创建一个目录mkdir
,在该目录中本地初始化:
# 初始化当前目录为一个git仓库
git init
# 初始化一个名为 repository的git仓库
git init repository
(2)把远程仓库克隆到本地
git clone https://github.com/xxxx/yyyyy.git
初始化仓库后,当前的目录中会有隐藏的.git
目录,里面包含了该仓库的所有元数据及配置信息,不要熟悉的话不要轻易删除或更改。
添加与提交文件(add + commit)
添加文件到暂存区
git add . # 添加所有文件
git FILE1 # 添加单个文件
提交暂存区文件到本地仓库
git commit -m "双引号里是提交说明"
-m
参数是 给本次提交添加解释说明
查看各区域文件状态
查看仓库文件状态
git status
查看工作区文件,图形界面可以直接资源管理器中查看
ls
查看暂存区文件
git ls-files
查看提交历史
git log
回退版本(git reset)
git reset有三种模式,其中reset命令 默认的是mixed
:
- git reset --soft (软的)
- git reset --hard(硬的)
- git reset --mised(混合的)
它们的区别如下:
回退模式 | 工作区文件 | 暂存区文件 |
---|---|---|
git reset --soft | 保留 | 保留 |
git reset --hard | 丢弃 | 丢弃 |
git reset --mised | 保留 | 丢弃 |
我们需要根据不同的使用场景使用不同的参数。
#查看git 提交历史
git log
回退历史版本方法使用:
git reset --模式参数 提交ID
比较文件差异(git diff)
- 比较工作区与暂存区文件差异
git diff
如果什么都不显示,就是没有差异,表示工作区与暂存区文件是相同的。
- 比较工作区与版本库之间的差异
git diff HEAD
- 比较暂存区与版本库之间的差异
git diff --cached
- 比较两个版本之间的差异
git diff 版本ID1 版本ID2
- 比较上一个版本与当前版本的差异
git diff HEAD~ HEAD
#等同,两者取一
git diff HEAD^ HEAD
- 比较提交前的第二个版本与当前版本的差异
git diff HEAD~2 HEAD
#等同,两者取一,在后面加上数字
git diff HEAD^2 HEAD
- 比较提交前的第N个版本某个文件与当前版本的差异
git diff HEAD~2 HEAD 文件名
#等同,两者取一,在后面加上数字
git diff HEAD^2 HEAD 文件名
- 比较两个分支之间的差异
git diff branch_name1 branch_name2
- 比较两个提交之间的差异
git diff commit_hash1 commit_hash2
从版本库中删除文件(git rm)
- 删除工作区文件
# Windows:直接在目录中删除文件即可
# 类Unix:rm 文件名
如果从工作区中删除文件,想要暂存区也同步删除,需要添加(add)一次到暂存区才能完成:
即git add .
或git add filename
操作有些繁琐。
那么使用git rm
就能 同时删除工作区和暂存区的文件。
- 删除工作区+暂存区文件
git rm 文件名
- 删除所有位置文件(工作区+暂存区+本地仓库)
git rm 文件名
# 删除工作区和暂存区文件
git commit -m “delete filename xxx”
# 提交一次请求,本地仓库就跟着同步删除
- 仅删除暂存区文件,工作区保留
git rm --cached filename
# 如果需要本地仓库也同步删除,需要提交一次
- 删除某个目录下所有子目录几文件
git rm -r *
# 删除后同样需要提交一次,本地仓库才会同步删除
Git忽略文件 (.gitignore)
ignore
是忽略的意思,在仓库中这个文件的作用是:让我们忽略掉不应该加入到版本库中的文件,这样可以让仓库体积更小,结构更加干净。可以忽略所有的:日志文件
和文件夹
、所有的.class
、.o
、.env
、.zip
、.tar
、.pem
等文件。
一般来讲应该忽略:
- 系统或者软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成的日志文件、缓存文件、临时文件
- 涉及身份、密码、口令、密钥等敏感信息文件
比如在本地修改添加忽略所有的日志文件:
# 编辑忽略文件
vim .gitignore
# 添加:
*.log
忽略文件修改完毕,当我们再次提交时,Git就会自动忽略该所有的.log
文间,就不会跟着代码一起提交上去。
已经被添加到本地仓库中的忽略文件,即使修改了
.gitignore
文件配置,也不会对已存在仓库中的文件生效的,需要利用git rm
在本地仓库中删除,即git rm --cached filename
。ß
.gitignore
文件的匹配规则时逐行从上往下匹配的。
如:空行或者以#开头的行会被git忽略,一般空行用于可读性的分隔,#一般用来表示注释。
使用标准的Blob模式匹配,例如:*
通配任意个字符或所有,?
匹配单个字符,[ ]
表示匹配中括号里任意一个字符,如[abc]表示或者或b或c。如[0-9] 表示0~9任意一位数字,[A-Z]表示任意一位大写字母。
更多Git官网匹配规则:https://git-scm.com/docs/gitignore
GitHub
上也提供了许多gitignore文件模版共使用,可以根据自身需要进行选择。
SSH配置和远程仓库
在GitHub上创建仓库Repository
后,GitHub提供了三种示例方案来关联该仓库:
(1)本地无仓库的话,可以先创建git init
一个,然后与GitHub上的远程Repo关联起来。
(2)本地已有仓库的话,如何git remote add
将本地与远程Repo绑定。
(3)还可以导入其它仓库,比如SVN,或其它平台的Repo。
GitHub远程仓库的地址有两种:
HTTPS
和SSH
,两者略有些区别。- https开头的地址:在我们把本地代码push到远程仓库时,需要验证用户名和密码。
- ssh开头的地址:推送的时候,不要验证用户名密码,但是需要在GitHub上添加SSH公钥信息。
比较推荐使用SSH这种方式,因为在2021年8月13日以后,https这种方式已经被GitHub停用了。
GitHub配置SSH密钥
- 在本地终端执行:
ssh-keygen -t rsa -b 4096
# 如果只是生产单个密钥,直接按三次回车即可
一般默认会在本地/Users/用户名/.ssh/
目录下,生成SSH私钥id_rsa
和公钥id_rsa.pub
,私钥不能泄漏,公钥需要添加到GitHub上。
- 切换到生成密钥的目录中,复制公钥文件
id_rsa.pub
内容。 - 点击GitHub个人头像,点击
setting
,左侧菜单列表SSH and GPG keys
,在SSH kyes 这一项,点击绿色按钮New SSH keys
,然后把复制的公钥信息内容粘贴到key
这个输入框中,Title
标题输入自定义的名字,点击绿色按钮Add SSH key
。SSH公钥便已成功的添加到GitHub。
再使用git clone
就可以直接克隆Repo了,如果提示输入密钥密码,输入生产密钥时设置的密码即可。
本地远程仓库操作
克隆仓库到本地:
git clone repo-address
拉取远程仓库:
git pull <remote>
推送更新到远程仓库:
git push <remote> <branch>
关联远程仓库
本地关联远程仓库
首先需要本地有一个仓库,不管是从GitHub上克隆clone
下来的,还是从本地初始化init
生产的。然后进行关联:
git remote add origin git@github.com:git用户名/仓库名称.git
在GitHub上创建Repo后,仓库主页会有相应的操作命令,上述命令可以直接在远程仓库主页复制使用。
- Origin 是仓库别名,可以自定义。
执行完后,可以使用remote -v
来查看当前仓库对应的远程仓库别名和地址。
# 默认分支即为main,此条命令可以省略
git branch -M main
主分支合并:
git push -u origin main:main
# 如果本地分支与远程分支名称一致的话,只写一个main即可:
git push -u origin main
小知识:以前GitHub主分支名称一直为:
master
,后来好像涉及因为黑人种族歧视,然后就改为了main
,老黑们太敏感了。。。
本地拉取远程仓库更新
local与remote关联后,本地想要获取远程仓库的更新,使用:
git pull origin main
# 可以直接写为:
git pull
也可以使用git fetch
来仅获取远程仓库的更新,而不会自动合并到本地仓库中。
Gitee及Gitlab的使用
Gitee中文名也叫:码云。可以看成是GitHub国内专版,具有中国特色,审查及管控机制你懂的。由于都是中文界面SSH密钥配置及创建仓库等操作也是和GitHub大同小异。
Gitlab 主要特点是:可以将代码版本管理进行私有化部署,比如可以在本地或者在云服务器上部署一个代码版本控制仓库。部署方式现在利用Docker
部署,简单方便易管理,具体部署方式可以参考Gitlab官方文档:极狐GitLab Docker 镜像
部署完成后,可以在浏览器中输入本地地址localhost
来访问本地的Gitlab业务了,输入用户名和密码后,可以在个人头像弹出来的菜单里找到偏好设置,本地化设置更改为:Chinese,Simplified - 简体中文
就可以设置成中文了。也可以在添加SSH密钥,过程和GitHub是一样类似的。
在VSCode中使用Git
在VSCode扩展中,安装Git Graph
这个扩展插件,重启VSCode后,主界面侧边菜单栏会有分支图标,就可以正常创建/管理仓库了。
VSCode中git仓库文件尾标状态:
图标符号 | 状态表示 |
---|---|
??(untracked) | 未跟踪 |
M(modified) | 已修改 |
A(added) | 已添加暂存 |
D(deleted) | 已删除 |
R(renamed) | 重命名 |
U(updated) | 已更新未合并 |
Git分支管理(branch)
Git分支概念简介
分支可以看作是版本库中的不同版本,可 以独立存在,并且以后自己的提交记录。分支非常适合团队协作和开发管理,多个开发人员可以在自己的分支中进行开发工作,然后再合并到主线代码库中。 还可以在一个分支上进行新功能开发,或者建立一个问题修复的分支来处理一些bug和缺陷。
分支的优点就是提高团队的协作效率,减少冲突和错误的影响,让团队中的每个人都能够独立开发和测试。
分支管理操作
可以在Git终端中,查看分支帮助信息:
git branch -h
查看当前所有分支:
git branch
创建&切换分支
创建一个分支:
# git branch 分支名称
git branch Dev
注意,git branch dev
只是创建该分支,但不会自动切换到该分支上,需要使用git checkout
来切换到不同的分支。
# 切换到Dev这个分支上
git checkout Dev
切换到Dev分支后,Git终端显示的分支名称也会跟着改变。
Ps:使用
git checkout
命令可能还会有潜在的问题,因为该命令还可以用来恢复文件或者目录之前的某一个状态。如果删除的某个文件和分支名称相同的话,再执行git checkout
可能会出现歧义,但checkout
默认依然是切换分支。官方在Git2.23版本开始提供了一个新的切换分支的命令:git switch
。
切换分支(无歧义,更准确)
# git switch 分支名称
git switch main
分支合并
可以使用git merge
命令 将不同的分支合并到当前分支中。如:
# 将Dev分支合并当前分支中
git merge Dev
比如将Dev分支合并到主分支main
#(1)先将当前分支切换到main分支
git switch main
#(2)再将Dev分支切换到当前mian分支
git merge Dev
在VSCode中可以使用git log
来查看分支图:
git log --graph --oneline --decorate --all
删除分支
1. 删除已合并的分支
分支被合并后是不会自动删除的,需要手动使用命令删除:
git branch -d Dev
# -d 表示 删除已经完成合并的分支
2. 删除未合并的分支
git branch -D Dev
# 未合并的分支需要用大写 -D 参数来强制删除
解决合并冲突
如果两个分支修改了同一份文件的相同的内容,Git就不知道该保留哪个分支的修改的内容。相当于同一份文件同一行代码,被两个分支所修改过,Git无法确认哪一份是最终需要保留的修改记录。最简单的即是手动修改合并冲突的文件内容,然后再添加&提交。
中止合并:当不想继续执行合并操作时可以使用下面的命令来中止合并过程:
git merge --abort
版本回退与Rebase合并
除了merge
外,Git还有一个命令rebase
也可以将不同分支修改的内容合并到一起。
之前用merge合并的时候,是先切换到main分支,然后将待合并的分支,合并到main分支上。而用rebase可以在任意分支上进行合并,且分支提交记录也会一起合并到目标分支上。
分支版本回退:
git checkout -b dev [提交版本ID]
查看提交ID 可用
git log
命令查看。
设置别名
有些命令冗长,为提高效率,可以设置别名,以此来简化输入,如:
alias graph="git log --oneline --graph --decorate --all"
设置完成后,即可使用graph
来实现命令:git log --oneline --graph --decorate --all
的操作。
Rebase操作
因为rebase可以在任意分支上,将当前分支进行合并目标分支上(rebase
),
如在dev分支上执行合并到main分支:
git switch dev #将当前分支切换到dev分支上
git rebase main #将dev分支的提交记录合并到main分支上
在main分支上 合并到dev分支:
git switch main #将当前分支切换到main分支上
git rebase dev #将main分支的提交记录合并到dev分支上
进行rebase之后,分支的结果都是一条直线,但是中间的顺序会稍微有些不同。
在执行git rebase
操作后,git会找到两个分支上的交叉点即汇聚点到最新提交的所有记录,都移动到目标分支的最新提交后面。
简单来说就是从分叉点把整个分支都移动到目标分支的最新提交记录后面。
工作流模型
结合实际工作中规范提交模型,或请自行参考如下:
该简易笔记全部手敲来自于:【GeekHour】一小时Git教程