[Git push 时如何避免出现 “Merge branch ‘master‘ of ...“]

Git push 时如何避免出现 “Merge branch ‘master’ of …”

产生原因分析

当多人合作开发一个项目时,本地仓库落后于远程仓库是一个非常正常的事情,可参考下图。

 A-B-C(master)
    \
     D(origin/master)

具体情境如下:

  1. 我当前拉取的远端版本为 B,此时修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库。
  2. 另一位开发者在 B 的基础上,同样 commit 了一次并 push 到远端仓库。那么这个时候,我再 push 自己的代码就会发生错误,如下。
To github.com:maoqyhz/usegit.git
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:maoqyhz/usegit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

这个时候我们会选择,先 pull,再 push。Ok,push 成功,但是此时我们查看 log 就会发现除了我们自己提交的那条日志之外,会多出一条 “Merge branch ‘master’ of …”。

那么,为什么会出现这种现象呢?其实是与 Git 的工作原理有关,对 Git 比较了解的人应该会知道,无论是 pullpush 亦或是 merge 操作,其实背后都是有很多的不同的模式的。

在进行 pull 操作的同时,其实就是 fetch+merge 的一个过程。我们从 remote 分支中拉取新的更新,然后再合并到本地分支中去。

  1. 如果 remote 分支超前于本地分支,并且本地分支没有任何 commit 的,直接从 remote 进行 pull 操作,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息
  2. 如果想之前那样,本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操作拉取更新时,就会进行分支合并,产生合并节点和 log 信息。这两种状态分别如下图所示:
# fast-forword 
A-B-D(origin/master)
     \
      C'(master)

# merge
A-B-C-E(master)
   \ /
    D(origin/master)

如何避免

为了去除自动生成的 log 信息,有以下几种解决方案:

  1. 如果你使用的是 Git Bash,直接使用 git pull --rebase。如果拉取不产生冲突,会直接 rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并。
  2. 如果使用的是 GUI,例如 TortoiseGit,可以先 fetch,再手动 rebase 就可以了。

关于 rebase 和 merge

关于什么时候使用 rebase,什么时候使用 merge,开发者总结了几条规则:

  • 从 remote 分支拉取更新到本地时,使用 rebase。
  • 当完成 bug 修复或新功能时,使用 merge 将子分支合并到主分支。
  • 没有人应该 rebase 一根共享的分支。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误信息表示当前的分支master没有上游分支(remote branch)。为了推送当前分支并将远程仓库设置为上游分支,可以使用以下命令: git push --set-upstream origin master 这个错误通常出现在使用git init初始化本地仓库后,通过git remote add origin添加远程仓库地址,然后使用git push进行推送。原因是没有将远程分支设置为当前分支的上游分支。 解决方法如下: 1. 首先,使用git fetch命令将远程仓库的最新数据拉取到本地仓库。 2. 然后,使用git checkout -b master origin/master命令将远程仓库的主分支拉取到本地并设置为本地仓库的主分支。 此,本地仓库的数据已经与远程仓库同步,就好像使用git clone命令一样。接下来,你就可以使用git add、git commitgit push命令来添加、提交和推送数据了。 综上所述,解决这个问题的步骤如下: 1. 使用git fetch命令将远程仓库的最新数据拉取到本地仓库。 2. 使用git checkout -b master origin/master命令将远程仓库的主分支拉取到本地并设置为本地仓库的主分支。 3. 使用git add、git commitgit push命令来添加、提交和推送数据。 这些是今天使用到的一些Git指令。你可以使用git branch命令查看分支,使用git checkout命令切换到已有分支或新分支,使用git status命令显示当前项目状态,使用git commit命令提交项目到本地仓库,使用git push命令将本地仓库分支推送到远程仓库并建立分支,使用git merge命令更新分支(合并分支)。 希望这些信息对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值