`
xigua366
  • 浏览: 102439 次
  • 性别: 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 命令的理解与区别 在 Git 版本控制系统中,git pull 和 git fetch 是两个常用的命令,它们都用于从远程仓库获取最新的代码版本,但是它们之间存在着一定的区别。 首先,让我们从基础开始,...

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

    最近在一个基于 git 的发布系统中拉取代码,发现无法拉取最新的提交记录,通过调试和查看日志文件找到一行错误:error: cannot open .git/FETCH_HEAD: Permission denied,原因是文件权限问题导致。 问题原因 ...

    git fetch与git pull的区别详解

    例如,如果你从`FETCH_HEAD`合并到本地的`master`分支,可以使用`git merge FETCH_HEAD`。 另一方面,`git pull`命令则是`git fetch`和`git merge`的组合。当你运行`git pull`时,它首先执行`git fetch`获取远程...

    progit_v2.1.15_git_V2_

    通过`git remote add`可以关联远程仓库,`git push`将本地更改推送到远程,而`git pull`则用于获取远程仓库的更新。Git的`fetch`和`merge`命令还可以用来获取并整合远程分支的更改。 对于冲突解决,Git提供了一套...

    Git fetch和pull的详解及区别

    理解`git fetch`和`git pull`的区别是使用Git的关键。在实际工作中,根据项目管理策略和个人喜好,你可以选择使用其中一个或结合两者。在不确定的情况下,`git fetch`通常是更安全的选择,因为它允许你在合并之前...

    Git-2.8.1-64-bit.rar_Git-2.8_Git-2.8.1-64-bit._git_git-2.8.1-64-

    5. 异步操作:Git-2.8.1-64-bit支持异步操作,用户可以在进行耗时的命令(如push或fetch)的同时进行其他工作,提高了开发的效率。 6. Git Bash:这个版本包含了Git Bash,一个模拟Linux命令行环境的工具,使得...

    git-master_2_git_

    8. **远程分支**:`origin/master`是远程仓库(如GitHub)上的master分支的本地引用,可以使用`git fetch`和`git pull`来更新本地的远程分支。 9. **HEAD指针**:HEAD是一个特殊的指针,总是指向当前分支的最新提交...

    git-book_git_

    `git remote`命令用于管理远程仓库,`git fetch`和`git pull`操作用于与远程仓库同步。 6. **解决冲突**:当多人同时修改同一部分代码时,Git可能会报告冲突。使用`git diff`查看冲突,并手动编辑冲突文件以解决。...

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

    以及如何使用,需要查看其官方文档或解压`git-fetch-gitignore-0.0.2`这个压缩包,查看其中的`README`、`setup.py`等文件,或者直接在Python环境中运行`import git_fetch_gitignore; print(git_fetch_gitignore.__...

    Git权威指南_git_

    `git remote add origin url`命令添加远程仓库,`git fetch`或`git pull`用来获取远程仓库的更新,而`git push`则用于将本地变更推送到远程仓库。此外,`git clone`命令可以复制远程仓库到本地,便于团队成员快速...

    git-pull-branch.7z

    这个操作包括了`git fetch`(获取远程仓库的最新变更)和`git merge`(将获取的变更合并到本地分支)两步。在日常开发中,我们经常用`git pull`来保持本地代码与远程仓库的同步。 在Windows环境下,批处理脚本(....

    Git详解_Git详解

    `git fetch`和`git pull`用于从其他副本获取更新,`git push`则将本地更改共享出去。 了解和熟练使用Git是现代软件开发者的必备技能。通过实践和学习,你可以掌握Git的强大功能,提高团队协作效率,确保代码的安全...

    Git pull命令与fetch命令的区别

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

    git_for_windows_64bits

    7. **远程操作**: 除了基本的`push`和`pull`,还可以使用`git fetch`获取远程仓库的更新但不合并,`git remote`管理远程仓库的链接,以及`git push --force`强制推送,但这通常只在特殊情况下使用,因为可能会覆盖...

    Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.3

    对于团队项目,可以使用`git clone`下载远程仓库,`git pull`同步远程更新,`git push`推送本地更改,以及`git fetch`和`git merge`或`git rebase`来整合远程分支。 总之,Git-2.37.3-64-bit_3.exe是Git的64位...

    git自动更新远程仓库工具

    另外,`git pull`命令通常结合`git fetch`一起使用,它不仅获取远程更新,还会尝试合并到本地分支,但`gitfetch`工具主要关注的是获取更新,而不是合并。 总的来说,`git自动更新远程仓库工具`通过`gitfetch`简化了...

    git_real_slides

    `git remote`命令用于管理远程仓库,`git push`将本地提交推送到远程仓库,而`git pull`则将远程仓库的更新拉取到本地。此外,`git fetch`和`rebase`在协作中也起到关键作用,它们可以获取远程变更并在本地历史之上...

    Pro_Git中文版

    - `git fetch &lt;remote&gt;`:获取远程仓库的信息,但不合并。 - **其他命令**: - `git log`:查看提交历史。 - `git diff`:比较文件差异。 - `git blame &lt;file&gt;`:查看文件每行的最后修改者。 - `git stash`:...

Global site tag (gtag.js) - Google Analytics