Git
Git工作流程
Git基本了解以及常用指令
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具
基本配置
设置用户信息:
git config --global user.name “XXX” # 设置用户名
git config --global user.email “XXXX” # 设置邮箱
查询配置信息
git config --global user.name
git config --global user.email
为常用基本指令配置别名
- 打开用户目录,创建
.bashrc
文件
touch ~/.bashrc
- 在
.bashrc
文件中输入如下内容:
# 用于输出git提交日志
alias git-log=‘git log --pretty=oneline --all --graph --abbrev-commit’
# 用于输出当前目录所有文件及基本信息
alias ll=‘ls -al’
- 执行
source ~/.bashrc
创建本地仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
- 在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库
- 进入这个目录中,点击右键打开Git bash窗口
- 执行命令git init
- 如果创建成功后可在文件夹下看到隐藏的.git目录
git init
基础操作指令
Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而发生变化。
status查看修改的状态
作用:查看修改的状态(暂存区、工作区)
命令形式:
git status
add添加工作区到暂存区
作用:添加工作区一个或多个文件的修改到暂存区
命令形式:git add 单个文件名|通配符
git add file.txt # 添加单个文件
git add . # 将所有修改加入暂存区
commit提交暂存区到本地仓库
作用:提交暂存区内容到本地仓库的当前分支
命令形式:git commit -m ‘注释内容’
git commit -m “XXX update”
log查看提交日志
配置的别名git-log就包含了这些参数,所以后续可以直接使用指令 git-log
作用:查看提交记录
命令形式:git log [option] 或者 git-log
—all 显示所有分支
—pretty=oneline 将提交信息显示为一行
—abbrev-commit 使得输出的commitId更简短
—graph 以图的形式显示
版本回退
作用:版本切换
命令形式:
git reset --hard commitID # commitID 可以使用 git-log 或 git log 指令查看
git reflog # 查看所有操作的ID等信息
添加文件忽略列表
如图中所示:
在.gitignore中的书写内容是:
HEAD指向谁谁就是当前分支
分支
查看本地分支
git branch
创建本地分支
git branch 分支名
切换分支
git checkout 分支名
还可以直接切换到一个不存在的分支(先创建后 切换):
git checkout -b 分支名
合并分支
一个分支上的提交可以合并到另一个分支
git merge 分支名
删除分支
git branch -d 分支名 # 删除分支时,需要做各种检查
git branch -D 分支名 # 不做任何检查,强制删除
每一次创建分支都是复制一份master,作为一个新的分支的
解决冲突
合并时发现冲突
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区(add)
- 提交到仓库(commit)
开发中分支使用原则与流程
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
-
master (生产) 分支:线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
-
develop(开发)分支:是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
-
feature/xxxx分支:从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支,之后该分支可以删除。
-
hotfix/xxxx分支:从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。
还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等
远程仓库
连接远端仓库
码云为例:码云
首先于右上角的”+“—>”新建仓库“
新建后点击设置
点击SSH公钥
标题可随意输入
公钥如何寻找,前往Git Bash敲入以下命令
生成公钥
ssh-keygen -t rsa
后一路回车即可,出现如下情况就表示已经生成了公钥了
再键入:
输出公钥的内容
cat ~/.ssh/id_rsa.pub
生成了一长串的密钥,复制,粘贴入gitee的公钥处,并点击确定
后回到我们的Git Bash输入以下命令验证是否成功连接到gitee
ssh -T git@gitee.com
连接到本地仓库
下来就来连接一下刚刚创建的仓库:
切换到Git Bush(一定要在前面新建的目录下采用.git文档)
创建远程仓库
命令:
远端名称:默认是origin,取决于远端服务器设置
仓库地址:从远端服务器获取此url
git remote add <远端名称> <仓库地址>
查看远程仓库
命令:
git remote
推送代码到远程仓库
如果远程分支名和本地分支名相同,则可以只写本地分支名
如:git push oigin master
git push [-f] [–set-upstream] [远端名称] [本地分支名][:远端分支名]
- -f 表示强制覆盖
- –set-upstream推送到远端的同时并且建立起和远端分支的关联关系
切换到gitee看看
河里,已经推送成功
查看本地仓库与远程仓库的关系
命令:
git branch -vv
绑定关系:(上传仓库并绑定关系)
git push --set-upstream oigin master:master
如图所示未绑定关系
已经将本地的master与oigin绑定关系
绑定了关系就可以直接使用 git push
进行直接推送代码
克隆 抓取 拉取
克隆
克隆刚才的远程仓库git_test,放在目录git_test中
命令:
git clone [克隆仓库SSH链接] [文件名称]
文件名不填写就默认为链接后部分。如:study
切换到你要的目录下键入git clone
的命令:
查看克隆仓库的日志
原仓库的日志
抓取
抓取的指令就是将仓库中的更新都抓取到本地,不会自动合并
如果不指定远端名称和分支名,则抓取所有分支
在本地克隆下的仓库中新建一个file06.txt,且将其推送至远程仓库
后使用原先的本地仓库进行抓取
git fetch
使用查看日志发现我们本地仓库比远端仓库要少一个版本,所以对其进行合并
git merge oigin/master
拉取
拉去指令就是将远端仓库的修改拉取到本地并自动合并,等同于fetch+merge
如果不指定远端名称和分支,则会抓取所有更新当前分支
命令:
git pull
案例演示与前面基本一致,创建新文件后进行上传且推送
后到本地仓库下进行拉取git pull
IDEA中的Git使用
在IDEA中操作Git
场景:本地已经有一个项目,但是并不是git项目,我们需要将这个放到码云的仓库里,和其他开发人员继续一起协作开发。
创建项目的远程仓库
gitee上操作即可
初始化本地仓库
选择项目:略
设置远程仓库
name一般默认origin
URL需要在gitee上复制刚刚仓库的SSH
后出现如下情况
已经提交过所以是空的
正常情况下会如图所示,很多文件
输入完成后点击Commit进行提交,下面也一路Commit即可
创建分支
方法一:最常规的方式
方法2:最强大的方式(可以随意在任何提交过的版本上进行新建分支)
总结
在IDEA的终端中可使用git命令来完成以上所有功能
切换分支前先提交本地的修改
代码及时提交,提交过了就不会丢
Git知识补充
rebase和merge
HEAD的理解
HEAD
指向当前所在的分支,类似一个活动的指针,表示一个「引用」。
HEAD
既可以指向「当前分支」的最新 commit
,也可以指向历史中的某一次 commit
(「分离头指针」的情况)。归根结底,HEAD 指向的就是某个提交点。
当我们做分支切换时,HEAD
会跟着切换到对应分支。
fast-forward 与 —no-ff 的区别
fast-forward
fast-forward
合并方式是条件允许的情况,通过将 master 分支的 HEAD 位置移动到 feature 分支的最新提交点上,这样就实现了快速合并。这种情况,是不会新生成 commit 的。(快进模式)
git checkout master # 先切换到master分支
git merge feature # 将feature分支合并到当前分支上(master)
–no-ff 的方式进行合并,master 分支就会新生成一次提交记录。
git checkout master # 先切换到master分支
git merge --no-ff feature # 将feature分支合并到当前分支上(master)
merge操作
git merge
操作是区分上下文的。当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。这个注意点记住了,方便记忆!所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上。
快进模式能够进行的条件是:源分支和目标分支之间没有分叉。下图则是无法通过 HEAD 的快速移动实现分支的合并。
如果执行合并操作,默认会尝试 fast-forward 的方式进行合并,但是因为分叉了,所以此时会采用 no-ff 的方式进行合并,有新的 commit 生成了。最终的结果图如下:
git checkout master # 先切换到目标分支
git merge feature
rebase操作
rebase
合并往往又被称为 「变基」。这里的「基」就是一个「基点」、「起点」的意思。git rebase
命令通常称为向前移植(forward porting
)。
「变基
」就是改变当前分支的起点。注意,是当前分支! rebase
命令后面紧接着的就是「基分支
」。与merge操作相反。
git checkout feature # 切换到当前分支,或待变基分支
git rebase master # 变基
# 可合并为下面的语句
git rebase master feature
变基后:
解释:rebase
,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了E而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)
远程分支合并
该项职责由git管理员来完成。例如当开发分支Develop上的所有功能已经完成时,需要合并到master上时:
- 代码clone到本地仓库
git clone
- 在本地创建dev分支并与远程dev分支对应
git checkout -b dev origin/dev
- 切换到master分支
git checkout master
- 本地的dev合并到master上(遇到冲突解决完后再次提交)
git merge dev
- 推送到远程的master上(执行这项操作时,需要有操作远程master分支的权限)
git push origin master