关于出现Merge remote-tracking branch ‘origin/develop‘ into develop这种commit记录的原因

 

引子:关于原文链接,可参考https://stackoverflow.com/questions/6406762/why-am-i-merging-remote-tracking-branch-origin-develop-into-develop,点赞最多的回答果真是比较精品的

问题:

合并分支时出现了merge remote-tracking branch 'xxx' into xxxx

转义过来就是 xxxx合并了远程跟踪分支xxx

原因:

试想,我们平时碰到最多的情况就是合并xxx分支到xx分支,即使两个分支是同为版本分支,或者一个版本分支,一个测试分支,也未曾碰到多余的remote-tracking字样,但是有种情况:

git pull is probably creating the commit. If you make a local commit and then run git pull after someone else pushes a commit up to the repository, Git downloads the other developer's commit and then merges it into your local branch.

译:使用git pull有可能出现这样的提交。如果你创建了本地提交,并且在他人提交到仓库之后运行了git pull,那么git 会拉取其他开发者的提交记录并且合并进你的本地分支。

事实上这里,我也并不是很懂,仔细思考了一下,我发现了盲点,我这么讲(与译文内容描述的或许存在不一样的地方,望批评指正!

我了解到:分支存在两种类型: tracking branches /  remote tracking branches

区别在于:tracking branches或许就是我们本地从远端克隆下来的分支,而remote tracking branches,从其命名上即可发现,是远端跟踪分支,那,我们关于commit记录出现多余的remote字段,不就可以发现些什么了嘛?那是因为我们直接在本地分支上就合并了远端分支的引用 记录(我们常说的origin/master之类的),当然,这与译文描述的没啥区别,但这里, 我发现了个不同点:

前者是pull oriign xxx,后者是直接merge origin/xxx,即使后者fetch了之后,仍然记录不同

唯一的猜测就是,git本身以此来区分用户是直接合并本地远程还是使用git pull来合并的了。

好了,先点到即止。下方开始翻译其所说的内容 ↓

How to avoid these merge commits in the future(如何避免将来合并这些提交记录呢?)

避免未来出现这种情况,你应该使用git pull --rebase,但是rebase也有其不好的地方,总而言之我建议避免使用pull。

我支持你使用这样的规则来替代上述做法:

# download the latest commits (更新本地远程所有分支commit记录)
git remote update -p

# update the local branch (更新本地分支)
git merge --ff-only @{u}

# if the above fails with a complaint that the local branch has
# diverged: (如果上述报错说本地分支出现冲突,这样解决)
git rebase -p @{u}

 Explanation(解答)

git remote update -p 会下载远程所有记录并且会更新远程跟踪分支(例如: origin/master),此操作并不涉及你的工作区文件,索引以及本地分支。-p 参数会修剪远程已删除的分支。因此,如果origin仓库的foo分支已经被删除了,git remote update -p 就会删除你的origin/foo引用。

git merge --ff-only @{u} 会告诉git合并远程分支(@{u}这个参数)到本地分支,仅当本地分支可以快进到远程分支的记录处(最新记录处)(换而言之,如果其和远程分支并没有冲突

git rebase -p @{u} 有效的将你已生成的但未提交的记录移动到要推送的分支的顶部,此操作将排除你正竭力避免的创建愚蠢的记录的必要,这保证了开发历史的线性,并且能更简单的回滚。-p 选项告诉git保持合并信息。这会阻止git线性化正在被重构的记录信息。这是非常重要的,例如,如果你将功能分支合并到master分支,没有带上-p选项,那么未来分支上的每一个记录都会作为使用git rebase所形成的线性化记录的一部分被复制到master分支上,这将会使得开发记录非常难回滚/复盘,而不是更简单。

注意:git rebase 或许不会如你所愿的达到目的,那么最好推代码前回顾下。例如:

git log --graph --oneline --decorate --date-order --color --boundary @{u}..

 我更欣赏使用上述操作而不是git pull --rebase 是由于以下原因:

其一是:它允许你在修改历史记录并合并它们时看到那些合并进来的远端的记录

其二:它也允许你通过对git rebase使用-p选项(--preserve-merges)以防你想要合并一个有意的合并请求(例如:想要合并进入master的一个已经推送的功能分支)

Shorthand: git up instead of git pull(简写:git up 而不是 git pull) 

为了使上述操作更简单,我建议创建一个别名up来做:

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'

 现在你想要让你的分支进行更新,所有需要做的仅仅只是运行 git up 而不是 git pull 如果你获取到了一个错误,那就是因为你的本地分支已经和远程分支有所冲突,这就是暗示你,要去 rebase

Why not git pull --rebase? (为什么不使用 git pull --rebase)

运行 git pull --rebase 与运行 git fetch 然后 git rebase 是一样的。它会尝试快进到最新的远程分支记录处,但是如果行不通的话,它会重构你的本地记录到新的分支记录上去。通常来说,这是ok的,但是要小心:

1. Rebase 是一个比较高级的主题,在做此操作之前你需要理解其含义再下手。

2. git pull --rebase 在合并记录之前是不会给你检查他们的机会的。它依赖于那些改变了远端的操作,更可能的是rebase会是一个糟糕的操作 -- 一个 rebase --onto, merge, reset , 或者 push -f 都可能比一个单独的 rebase 要合适。

3.将 --preserve-merges 传递给 rebase操作就目前而言是不行的,因此任何一个带有目的性的功能分支的合并都将被线性化(记录呈一条直线),且记录上也将重新出现那些功能分支的记录(所有的,因此导致了重复)。

"Fixing" an existing merge commit created by git pull(解决由git pull创建的已存在的merge记录)

如果你目前还未推送一个通过 git pull 之后创建的合并记录,你就能把这个合并记录重构出来,假设你现在还未做一个带有目的性的合并(例如:将一个已推送到远程的功能分支合并进入你的本地分支),接下来应该这样做:

git rebase @{u}

 上述操作会告诉git从 HEAD指向(当前记录,应该也是最新记录)中选出所有可达的且非合并的记录,移除 @{u} 中可达的记录(这是“远端分支”的缩写,例如:origin/master, 如果当前指向是master的话), ps: 这里个人理解的是,找到head指向的本地分支和@{u}共同的分支点,然后分别可达的这一串记录(原文描述为reacheable,但是并没有特指从哪里到哪里)  并将选中的记录移到此刻分支的头部..

待续(剩下的翻译内容似乎作者写的有问题)

补于2021年5月9日23:51:34

再言之,git rebase意指变基操作,但我更欣赏重构这个词,如我在A分支,执行了rebase操作,那么rebase后的分支就代表了我即将变动过去的分支,如:

git checkout A

git rebase B (回溯A当前分支记录 到 与B共同的祖先节点,并保存这些记录,然后重构到B分支上,且是在B当前最新分支记录上再新增这些记录)

ps:此时如果有冲突,就解决冲突,该add就add,然后commit,再git rebase --continue,直到无冲突

完~(有错误之处, 望指正~)

  • 17
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: "merge remote-tracking branch" 可以翻译为 "合并远程跟踪分支"。 在Git中,"远程跟踪分支"是指远程仓库中的一个分支,在本地仓库中对应着一个"远程跟踪分支",可以通过与远程仓库的交互来更新本地的远程跟踪分支。 当使用命令"merge remote-tracking branch"时,通常是想将远程仓库中的代码更新到本地仓库中,使本地仓库中的分支与远程仓库中的分支同步。 ### 回答2: Merge remote-tracking branch是指将远程仓库的分支(remote-tracking branch)合并到本地仓库中的一个分支上。这是基于分布式版本控制系统(DVCS)的特性,允许开发者们在本地仓库与远程仓库进行交互同步,方便多人协作开发。 在Git中,远程仓库是指其他开发者或团队所维护的代码库,而本地仓库是指我们自己的代码库。当我们需要协作开发时,通常会先将远程仓库的代码复制到本地仓库(clone操作),然后在本地仓库上进行更改、提交等操作,最后再将本地仓库的代码推送到远程仓库(push操作)。 如果其他团队成员在远程仓库上提交了新的代码,而我们又在本地仓库上进行了新的更改,则需要先将远程仓库的代码合并到本地仓库中,这个操作就叫做Merge remote-tracking branch。 具体操作步骤如下: 首先,我们需要从远程仓库拉取最新的代码到本地仓库中,这个操作叫做fetch: $ git fetch origin 其中,origin表示远程仓库的名称,一般默认为origin。 然后,我们需要切换到本地仓库中需要合并的分支,例如我们想将远程仓库的master分支合并到本地仓库的dev分支: $ git checkout dev 接着,我们执行merge命令将远程仓库的master分支合并到当前分支: $ git merge origin/master 其中,origin/master表示远程仓库的master分支。 最后,我们提交合并后的更改到本地仓库,并推送到远程仓库: $ git add . $ git commit -m "Merge remote-tracking branch 'origin/master'" $ git push origin dev 这样,就完成了将远程仓库的分支合并到本地仓库的操作。需要注意的是,Merge操作可能会造成代码冲突,需要开发者手动解决。因此,在进行这个操作前,一定要仔细确认自己的更改和远程仓库的更改是否有冲突,以避免不必要的麻烦。 ### 回答3: 合并远程跟踪分支,是指将远程仓库的分支与本地分支进行合并,使得本地分支与远程分支所代表的代码内容达成一致。这个操作通常用于多人合作开发时,需要将多个开发者的代码进行整合。 具体而言,合并远程跟踪分支的步骤通常如下: 1. 确定本地分支与远程分支的关系:使用“git branch –a”命令查看所有分支,其中远程分支的名称通常以“remotes/xxx”的形式呈现。找到需要合并的远程分支,并记录其名称。 2. 将远程分支与本地分支建立关联:使用“git checkout –b 本地分支 origin/远程分支”命令,将远程分支与本地分支建立关联。 3. 进行代码合并:使用“git merge 远程分支名称”命令,将远程分支的代码合并到本地分支中。 4. 处理代码冲突:如果本地分支与远程分支存在代码冲突,需要手动解决冲突。 5. 提交代码并推送到远程仓库:使用“git push origin 本地分支名称”命令,将本地分支的代码推送到远程仓库。 总的来说,合并远程跟踪分支是一种相对复杂的操作,需要熟练掌握 Git 命令和相关的协作工作流程。只有在正确定位了代码的不同版本,才能在多人参与的项目中,更高效地完成代码整合和开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值