美文网首页
git看一篇就够了

git看一篇就够了

作者: mfdalf | 来源:发表于2020-10-13 22:59 被阅读0次
    image.png

    目录:

    一 架构

    二 常用命令解析

    三 常见scenario

    正文:

    一 架构

    image.png
    1 各个模块介绍:
    远端Repository:git address。存放远端branch.本地Repository:存放本地branch.
    远端branch;origin/master;本地branch;Index/stage:暂存区或者索引区.本地space,workspace.
    注意是5棵树(remote/origin/master,origin/master,master,index,workspace),不不是4棵树(网上大部分介绍都是4棵树,本文是第一次正确提出5棵树). git本地是3棵树. origin是地址,不参与代码管理,仅仅管理分支.
    2 主要流程
    image
    3 Origin,origin/master,master关系?
    3.1 仓库和分支区别?
    仓库是origin,它是git地址,是存放分支的地方,不是直接存放代码的地方.
    分支是保存code的地方.找代码需要找具体仓库的具体分支.
    仓库仅仅提供场地,每个branch负责保存代码出产品。
    3.2 Origin是仓库,值is xxx.git,它是git 地址,不是远程分支.
    origin/master是远程分支remote/origin/master的本地副本.注意origin/master是本地的,不是远端的.
    Master是一个本地分支,不是本地仓库.
    3.3 本地分支和远程分支关系?
    是先有本地分支后有远程分支.
    git fetch origin//从origin地址下载remote/origin/branch的代码到本地origin/branch。
    git merge origin/branch //将origin/branch 代码合并到本地branch中.
    Case1: pull=git fetch+git merge;
    remote/origin/branch=origin/branch=local branch=workspace
    Case2:当remote/origin/branch有他人提交,但是branch没有fetch.
    那么remote/origin/branch!=origin/branch
    Case3:当本地工作区workspace做了改动,然后git commit.但是branch没有push.
    那么 origin/branch!=branch
    Case4:git push
    remote/origin/branch=origin/branch=branch
    参考:在Git中,origin / master与origin master之间有什么区别?https://www.icode9.com/content-4-185866.html
    Git fetch、pull以及merge之间的区别:https://blog.csdn.net/qq_34609889/article/details/88733153
    4 master 分支和dev 分支的关系?
    两者是并列关系.mater分支和dev分支角色和地位是一样的,只是default 创建分支是master。它们不是上下层级关系.也不是组合关系,两者没有共同上一层级,它们是一个产品线只是细节不同,不是两个产品线.
    实例:git 拉取gitlab远程分支(dev)到本地(亲测有效)<u><u>https://blog.csdn.net/d_claus/article/details/88551338</u></u>
    5 git 实现原理:每个提交是一个commit id.HEAD指向当前节点.
    image.png
    6 git与svn相比多了一个本地分支,多了一个层级.svn的分支相当于git的本地workspace.git本地做了存储,所以没网络也可以上传代码.git架构从集中式变成分布式。

    二 常用命令解析

    1 常用命令导图.

    image
    2 Git常用命令.
    1)下面几个引用基本把常用的git命令都将明白了,注意改变几棵树,修改了哪棵树.
    (1)Git 图解命令: https://marklodato.github.io/visual-git-guide/index-zh-cn.html#commit
    (2) Git常规配置与用法https://segmentfault.com/a/1190000011168654
    (3)Git 教程:https://www.liaoxuefeng.com/wiki/896043488029600
    (4)git 图解本地工作区·缓存区·本地仓库·远程仓库:https://blog.csdn.net/weixin_33127753/article/details/88870257
    2) 容易的混淆命令解析
    常用pull(fetch+merge),push; checkout; 合并(rebase,merge);回退(reset,revert); 增删补(add,rm,amend)
    (1)命令分类:
    a)网络相关命令:只有pull,push ,fetch,负责上传下载.其他命令全是本地命令,比如:checkout,merge,add etc.
    b) Branch相关:check,merge; c)文件相关:add,rm,commit etc.
    (2) pull and push
    image.png
    image.png
    git pull = git fetch + git merge FETCH_HEAD。 Git pull --rebase = git fetch + git rebase FETCH_HEAD ;将会改变3棵树,本地origin/branch,branch和workspace,不改变暂存区. fetch 就是download. fetch 将remote 分支的东东,下载到本地仓库origin/master, merge和并origin/master 到master, 然后覆盖本地工作区(有冲突解决冲突)。 同时可以参考:<u>https://blog.csdn.net/qq_34609889/article/details/88733153</u>. 上文中HEAD-master就是origin/master; remote-master就是master.
    b) Push
    第一次push:git push -u origin master.
    git push origin dev// push 到orgin/dev 分支
    $git push A B:C//其中A和C是分别remote端的一个repository的名字和branch的名字
    (3) git checkout 两种情况:checkout 分支 或者 文件
    checkout 分支 a)新建一份拷贝+切换 b)切换;
    QA: checkout之后workspace会变吗?会产生 冲突吗?
    不会冲突。从本地仓库checkout file直接替换本地workspace。
    checkout 文件:将暂存区文件替换工作区文件,如果暂存区没有则用本地仓库文件替换工作区文件.
    (4) 合并
    git merge,git rebase,cherry-pick;
    a: 基本用法
    rebase 约等于merge.执行merge,rebase的前提是工作区与仓库一致,工作区有改动需要先提交git commit.如果工作区变动merge是执行不了的.
    git merge master//如果在dev分支,会dev merge master 分支.
    git merge origin/master //master merge orgin/maste
    b: 两者的区别
    下面的link说明白了两者的区别.
    https://blog.csdn.net/wh_19910525/article/details/7554489
    划重点:对于使用 git merge 来合并所看到的commit的顺序(从新到旧)是: C7 , C6 , C4, C5 , C3 ,C2,C1
    对于使用 git rebase 来合并所看到的commit的顺序(从新到旧)是: C7 , C6‘,C5' ,C4,C3, C2,C1
    c:cherry-pick
    不用merge分支,直接merge 不同branch的commit id.
    这命令简直就是神器,给你自由,你想把不用merge分支哪个节点merge过来就把哪个节点merge过来,其合入的不是分支而是提交节点。
    (5) 回退,撤销reset,checkout,revert
    git reset 和git add 相反,是回撤提交.
    (1) git reset and git checkout 区别?
    Git reset 用于回退,HEAD将不在当前位置而是后退到以前提交.
    Git checkout 用于获取当前版本.
    Git checkout 会改变workspace,不会改变index
    Git reset 根据不同参数,决定改变workspace,index的情况.下文就是具体情况.
    (2) Reset,reset --soft,reset --hard 区别?
    git reset 修改commit id 即head
    i) Git reset --soft HEAD~
    Soft 命令仅仅改变repository 1个地方
    ii) git reset [--mixed] HEAD~(mixed可以不写,缺省是这种情况)
    Git reset 则git repository and index 2个地方同时改变
    iii) Git reset --hard HEAD~
    Git hard 则git repository , index,workspace 3个地方同时改变
    iv) git reset eb43bf file.txt
    从指定commit 拉取数据,仅仅改变暂存区.
    Git 从 HEAD 拉取数据,而是通过具体指定一个提交来拉取该文件的对应版本.我们只需运行类似于 git reset eb43bf file.txt 的命令即可。以上是版本库、Index 和工作目录的状态。
    现在,执行git reset eb43 file.txt
    V) 合并提交: 这个方法不是常用方法,相当于一个tricky.
    作用:多次提交一个文件,想合并这些改动。先将head指针回退,将暂存区中的newest的文件重新提交.
    合并提交通常不会采用这种方法,通常是git amend 在缓冲区合并几个提交,然后统一提交.
    Vi) reset 和 revert
    这个问题用commit id 说明最好. 提交commit1,commit2,commit3. 撤销并修改commit2.
    reset执行结果 : commit1, commit2+;
    revert执行结果: commit1,commit2,commit3,commit2+;
    reset 因为head回退,所以push的时候会出现error,因为本地head 落后远端head. 因此需要强制push,push -f 推送回退版本.
    下面的blog用文件说明.Git恢复之前版本的两种方法reset,revert(图文详解)https://blog.csdn.net/yxlshk/article/details/79944535.
    参考:git reset 命令详解(二)—— Git 学习笔记 08 //这个是图解reset blog是从《精通git》第二版中"git工具--重置解密 "摘抄的
    https://blog.csdn.net/longintchar/article/details/81952043

    3常用场景

    3.1 单人场景
    github上注册,配置ssh,关联远程库,创建remote分支.
    本地增删改合add、commit、push,rm,merge,
    远程访问clone,git pull --rebase同步
    <u><u>https://blog.csdn.net/weixin_43034040/article/details/94596522</u></u>
    这两个git 资料很完整
    https://blog.csdn.net/u013490896/category_7883282.html
    https://blog.csdn.net/jackyvincefu/category_9261810.html
    (https://blog.csdn.net/jackyvincefu/category_9261810.html)
    3.2 多人协作
    Git 教程(三):仓库与分支
    https://www.cnblogs.com/xuecanmeng/p/7383222.html
    血泪教训之请不要再轻视Git —— 我在工作中是如何使用 Git 的
    https://zhuanlan.zhihu.com/p/250493093

    相关文章

      网友评论

          本文标题:git看一篇就够了

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