关于出现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,直到无冲突

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

<think>好的,用户想了解如何撤销 Git 合并远程跟踪分支的操作。首先,我需要回忆一下 Git 中合并和撤销的相关命令。用户提到的是合并了远程跟踪分支,也就是可能执行了类似git merge origin/branch这样的操作。撤销合并一般可以使用git reset或者git revert,但具体情况要看是否已经推送到远程仓库。 根据引用[3],当合并远程分支时出现冲突,解决方案提到了使用git rebase,但撤销合并可能需要不同的方法。如果合并尚未推送到远程,使用git reset --hard HEAD~1应该可以回退到合并前的状态。但如果有其他人已经拉取了这次合并,可能需要用git revert来创建一个反向提交。 另外,引用[4]提到通过右键菜单进行合并,这种情况下用户可能在图形化工具中操作,但命令行撤销的方法同样适用。需要确认合并后的状态,是否有未提交的更改,或者是否已经提交。如果合并已经提交,那么reset或revert是主要选项。需要提醒用户备份当前工作区,避免数据丢失。 可能还需要考虑合并是否产生了冲突,如果解决过冲突,撤销时是否需要额外处理。总之,关键步骤是确定合并提交的哈希值,然后根据情况选择reset或revert,并确保操作后的状态正确。同时,提醒用户在撤销后如何正确同步远程分支,可能需要强制推送或重新拉取。</think>要撤销 Git 合并远程跟踪分支的操作,可通过以下步骤实现: ### 方法一:未推送至远程仓库时 1. **查看合并提交记录** ```bash git log --oneline --graph ``` 找到合并提交的哈希值(如`abc123d`),其描述通常包含类似`Merge remote-tracking branch 'origin/feature'`[^3] 2. **硬重置到合并前状态** ```bash git reset --hard HEAD~1 # 若合并是最近一次提交 # 或指定具体提交哈希 git reset --hard abc123d^ ``` 此操作会**彻底删除合并后的修改**,确保已保存工作区变更 ### 方法二:已推送至远程仓库时 1. **生成反向提交** ```bash git revert -m 1 abc123d # -m 1 表示保留主分支线 ``` 该操作会创建新的提交来抵消合并效果,避免破坏协作历史[^2] 2. **推送修正** ```bash git push origin master ``` ### 补充说明 - **图形化操作**:使用 Git GUI 工具(如 SourceTree)右键点击合并提交选择"Reset"或"Revert"[^4] - **冲突处理**:若合并时解决过冲突,撤销后需重新解决后续合并冲突 - **状态验证**:撤销后执行`git status`确认工作区清洁度 $$ \text{操作有效性验证公式:} \quad \exists c \in \text{commit\_history}, c.\text{message} = \text{"Merge"} \Rightarrow \text{reset/revert}(c) $$
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值