git fetch, git pull, git merge, git rebase

这篇具有很好参考价值的文章主要介绍了git fetch, git pull, git merge, git rebase。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

我们发现很多同学习惯性用git pull拉取远端仓库代码,

但是这会带来一个问题,如果有了本地commit再git pull的话,会产生一个merge commit,

这样的merge commit会导致git log分支节点很多,很乱。

首先聊一聊git pull,git merge,git rebase这些常听到的命令吧,初入git的同学一定还是一脸蒙,尤其是git rebase,算是git的中高阶操作了。

git fetch, git pull, git rebase

1. git fetch和git pull

git pull = git fetch + git merge

git pull 的过程可以理解为:

git fetch origin master //从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中

将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:(默认的远程主机别名为origin)

$ git pull <远程主机别名> <远程分支名>:<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

$ git pull <远程主机名> <远程分支名>

2. git merge

有一个远程仓库origin:

git fetch和git merge,git,git,github

本地在此基础上又进行了两次提交:

git fetch和git merge,git,git,github

这时候其他人进行了一次远程push:

git fetch和git merge,git,git,github

因为git是分布式的,原则上可以不用连服务器,所以此时本地并不知道远程分支已经变更(本地的origin/master已经过时):

git fetch和git merge,git,git,github

 git fetch命令会将远程最新的版本拉取到本地,但是并不会影响本地的分支线:git fetch <远程主机名> <远程分支>

git fetch和git merge,git,git,github

git merge会将本地和远程的最新提交混合起来,并生成新的最新提交(混合并解决冲突后的提交):

git fetch和git merge,git,git,github

 git pull命令等于git fetch + git meger命令。


3. git rebase

我们再看下上面git fetch命令后的本地状态:

git fetch和git merge,git,git,github

 这时候我们并不想混合提交,而是想在C2的基础上直接提交L2和L3,这时候在提交历史线上不会有分支线。这个可以用git rebase命令实现:

git fetch和git merge,git,git,github

 rebase(换基命令)说明:

git rebase origin/master #将当前分支换基到origin/master指向的分支。具体为先将本分支的提交全部暂存,然后从origin/master指向的分支开始依次应用暂存的提交,若出现冲突会要求解决,解决后用git add暂存,然后git rebase --continue继续,直到解决完所有冲突,换基操作完成。
git rebase origin/master dev #将dev分支的所有提交换基到origin/master指向的提交

4. git pull vs git pull --rebase

git pullgit pull --merge的简写。 git pullgit pull --rebase 的关系如下:

git pull = git fetch + git merge
git pull --rebase =  git fetch + git rebase

可以看出merge和rebase的区别:

  • merge 会多出一次 commit生成一个新节点,rebase不会。

  • merge 的提交树是非线性的,rebase 的提交树是线性的(通过重写提交历史)。

遇到的问题和使用场景

当我在提议开发同学平时使用git pull --rebase来更新代码时,却遇到了几个问题:

1)git rebase会导致时间日志时间错乱。

git merge会按照时间顺序进行commit的排练,但是git rebase会把本地的提交直接变基到当前最新,所以会导致老的提交

在当前最新的提交前面。

2)git rebase时本地不能有未提交的文件

当本地有未暂存的文件时,git rebase会报error。

$ git pull --rebase
error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

但是使用git pull却不会报错。

这个时候我们或者要提交文件,或者用git stash

git stash # 存储工作区
git pull --rebase  # 更新代码
git stash pop # 恢复工作区

3)git rebase时冲突解决

会出现如下报错:

error: could not apply fa39187... something to add to patch A  
When you have resolved this problem, run "git rebase --continue". 
If you prefer to skip this patch, run "git rebase --skip" instead. 
To check out the original branch and stop rebasing, run "git rebase --abort". 
Could not apply fa39187f3c3dfd2ab5faa38ac01cf3de7ce2e841... Change fake file

步骤:

a) 修改冲突文件:打开冲突文件,搜索:<<<<<< ,git 会用<<<<<<,======,>>>>>>>把冲突的部分标记出来,你可以选择保留某些行,或者删除,或者更改。记得把<<<<<<<, =======, >>>>>>>这些删除掉。

b) 解决完冲突后,执行git add命令标记冲突已解决

c) 继续rebase:git rebase --continue (后续的过程中还有可能产生冲突,解决方法同上)

所以,当本地commit很多时执行git rebase是一件比较痛苦的事情。

总结

综上,我们还是根据不同的场景合理的使用git pull 和 git pull --rebase。

我目前给开发同学的建议是:本地有单个commit时建议用git pull --rebase, 本地有多个commit时建议用 git pull。

对了,前提条件是,远端仓库是可以直接push的,而不是gerrit的那种push成code-review的那种。

如果是gerrit上要生成code-review,那么必定是要使用git pull --rebase的。文章来源地址https://www.toymoban.com/news/detail-768601.html

到了这里,关于git fetch, git pull, git merge, git rebase的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git merge 和 git pull的区别是什么

    git merge 和 git pull 都是 Git 中用于合并代码的命令,但它们的使用场景和功能略有不同。 git merge 是用于合并一个或多个分支的命令。你可以将其他分支的代码合并到当前分支中。通常用于合并开发分支或修复分支到主分支上。 具体步骤: 首先,切换到你要合并到的目标分支

    2024年01月19日
    浏览(42)
  • git pull 总提示让输入merge 信息

    问题描述 :在生产环境拉代码的时候,总是出现 .git/MERGE_MSG,很烦。 虽然每次可以通过输入 :q 命令,取消,然后完成拉取。但是这样就很影响效率。 解决方法 : 方法一 : 暂时屏蔽错误法 我们可以通过以下命令进行拉取代码,屏蔽提示消息 git pull --no-edit origin master 这样

    2024年02月07日
    浏览(47)
  • git pull时自动产生 Merge branch

    如下图,在提交代码时,在自己的提交前面多出了一笔merge提交,这笔提交的内容实际上是在本地仓库进行git pull时,本地仓库更新的远程仓库中代码的内容 本地分支与远程分支存在分叉 分叉就是你在本地仓库做项目的时候,将自己的修改的代码Commit到本地了,而同时你的其

    2024年02月16日
    浏览(49)
  • git进阶(撤销pull、撤销merge、撤销add)

    git reflog reset到某个版本 git reset --hard 91ae6ad 如果merge了其他分支代码造成了大量的冲突 想撤销本次merge如果操作 1、使用上面的reset命令撤销到上一个提交版本 2、执行以下命令直接撤销了本地合并 git merge --abort 查看每次提交的文件修改列表,和分支变化的图形信息 git log --n

    2023年04月09日
    浏览(39)
  • git pull无效,显示 * branch master -> FETCH_HEADAlready up to date. pull无效解决方法

    本地文件夹中删除文件后 ,git pull无效。显示如下: 命令如下: 比如错删a.txt: 一个命令恢复全部文件: 参考文章如下: 【Git 教程系列第 22 篇】删除本地文件后,使用 git pull 命令从远程仓库无法拉取到被删除文件的解决方案_git 删除本地文件再pull没有_Allen Su的博客-CSDN博客

    2024年02月15日
    浏览(56)
  • 【Git】Git 操作命令可视化(五):git clone、git fetch、git pull、git push、git pull --rebase、解决远程仓库与本地仓库的代码冲突

    1. git clone main是本地的main分支,o(origin)/main是表示本地拉去下来的远程的main分支 o/main分支记录了远程仓库拉取时的分支状态 远程分支有一个特别的属性,在你切换到远程分支时,git会自动进入分离 HEAD 状态(这样做是因为git不想让你在本地就能直接进行修改远程仓库代码的

    2024年02月08日
    浏览(95)
  • git 笔记/常见命令/as的fetch,pull ,update project的区别/标签管理

    头(HEAD)HEAD类似一个“指针”,指向当前活动 分支 的 最新版本。  就是在电脑里能看到的项目代码库目录,是我们搬砖的地方, 在这里我们可以新增文件、修改文件内容,或删除文件。 此时的项目代码库目录还是红色的(没有与git关联),未被git跟踪 此时的工作区的代码

    2024年02月06日
    浏览(52)
  • SSH连接下Git fetch/pull/push 速度太慢的一些解决办法

    有时候某些git的代码库在fetch远端的时候会非常慢,速度只有几十k或者几k。这个速度拉取一整个代码库可能要花费一晚上或者一天时间。甚至在每天更新已有代码库时候也会花上十分钟。可以尝试一下这些方法来提升拉取远端代码的速度: 1. Git 版本过低的话可能会导致这个

    2024年02月10日
    浏览(55)
  • git pull 提示错误 fatal: refusing to merge unrelated histories

    从远程拉项目到本地的时候提示错误 造成 fatal: refusing to merge unrelated histories错误的原因有以下几点: 有一个包含一些提交的新 Git 存储库。然后,您尝试从现有的远程仓库中提取。合并变得不兼容,因为分支和远程拉取的历史不同。当你试图合并两个完全不相关的分支时,

    2024年02月11日
    浏览(41)
  • git在pull时报错You have not concluded your merge (MERGE_HEAD exists).

    问题描述         git拉取远程代码时,报错:You have not concluded your merge (MERGE_HEAD exists)。 发生原因         发生这种情况,是由于没有完成上次的 merge 操作,就进行了 pull 操作。在 pull 之前一定要将先前的冲突解决掉。 解决办法  办法一         1.备份自己本地修改的

    2024年02月05日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包