如何在 git 中标记您的分支未解决?

Posted

技术标签:

【中文标题】如何在 git 中标记您的分支未解决?【英文标题】:How to mark your branch unresolved in git? 【发布时间】:2020-04-15 13:24:53 【问题描述】:

背景

在我正在处理的存储库中,

有一个主分支master 和一个受保护的开发分支stage

我们的开发人员将我们所有的 MR 发送到 stage,管理员会在适当的时候将 master 更新为 stage

我做了什么

所以我在我的分支上,我们称之为changesA。这两天我一直在做,期间合并了一些分支后更新了stage分支。

今天,在用我的更改更新了我的远程分支后,我从舞台上拉下来 -

git pull origin stage

有一些合并冲突,比如说 10 个文件。我解决了它们并推动了更改。所以现在我的远程分支更新了阶段。在我的提交历史中创建了一个新的合并提交,其中包含 152 个更改的文件(1587 个添加和 4543 个删除)。

我意识到我在解决这些冲突时犯了一些错误。所以我恢复了我的合并提交using this method。在我的提交历史记录中添加了一个新的还原提交,其中包含 152 个更改的文件(4543 个添加和 1587 个删除)。

我在我的分支上工作了更多,并用这些更改更新了我的远程分支。

有什么问题

在这一点上,我希望我的分支在我恢复拉动后处于后台。而且我希望在恢复合并提交时我基本上未解决的这 10 个文件中存在冲突。

但是当我运行相同的命令git pull origin stage 时,它说我的分支已经与阶段保持同步。我相信出于某种原因,我的分支已被标记为已解决并已更新阶段。

这里出了什么问题,我该如何解决这 10 个相同的冲突?

我尝试过的(没用)

    我尝试签出舞台并更新了我的本地舞台。 git fetch 在我的分支上。 我通过git checkout -b changesACopy 创建了我的分支的副本并尝试了git pull origin stage。得到了同样的信息。 我删除了所有本地分支,签出阶段并拉取。然后检查了我的分支并拉了一下。 我从阶段签出了一个分支,并对一个文件进行了更改,与我的分支产生合并冲突。将该分支合并到阶段。我预计会有 11 个文件与我的分支发生合并冲突,但只有一个。

什么有效

没有捷径可走。以下是我为解决此问题而采取的步骤 -

    git reset --hard HEAD~4 以至于我在退出舞台之前推送了我的更改。 git pull origin stage 再次。这次我要再次解决这 10 个冲突。 (这次我做对了!) git cherry-pick <commit-hash> 我在还原后推送的最新更改。 git push origin changesA --force。因为我回到了历史,所以需要强制,所以我的本地分支在我的遥控器后面,git 在拉动之前会拒绝任何推送。我一个人在我的分支上工作,所以我知道如果我强制推送,我不会覆盖任何更改。

完成!

感谢所有帮助。我知道这种做法,但我想知道为什么 revert 没有像我预期的那样工作。接受的答案涵盖了这一点。

【问题讨论】:

git revert 是一个 git 提交,它对所做的提交进行了反向更改。在 git 约定中,这是向前发展的。您不必担心 git pull origin stage 显示已经是最新的,因为它在阶段分支中是最新的。阶段分支中的所有提交都已经在您的分支上。您应该检查的是当您从 changesA 创建 PR 到 stage 时会发生什么。如果这显示正确的更改,那么您应该很好。 我检查了一些文件,但我的分支没有阶段的更改。当我创建 PR 时,它假定我的分支是真实的并覆盖这 152 个文件。 最简单的方法:从stagecherry-pick 创建一个新分支,从您的分支提交到这个新分支并修复再次出现的任何冲突。 或者通过git reset --hard <commit> 在分支中合并阶段之前返回提交,然后再次进行合并。确保将当前提交保留为分支,以便在需要时可以再次返回。 请注意,不存在已解决或未解决的分支branch name 只是标识一些提交。提交要么存在(然后可以通过哈希名称标识),要么不存在。就是这样——这就是 Git 分支的全部内容! (嗯,几乎所有。:-)) 【参考方案1】:

但是当我运行相同的命令 git pull origin stage 时,它​​说我的分支已经与 stage 保持同步。

当然:stage 之前已经合并到 branchA。 Ant 更改(恢复提交、修复等)最后一次合并之后完成一个分支 A,不会受到从阶段到分支 A 的新合并的影响。

  --s--s (stage)
        \  <= merge already done 
 --a--a--M--[revert]--[fixes]

如果你一个人在 branchA 上工作,最好的做法是在你想集成 stage 时在 stage 顶部 rebase branchA,强制推送 branchA,然后从 branchA 合并到 stage (简单的快进合并)

在您的情况下,将 branchA 重置为合并之前会更容易,变基并解决相同的冲突,然后强制推送。

【讨论】:

以上是关于如何在 git 中标记您的分支未解决?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 中刷新远程 Git 分支

Git如何在不提交当前分支的情况下切换到其它分支进行操作——git stash

在 git 中切换分支时,如何让 Emacs 恢复所有未更改的缓冲区?

如何将本地未提交的更改合并到另一个 Git 分支?

IDEA中Git分支未push的变更集如何合并到另一个分支

使用 Git 将未合并的功能分支合并到另一个功能分支