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

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

  • 相关阅读:
    postgresql批量删除表
    Oracle迁移至PostgreSQL工具之Ora2Pg
    postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
    postgresql获取表最后更新时间(通过表磁盘存储文件时间)
    postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
    postgresql源码编译安装(centos)
    Java 学习笔记(7)——接口与多态
    Java 学习笔记(6)——继承
    Java 学习笔记(4)——java 常见类
    Java 学习笔记(4)——面向对象
  • 原文地址:https://www.cnblogs.com/davis12/p/14962557.html
Copyright © 2020-2023  润新知