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

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
-------------------------------

以上流程基本覆盖了常用的业务场景

原文地址:https://www.cnblogs.com/davis12/p/14962557.html