git看一篇就够了

2020-10-13  本文已影响0人  mfdalf
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

上一篇下一篇

猜你喜欢

热点阅读