git - 用重写提交历史的分支强制更新“main”的正确方法是什么?
问题描述
编辑:谢谢大家的回答。只是强制覆盖远程文件是我知道会发生的事情,git push --force
但我更关注不保留提交历史记录main
(再次,我希望重写提交历史记录 - 不一定有新文件覆盖远程文件) - 但在阅读之后通过答案,我意识到我忘记了强制推送如何用我的本地分支覆盖远程,包括提交历史
这一切都始于我注意到有人在历史记录中进行了合并提交,而不是像他们应该做的那样进行变基
我按照这个先前回答的问题来解决这个问题,也就是说,以一种重新设置基准而不是合并提交的方式重写提交历史。这种重写只是在本地分支上完成的,我确认代码仍然按预期构建/工作,并且HEAD
我的分支和main
匹配项都是。唯一的区别是从提交c
开始的实际提交对象(见下图) - 但我理解为什么这会产生问题,我现在在我的分支上有一个完全不同的历史
问题是:我现在想做什么?由于我重写了提交历史,我的本地分支已经偏离了origin/main
预期。在我的脑海中,我只想拿起我的分支并强制推送到main
具有main
我在此分支上编写的新历史的内容
main
我理解以这种方式重写历史可能是非常不鼓励的——但是如果想要清理没有任何合并提交的历史,是否有适当的方法来处理这样的事情?
我采取的步骤:
- 本地存储库的
main
分支的历史记录如下所示:
a b d e f g h i j k
o---o---o---o---o---o---o---o---o---o
\---o---/
c
HEAD
在哪里k
和合并提交是e
- 目标是重新定位 c
并完全d
删除e
- 从中签出一个本地分支
main
,使其反映上述提交历史 - 在我的本地分支上,重新定位到
a
因为那是发生分歧的地方
$ git rebase -i <sha of a>
- 在交互式变基中,选择
c
进行编辑并e
完全删除 - 解决了合并冲突并逐步执行
git rebase --continue
命令,直到我的本地分支如下所示,我又回到了HEAD
. 由于变基重写了历史,因此之后的提交c
是完全不同的对象,但实际上与远程存储库中的内容没有任何不同的内容
a b d c l m n o p q
o---o---o---o---o---o---o---o---o---o
- 观察以下内容
git status
$ git status
On branch cleanup
Your branch and 'origin/main' have diverged,
and have 6 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
这又是预期的。我关心的是如何继续,也就是说,强制更新main
分支以获得我现在在本地分支上拥有的更清晰的历史记录
解决方案
如果您想强制在遥控器上重写您的历史记录,您将不得不强制推送您的更改。
- 在您的本地结帐时,您清理了主要的
- 做一个
git push -f origin main
。这将用您在本地创建的远程主目录重写
陷阱:
- 任何克隆或更新了 repo 的人都会有不同的历史记录。他们将不得不获取并硬重置他们的本地 main 到一个新的 origin/main。您必须确保发生这种情况。否则,如果其他人强行推动,那么您的历史就会一团糟。
- 当你用力推。如果在您上次进行更新后有任何更改被推送到远程。他们会迷路的。
个人经验:在过去,甚至我都沉迷于没有合并提交和重新定位所有内容。随着时间的推移,我意识到它被高估了。这不是我们应该花时间担心的事情。合并提交也很好(而且很漂亮)。
推荐阅读
- swift - 每次我尝试访问它时,Struct 的 UUID 类型的 id 都会发生变化
- linux - 如何清空日志文件的内容
- css - 打破 Grommet 样式组件样式的全局样式
- java - 在Java端解密列数据
- javascript - 如何将 Next.js 链接到现有的 HTML 静态网站?
- python - Python Flask - 从 open_session 调用时中止(400)不使用预期的模板
- mariadb - 我在存储过程 mariadb 中出现语法错误的原因是什么?
- c# - 如何将 JSON 反序列化为泛型对象,并根据 JSON 中的数据结构获取合适的类型?
- azure-log-analytics - 我正在使用度量收集器设备从我的每个设备收集一些天蓝色 IotHub 数据。如何获取这些insightMetrics 数据,设备方面
- c# - 在 MVC 中将秒转换为分钟不起作用