git push/git pull/git fetch/get merge图解

不同于svn中心仓库/版本库的理念,git首先是本地仓库,然后是远程仓库(github、gitee等)。协作者通过各自本地local仓库与共同的远程remote中央仓库(例如github)进行同步来协同工作(注:这种类似svn的方式称为集中式工作流,有多种其他工作流,例如 GitHub flow https://zhuanlan.zhihu.com/p/81396787 )。
区别:

总体流程

准备工作

方式1:建立本地库git init,然后与远程库建立连接,git remote add [shortname] [master分支url]
方式2:先建立远程库(master分支),然后git clone url克隆远程库。

git push 图解

用于将本地存储库发布到中央/远程存储库。
push合并采用fast-forwardable方式,因此push之前,需要先从远程仓库获取最新的更新(先git pull),
push之后本地库的remote/origin/master的head指针和master的head指针将指向同一个commit ID,且远程库也同样如此。

范例,push前,remote/origin/master的head指针和本地master的head指针将指向不同的commit ID,push后指向相同的commit ID

git fetch 图解

git fetch 从远程存储库下载commits, files, refs到本地仓库,但是不会合并到本地仓库。
可以用来查看远程仓库的进展情况而不影响本地工作。获取的内容位于/.git/refs/remotes/ 和 .git\objects 文件夹下
远程分支的提交在下图中显示为正方形

范例,远程仓库origin/master节点与本地仓库master节点未合并(merge会创建新节点)

git pull 图解

git pull是git fetch和git merge的结合。
从远程获取更新并合并到本地仓库,pull合并采用Recursive策略(也可称为Tree-Way Merge)或者fast-forward策略或者no-fast-forward策略;
注意:fast-forward策略不会生成新的commit id,其他两个策略会生成新的commit id
下图展示Recursive策略

合并后,生成H节点

范例,远程仓库origin/master节点与本地仓库master节点已合并(merge会创建新节点)

附录-git merge合并策略

以下范例,可以把develop分支看作远程master

fast-forward merge

例如远程master分支和本地master分支,远程master分支有新的commit,本地master分支没有新的commit,本地仓库执行git merge 将会采用此策略
此策略不生成新的commit id,只改变head指向

no-fast-forward(命令:git merge --no-ff)

例如远程master分支和本地master分支,远程master分支有新的commit,本地master分支没有新的commit,本地仓库执行git merge --no-ff将会采用此策略
此策略会产生新的commit id,并将head指向此commit id

Recursive策略(Three-Way Merge)

例如远程master分支和本地master分支,都各自有新的commit,采用此策略
此策略会产生新的commit id,并将head指向此commit id

git rebase (git rebase origin/master)

posted @ 2022-11-18 17:51  悠哉大斌  阅读(659)  评论(0编辑  收藏  举报