如何在 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 个文件。
最简单的方法:从stage
和cherry-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 中标记您的分支未解决?的主要内容,如果未能解决你的问题,请参考以下文章
Git如何在不提交当前分支的情况下切换到其它分支进行操作——git stash