美文网首页
进阶git版本管控的分支操作 2021-07-15

进阶git版本管控的分支操作 2021-07-15

作者: 9_SooHyun | 来源:发表于2021-07-15 16:36 被阅读0次

    1. git命令可视化理解

    推荐一个git命令的可视化网站,http://onlywei.github.io/explain-git-with-d3/,可以从宏观层面对git命令的执行产生理解

    2. 实践笔记

    2.1 案例-分支创建与合并:git分支创建与合并

    2.2 主要命令的底层机制与实践理解

    2.2.1 分支创建与切换

    • git branch name
      会在当前commit节点创建一个tag,表示这里存在一个name新分支,但此时并没有发生分支的切换
    • git checkout
      用于分支间的切换,有且只有checkout会触发分支的切换。checkout又有以下两种用法:
    • git checkout branch_name
      HEAD指针指向branch_name的分支指针,表示分支切换。注意,checkout到新分支前,应当保证在当前分支上的有效变更都已经被commit,否则checkout到新的分支可能会导致工作区出现文件内容冲突,从而无法checkout又或者丢失当前分支的变更
    • git checkout commit_id
      HEAD指针指向特定的commit节点,但此时会进入Current Branch = DETACHED HEAD的状态,即头指针游离态。表明我们不在任何一个分支上。在这样的基础上进行新的commit会丢失(官方提示Not a good idea to make commits while in a detached HEAD state)。如果确实需要进行commit,应当首先在当前的节点创建新的分支git branch new_branch,然后checkout到new_branch上,这时HEAD指针指向new_branch的分支指针,我们就脱离了DETACHED HEAD状态而来到了特定分支上,可以正常进行commit
    • 从远程仓库里拉取一条本地不存在的分支时:
    git checkout -b 本地分支名 origin/远程分支名
    
    • git symbolic-ref 读取、修改和删除符号引用
      eg.
    [root@VM-165-116-centos console_backend]# git symbolic-ref HEAD
    refs/heads/master  
    [root@VM-165-116-centos console_backend]# git symbolic-ref --short HEAD # 查看当前所在分支
    master
    

    git checkout target_branch本质上的底层操作是echo "ref: refs/heads/target_branch" > .git/HEAD
    https://titangene.github.io/article/git-head-ref.html

    2.2.2 分支合并

    • git merge branch_name
      git merge will create a new commit in current branch with two parents. The resulting commit snapshot will have the all of the work that has been done in both branches.
      常见的merge策略有fast forward和recursive两种
      当两个分支不存在分叉点,适用fast forward策略;当两个分支存在分叉点,适用recursive策略,即三向合并
    • git rebase branch_name
      rebase也可以合并分支。顾名思义,它的作用是将branch_name分支的head节点作为当前分支新base,以新base为基点将当前分支移动过去。rebase之后,当前分支上所有的commit ID都会改变,因为该分支从旧基点rebase到新的基点上,parents的ID发生变化,导致后续所有commit的ID也发生变化。commit ID的改变意味着rebase后得到了新的commit节点,而旧的commit节点仍在原地
      before base
      after rebase

    关于分支的合并可参考https://www.lzane.com/tech/git-merge/

    2.2.3 远端仓库交互

    • git fetch
      git fetch will update all of the "remote tracking branches" in your local repository,即将远端origin的【所有】tracking branches拉下来
    合并两个分支的代码,有mergerebase两个操作

    为了拉下远端的代码并且和本地合并,我们经常使用git pull命令。该命令实际上就是在本地分支以及拉下来的远端分支之间进行了merge或者rebase,实现了分支的合并

    • git pull
      git pull默认是git pull --merge的缩写,因此git pull = git fetch and git merge. 即将远端origin的所有tracking branches拉下来后,又与本地的当前分支进行merge,注意不是所有分支都进行merge。例如,本地存在master和dev两个分支,对应远端的origin/master和origin/dev,执行git pull等价于git fetch将origin/master和origin/dev都拉下来,如果本地当前分支为master,则又继续执行git merge origin/master
    • git pull --rebase
      If the argument "--rebase" was given by typing git pull --rebase, the second step of pull process will be a rebase instead of a merge. It means git fetch + git rebase origin/xxx,即拉取远端所有tracking branches后,然后将本地的当前分支rebase到相应tracking分支的最新commit节点上,形成一条线性的commit历史
      git pull --rebase避免了复杂的commit网的产生,因此git pull 推荐加上--rebase参数
    • git push
      推送本地当前分支的新commit到远端的对应分支,注意:
      By default, all pushes must cause a fast-forward merge on the remote repository. If there is any divergence between your local branch and the remote branch, your push will be rejected. In this scenario, you need to pull first and then you will be able to push again.

    相关文章

      网友评论

          本文标题:进阶git版本管控的分支操作 2021-07-15

          本文链接:https://www.haomeiwen.com/subject/eioppltx.html