git使用全流程详解 安装|配置|提交|分支|合并|回退
1.安装git
1.1 windows安装
win安装毫不费力,如下图下载windows版本的git,一直next就可以了。git官方下载传送门
1.2 linux安装
根据不同的linux而定。
最流行的ubuntu类的系统:apt-get install git
centos类的的: yum install git
2.配置git
2.1 配置用户名等信息
假设已经安装了git,接下来是常见的配置用户信息,这块内容主要是为了方便在提交代码时查看谁提交的。
# 查看配置信息3
git config --list[-l]
# 配置用户名,加了--global是全局的意思
git config --global user.name dav
# 配置邮箱,同用户名
git config --global user.email dav@company.com
-------------------------
以下是其他需求
# 删用户名
git config --global --unset dav
# 增加用户名
git config --global --add user.name daw
# 修改用户名
git config --global user.name Mike
# 查看用户名
git config --gloabl user.name
# 其他通用设置
git config [--global] configname configvalue
2.2 配置ssh
通常使用git提交代码之前,会先配置ssh,然后就可以免输密码提交代码了。
在windows下,借助git bash
可以生成秘钥对,使用命令 ssh-keygen [-t rsa]
一路回车下去就可以完成秘钥生成工作,然后打开id_rsa_pub(公钥)文件,把内容复制粘贴到github or gitlab or gitee上的ssh,具体这可自行搜索。
在linux下,其实流程类似,使用相同命令 ssh-keygen [-t rsa]
会在/root/.ssh/下生成秘钥对(root用户下时),复制pub部分的内容粘贴到远程仓库界面的ssh配置中。
通过以上工作,我们接下来在提交代码时就可以实现免密码提交。
3.git日常使用
日常使用git进行代码的版本控制时,比较多的都是创建新远程仓库,以下假设都在linux环境下,在本地,也创建同远程仓库名的目录,然后拉取,commit 等操作,一般我们从master分支拉取其他分支进行相关开发工作,具体见以下不同场景使用。
3.1 git完成第一个推送
首先在远程仓库,也就是github或者gitlab或者gitee这类的远程仓库管理界面上创建远程仓库,比如创建了一个名为test01的远程public仓库,接下来回到本地进行相关工作。
本地操作见下:
# 创建项目目录
mkdir test01
# 进入目录
cd test01
# git init
git init
# 创建第一个文件
touch README.md
# 添加到暂存区
git add README.md
# 提交代码
git commit -m "first commit"
# 关联远程仓库
git remote add origin git@gitee.com:dav/test01.git
# 推送代码到远程,默认master分支
git push -u origin master
----------
# 常见的,使用mv命令移动文件后,直接commit && push即可更新到远程,使用rm命令同样操作
git mv srcFile dstFile
git commit -m 'mv file'
git push origin branchName
3.2 git创建分支
通常项目开发迭代的时候,往往多人共同开发,不可能都在master分支上进行开发工作,不然代码管理混乱。
首先大概了解下常用git分支命名规范:
- master 主分支,代码功能稳定,拿来即用,很多时候基于master分支创建新分支
- develop[dev] 开发分支,代码最新,往往基于此分支也会创建新的分支
- feature 开发新功能的分支,功能处于开发阶段
- release 发布定期要上线功能分支
- fixbug QA测试阶段的bug修复分支,你叫bugfix也行,看个人
分支看个人,及组里的命名规范,比如我喜欢开发的dev,新功能的fea,bug修复的fixbug,这几个也是用的最多的命名,通常也会带上版本号,比如1.0-dev,1.2-fea,1.3-fixbug之类的,加前面后面看组内的规范。
接下来看看具体的git操作:
# 切换到master分支
git checkout master
# 拉取最新代码
git pull git-url[ssh | https]
# 创建新的开发分支
git checkout -b dev
# 验证分支是基于master分支创建的dev分支
git reflog --date=local | grep dev
# 输出内容如下
b7926b4 HEAD@{Fri Jul 2 09:54:30 2021}: checkout: moving from master to dev
# 代码开发觉得该上传了,接下来的工作就很熟悉,依次是:
git add xxx
git commit -m "xxx"
git push origin dev
往后的日常开发工作就是上班pull master,下班push dev。
3.3 git合并分支
界面操作
直接提merge request
,选择对应分支合并到某个想要合并的分支,这种往往是本省没有master的权限,导致想要合并自己分支代码到master上,必须提merge request,或者有权限的同事自己操作merge。
命令行操作
项目中经常要用到dev或者其他分支开发代码,开发完成后,需要将该分支合并到master的需求或者将主分支代码合并到分支上
git将dev分支代码合并到主分支master
1.当前分支所有代码提交
先将dev分支上所有有代码提交至git上,提交的命令一般就是这几个,
# 将所有代码提交
git add .
# 编写提交备注
git commit -m "修改bug"
# 提交代码至远程分支
git push origin dev
2.切换当前分支至主干(master)
# 切换分支
git checkout master
# 如果多人开发建议执行如下命令,拉取最新的代码
git pull origin master
3.合并(merge)分支代码
git merge dev
# merge完成后可执行如下命令,查看是否有冲突
git status
4.提交代码至主干(master)
git push origin master
5.最后切换回原开发分支
git checkout dev
git合并master主分支最新代码到开发dev分支
## git如何把master上的代码,合并到自己的分支
1.切换到主分支 (master)
git checkout master
2.拉去远程仓库的代码
git pull
3.在切换到自己的分支
git checkout 分支名称
4.把主分支的代码merge合并到自己的分支上面
git merge master
5.将dev分支合并后的代码push到远程分支
git push origin dev
3.4 git拉取特定分支
方法1:推荐
拉取特定分支工作简单,具体是在已经git init
的目录中执行以下命令:
# 指定dev分支克隆代码
git clone -b dev 远程仓库地址[ssh | https]
方法2: 用这个
输入 git init
进行初始化
# 建立连接
与远程代码仓库建立连接:
git remote add origin 代码仓库地址
# 拉取分支
*将远程分支拉到本地:
git fetch origin dev(dev即分支名)
# 创建分支
*创建本地分支:
git checkout -b LocalDev origin/dev (LocalDev 为本地分支名,dev为远程分支名)
*根据分支的变化,感觉这条指令可能是创建并切换到该分支
拉取成功
*最后一步将远程分支拉取到本地:
git pull origin dev(dev为远程分支名)
方法3
更基本的办法是回到远程仓库的界面,点击branches,在对应分支有下载选项,下载即可,不推荐。
拉取分支并push代码
拉取特定分支代码开发并push代码
1:在本地创建任意文件夹
2:在该文件夹中右键选择 Git Bash Here (这些都是基于你已经正确安装Git的情况下!)
3:在弹出框中输入:git init(初始化本地仓库)
4:输入你的项目地址:git remote add origin 地址!就是下图那个地址
5: git fetch origin 分支名称(一切正常的情况下会让你输入用户名,密码。密码是不会显示出来的。)
6:创建本地分支并切换到本地分支:git checkout -b 本地分支名 origin/远程分支名 (红色本地,黄色远程)。本地,远程写同一个名字就可以!写上就行不需要你创建文件夹
7:更新分支代码:git pull origin 远程分支名
链接:https://www.jianshu.com/p/b4a476e4b59d
补充:
a.基于特定的tag拉取分支
我们知道 tag 其实就是基于某个commit的快照,一般我们可能拉取某个分支,有的时候也有需求基于某个tag拉取分支,下面说说其操作:
1.拉取主分支代码
git pull 你的仓库名
2.关联远程分支
git remote add origin 你的仓库名
3.拉取所有tag等信息
git pull
4.基于某个tag创建分支
git checkout -b 新分支 某个tag名
b.基于某条分支新建分支并推到库中
# 1.确保你在某分支上,比如dev
git branch -a
# 2.在dev上新建新分支fea
git checkout -b fea
# 3.查看该分支基于哪条分支构建
git reflog show fea
# 4.推到库中
git push --set-upstream origin fea
3.5 git删除分支
现在有这样的需求,bug刚刚修复,QA测试也通过了,fixbug分支就应该及时删除,所以这是应该删除分支。
操作如下:
# 切到其他分支
git checkout master
# 退出要删除的分支,删除本地分支
git branch -d fixbug
# 推送远程,同步,本地和远程仓库分支的数据同步删除
git push origin --delete fixbug
# 确认已经删除分支
git branch -a
---------------------
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 退出要删除的分支,删除远程分支 & 推送删除到远程把远程仓库删除:git push --delete origin branchName
git branch -d -r origin/branchName
# 新建本地分支,推送远程同步更新分支:git push origin branchName
git branch branchName
# 重命名分支
git branch -m oldName newName
# 创建并切换分支,等价于 git branch branchName && git checkout branchName
git checkout -b branchName
当然,也可以直接在git的远程界面操作,到对应仓库中,点branches,删除不想要的分支,这是远程分支就删除了。
3.6 git历史log
项目目录中输入:git log
查看相关提交信息,通过加参数,可以实现查看合并的等等,更多详见git log --help
3.7 git撤销&回退
Git撤销&回滚操作(git reset 和 get revert)
通常开发中,修改相关代码后执行下面操作:
git add someCode
git commit -m 'hahha'
已经commit到repository,但没有push的时候,但又想撤销此次commit,可执行以下命令:
git reset --soft HEAD^
# 或者通过commit id回退
git log
git reset --hard commit_id
执行后,撤销上次commit,如果连着add也撤销的话,--soft 改为--hard,删除工作空间改动代码。
HEAD^
表示上一个版本,上一次的commit,也可以写成HEAD~1
,如果连着2次改动撤销,就是HEAD~2
,近三次就是HEAD~3
,n次就是n,变化数字,但一般不至于那么多撤回。
关于--soft & --hard
查看help文档如下:
--soft
- Does not touch the index file or the working tree at all (but resets the head to
, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.
意为撤回到add的状态
--hard
- Resets the index and working tree. Any changes to tracked files in the working tree since
are discarded.
意为撤回到add前的状态
ps. 想要更改commit的注释信息,使用命令:
git commit --amend
# 修改后保存退出,最上方的注释信息修改, vim
以下为演示:
# 演示分支为 localdev
# 查看内容
$ cat localdevFile
hello localdev
# 追加内容
$ echo "branch localdev">> localdevFile
# 查看修改文件
$ cat localdevFile
hello localdev
branch localdev
# 查看文件状态,可知 modified
$ git status
On branch localdev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: localdevFile
no changes added to commit (use "git add" and/or "git commit -a")
# add到临时仓库
$ git add localdevFile
warning: LF will be replaced by CRLF in localdevFile.
The file will have its original line endings in your working directory
# commit到repository
$ git commit -m "up"
[localdev c0eb267] up
1 file changed, 1 insertion(+)
# 更改commit信息
$ git commit --amend
[localdev 2c831d0] up localfile for test
Date: Sat Jul 3 15:20:06 2021 +0800
1 file changed, 1 insertion(+)
# 撤回上次提交到commit前状态
$ git reset --soft HEAD^
# 查看文件,未提交到stage
$ git status
On branch localdev
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: localdevFile
git push 修改提交
- 1)通过git reset是直接删除指定的commit
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
- 2)通过git revert 用一次新的commit来回滚之前的commit
git log # 得到你需要回退一次提交的commit id
git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存
- 3) git revert 和 git reset的区别
git revert 用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
git reset 回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
3.8 git创建merge request
git远程操作界面上,点击create merge request
,即可根据src branch merge to dst branch,然后指定审核人,不同操作界面有细微差别,大都类似。
3.9 git pull拉取代码
通常我们拉取代码,使用git pull 远程仓库
,git pull
命令等价于 git fetch && git merge
。
git fetch
官方定义:
- git-fetch - Download objects and refs from another repository,从远程仓库下载到本地repository,用户可决定是否合并到当前工作分支,合并后会在目录中更新
git pull
官方定义: - git pull - git pull is shorthand for git fetch followed by git merge FETCH_HEAD,pull相当于fetch 和merge的合并操作,可能产生冲突,需手动解决
下面重点看看区别:
# 拉取远程仓库到本地,默认master分支
git fetch 远程仓库名
# 此处常见的是: git fetch origin master
# 拉取远程仓库特定分支到本地
git fetch 远程仓库名 branchName
# 查看拉取更新信息
git log -p FETCH_HEAD
-----------------------------
commit 757b6bb6555dfac036a4c4cca3ce9339c9f71d63
Author: dazzzzz <bbbbbbbbbbb@qq.com>
Date: Sat Jul 3 02:15:01 2021 +0000
add test-dev0703.
diff --git a/test-dev0703 b/test-dev0703
new file mode 100644
index 0000000..fdc5024
--- /dev/null
+++ b/test-dev0703
@@ -0,0 +1 @@
+测试用,date 07-03
\ No newline at end of file
-----------------------------
# 通过以上这些这些信息来判断是否产生冲突,以确定是否将更新merge到当前分支
# 合并到当前分支
git merge FETCH_HEAD
-------------------
Updating 163ba1f..757b6bb
Fast-forward
test-dev0703 | 1 +
1 file changed, 1 insertion(+)
create mode 100644 test-dev0703
-------------------
# ls 后发现只是更新fetch的分支中更新的部分到当前本地分支上,当前分支只是增加更新的内容
**********分割线****************
# 默认情况下是master分支,所以pull后直接就是更新远程仓库的master分支到本地当前分支,这也是最常用的
git pull git@gitee.com:davxxxx/test01.git
-----------
$ git branch
* localdev
master
----------
# 将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:
git pull <远程主机名> <远程分支名>:<本地分支名>
# 比如现在远程分支有: master & dev 两个分支
# 本地有master & localdev分支
# 现执行以下命令,将远程分支dev合并更新到本地localdev分支
git pull git@gitee.com:davxxxx/test01.git dev:localdev
# 指定远程仓库分支合并更新到本地分支,而且该分支是当前分支
git pull git@gitee.com:davxxxx/test01.git dev
-------------------------------
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 288 bytes | 10.00 KiB/s, done.
From gitee.com:davxxx/test01
* branch dev -> FETCH_HEAD
Updating 757b6bb..700778b
Fast-forward
addNewFile | 1 +
1 file changed, 1 insertion(+)
create mode 100644 addNewFile
-------------------------------