`
xigua366
  • 浏览: 101211 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

真正理解 git fetch, git pull, FETCH_HEAD

    博客分类:
  • git
git 
阅读更多

真正理解 git fetch, git pull

要讲清楚git fetch,git pull,必须要附加讲清楚git remote,git merge 、远程repo, branch 、 commit-id 以及 FETCH_HEAD。

1. 【git remote】首先, git是一个分布式的结构,这意味着本地和远程是一个相对的名称。

本地的repo仓库要与远程的repo配合完成版本对应必须要有 git remote子命令,通过git remote add来添加当前本地仓库的远程repo, 有了这个动作本地的repo就知道了当遇到git push 的时候应该往哪里提交代码
(git push 后不加参数的时候,默认就是git push origin 当前的分支名,比如对本地的master分支执行git push,其实就是git push origin master,当然,如果远程仓库没有master这个分支的话,肯定会报错)。

2. 【git branch】其次,git天生就是为了多版本分支管理而创造的,因此分支一说,不得不提, 分支就相当于是为了单独记录软件的某一个发布版本而存在的,既然git是分布式的,便有了本地分支和远程分支一说,git branch 可以查看本地分支, git branch -r  可以用来查看远程分支。 本地分支和远程分支在git push 的时候可以随意指定,交错对应,只要不出现版本冲突即可。

3. 【git merge】再者,git的分布式结构也非常适合多人合作开发不同的功能模块,此时如果每个人都在其各自的分支上开发一个相对独立的模块的话,在每次release制作时都需先将各成员的模块做一个合并操作,用于合并各成员的工作成果,完成集成。 此时需要的就是git merge.

4.【git push 和 commit-id】在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程repo。

在理解了以上git要素之后,分析git fetch 和 git pull 就不再困难了。

 

首先,git fetch 有四种基本用法

1. git fetch            →→ 这将更新git remote 中所有的远程repo 所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中

2. git fetch remote_repo         →→ 这将更新名称为remote_repo 的远程repo上的所有branch的最新commit-id,将其记录。

3. git fetch remote_repo remote_branch_name        →→ 这将这将更新名称为remote_repo 的远程repo上的分支: remote_branch_name

4. git fetch remote_repo remote_branch_name:local_branch_name       →→ 这将这将更新名称为remote_repo 的远程repo上的分支: remote_branch_name ,并在本地创建local_branch_name 本地分支保存远端分支的所有数据。

 

FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。

 

git pull 的运行过程:

git pull : 首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。

git pull 后不加参数的时候,跟git push 一样,默认就是git pull origin 当前分支名,当然远程仓库没有跟本地当前分支名一样的分支的话,肯定会报错。
本地master分支执行git pull的时候,其实就是git pull origin master。

拆解git pull 操作。

git pull操作其实是git fetch 与 git merge 两个命令的集合。
git pull  等效于先执行 git fetch origin 当前分支名, 再执行 git merge FETCH_HEAD.

通过上述分析,可以知道,如果要合并代码就并不一定要用git merge命令了,也可以用git pull命名的,比如要把远程origin仓库的xx分支合并到本地的yy分支,可以有如下两种做法。
第一种,传统标准的做法:
git fetch origin 目标分支名  // fetch到远程仓库目标分支的最新commit记录到  ./git/FETCH_HEAD文件中
git checkout 要被合并的分支名  // 切换到要合并的分支
git merge FETCH_HEAD  // 将目标分支最新的commit记录合并到当前分支

举例说明:将远程origin仓库的xx分支合并到本地的yy分支。
git fetch origin xx
git checkout yy
git merge FETCH_HEAD
完成。

第二种,直接使用pull命令,将远程仓库的目标分支合并到本地的分支:
git pull <remoterepo_name> <branch_name>

举例说明:将远程origin仓库的xx分支合并到本地的yy分支

git checkout yy

git pull origin xx
完成。

 

其实还有一种思路,在前面第一种,第二种方式的基础上,可以这样来思考。

是否可以先本地checkout远程目标分支,或者本地已经有了,先pull更新下来,然后将本地的两个分支进行merge不也可以吗?

答案是肯定的。

举个例子:

将远程origin仓库的xx分支合并到本地的yy分支。

git checkout xx

git pull   // 如果本地没有xx分支的,这一步都可以不执行。

git checkout yy   // 切换到yy分支

git merge xx  //  将xx分支合并到yy分支  这一步可以加上 --no-ff 参数,即 git merge --no-ff

1
0
分享到:
评论

相关推荐

    前端大厂最新面试题-git pull _git fetch.docx

    前端大厂最新面试题-git pull _git fetch.docx

    git fetch与git pull的区别详解

    主要介绍了git fetch与git pull的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    解决因文件权限导致git fetch命令执行失败的问题

    最近在工作中遇到一个问题,就是在在一个基于 git 的发布系统中拉取代码,发现无法拉取最新的提交记录,查找相关资料发现是因为文件权限的问题,所以这篇文章主要介绍了关于解决因文件权限导致git fetch命令执行失败...

    Git pull命令与fetch命令的区别

    Git pull命令与fetch命令的区别 今天在公司碰到个问题,公司不使用master分支作为主分支,而使用release分支作为主分支,这就碰到了个问题,也就是当clone一个项目下来的时候,如果master跟release分支有冲突,就不...

    Git fetch和pull的详解及区别

    主要介绍了Git fetch和pull的详解及区别的相关资料,需要的朋友可以参考下

    git 视频教程

    git视频教程.5.1.Git 命令 - git fetch.mp4 git视频教程.5.2.Git 命令 - git pull.mp4 git视频教程.5.3.Git 命令 - git push.mp4 git视频教程.5.4.Git 命令 - git remote.mp4 git视频教程.5.5.Git 命令 - git ...

    fetch_robots-release:fetch_robots英镑

    drivers freight_bringup 存储库fetch_robots的软件包版本: 上游存储库: :fetchrobotics / fetch_robots.git 发布存储库: : rosdistro版本: 0.9.1-1 旧版本: 0.9.1-1 新版本: 0.9.2-1 使用的工具版本: 绽放...

    anni-fetch:一个库专注于git fetch的作用

    一个库专注于git fetch的作用。 例子 use anni_fetch :: Client; fn main () { // create a new client let client = Client :: new ( "https://github.com/project-anni/repo.git" ); // fetch and read as an ...

    git自动更新远程仓库工具

    在对远程仓库做了git clone --mirror后,使用gitfetch工具实现git fetch的批量更新处理

    gtni:在执行git clone,fetch或pull时,使用gtni递归安装所有npm依赖项

    安装[sudo] npm install -g gtni# or[sudo] yarn global add gtni用法$gtni --helpUsage: gtni &lt; command&gt; [options]Commands: pull git pull and install npm dependencies fetch git fetch and install npm depen

    PyPI 官网下载 | git-fetch-gitignore-0.0.2.tar.gz

    资源来自pypi官网。 资源全名:git-fetch-gitignore-0.0.2.tar.gz

    git_workshop:用于教学目的

    git_workshop 用于教学目的从存储库中复制文件git clone {https address}:将主分支克隆到当前目录中的文件中在git目录中git pull:更新本地文件以匹配存储库(等同于fetch + merge) git fetch:更新本地存储库以...

    Git-2.21.0-64-bit.zip

    * "git fetch" and "git pull" reports when a fetch results in non-fast-forward updates to let the user notice unusual situation. The commands learned "--no-show-forced-updates" option to disable ...

    Git指令的Shell脚本

    Git指令的Shell脚本,能够快速便捷地管理Git库,包括添加修改、提交修改、显示库状态、推送到远程库、从远程库更新... (use "git reset HEAD &lt;file&gt;..." to unstage) modified: Git.sh modified: PyNote/PyNote_2.md

    Git-1.8.chm Git-1.8英文API Git文档工具

     5:新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。  6:生成补丁(patch),把补丁发送给主开发者。  7:看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间...

    git_curate::scissors_selector:按照人体工程学细读和删除git分支

    注意git curate在生成其输出之前不会运行git fetch 。 如果要确保“状态与上游”列反映了上游分支根据其远程存储库的最新状态,则应首先运行git fetch 。 安装 您需要安装Ruby(v2.4.9或更高版本)。 跑: gem ...

    GitFetch:以最简单的方式获取github用户信息

    GitFetch :call_me_hand: 在github中了解用户及其信息您可以使用 ... : 通过输入用户名,您想在输入中了解有关信息,然后按按钮以查看所需的所有内容(Tadaaaaaaa !!) :)

    git-helper:GIT快速帮助命令

    git repack设置远程GIT git init git add . git status git commit -m "First commit" git ... git fetch -- all 删除未跟踪的文件git clean -f -d 重置分支/文件git reset --hard origin/master强制放弃本地更改

Global site tag (gtag.js) - Google Analytics