zoukankan      html  css  js  c++  java
  • 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
    -------------------------------
    

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

  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/davis12/p/14962557.html
Copyright © 2011-2022 走看看