git看一篇就够了

目录:

一 架构

二 常用命令解析

三 常见scenario

正文:

一 架构

git看一篇就够了

1 各个module介绍:

远端Repository:git address。存放远端branch.本地Repository:存放本地branch.

远端branch;origin/master;本地branch;Index/stage:暂存区或者索引区.本地space,workspace.

注意是5棵树(remote/origin/master,origin/master,master,index,workspace),不是4棵树,本地是3棵树. origin是地址,不参与代码管理,仅仅管理分支.

2 主要流程

git看一篇就够了

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

上面link的commit是在什么命令查看到的?是哪里找到的?Push的情况呢?

4 master 分支和dev 分支的关系?

两者是并列关系.mater分支和dev分支角色和地位是一样的,只是default 创建分支是master。它们不是上下层级关系.也不是组合关系,两者没有共同上一层级,它们是一个产品线只是细节不同,不是两个产品线.

实例:git 拉取gitlab远程分支(dev)到本地(亲测有效)

https://blog.csdn.net/d_claus/article/details/88551338

5 git 实现原理:每个提交是一个commit id.HEAD指向当前节点.//此处需要具体实例

6 git与svn相比多了一个本地分支,多了一个层级.svn的分支相当于git的本地

workspace.git本地做了存储,所以没网络也可以上传代码.git架构从集中式变成分布式。

二 常用命令解析

1 常用命令导图.

git看一篇就够了

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) 容易的混淆命令解析

(1)命令分类:

a)网络相关命令:只有pull,push ,fetch,负责上传下载.其他命令全是本地命令,比如:checkout,merge,add etc.

b) Branch相关:check,merge;

c)文件相关:add,rm,commit etc.

(2) Git fetch,pull以及merge之间的区别 ?

fetch 就是download.

git pull = git fetch + git merge FETCH_HEAD

git pull --rebase =  git fetch + git rebase FETCH_HEAD ;将会改变3棵树,本地origin/branch,branch和workspace,不改变暂存区.

Fetch说明:https://blog.csdn.net/qq_34609889/article/details/88733153

HEAD-master就是origin/master; remote-master就是master.

(3) git checkout 两种情况

a)新建一份拷贝+切换  b)切换;

QA: checkout之后workspace会变吗?会产生 冲突吗?

不会冲突。从本地仓库checkout file直接替换本地workspace。

(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

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

提交到远端用revert,在本地用reset

Git撤销&回滚操作

https://blog.csdn.net/asoar/article/details/84111841

参考:git reset 命令详解(二)—— Git 学习笔记 08

https://blog.csdn.net/longintchar/article/details/81952043

(6) 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常用场景

3.1 单人场景

github上注册,配置ssh,关联远程库,创建remote分支.

本地增删改合add、commit、push,rm,merge,

远程访问clone,git pull --rebase同步

https://blog.csdn.net/weixin_43034040/article/details/94596522

这两个git 资料很完整

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