git - 重新设置合并冲突:如何撤消?
问题描述
我正在研究一个月前从 master 分支出来的功能分支 B。随着其他新功能的出现,主分支不断更新。
这是 master 分支现在的样子:
1 -> 2 -> 3 -> 4 -> 5 -> 6 ->7
当我第一次分支出来时,它看起来像这样:
1 -> 2 -> 3
这就是我的功能分支 (B) 现在的样子:
x -> y -> z
现在我已经准备好将我的新功能推送到 master,我被建议先从 master 变基,然后创建一个 PR。
在这样做git rebase
时,我的分支遇到了与几个文件的合并冲突。我以为我会保留传入的更改,并且变基将正常进行。但是,我解决了冲突,将整个“REBASE MASTER”步骤转换为一种“MERGE MASTER”。又名:它将已经合并到 master 中的提交应用到我的功能分支中,而不是我最初打算使用git rebase
.
这就是我的功能分支现在的样子:
x -> 4 -> 5 -> 6 -> y -> 7 -> z
这是我想要实现的(但没有实现):
1 -> 2 -> 3 -> 4 -> 5 -> 6 ->7 -> x -> y -> z
我怎么回去?这已经被推送到远程分支,所以我不能简单地删除我的本地分支并再次从原点获取。
我能想到的一种方法是再次从 master 分支出来,并创建一个功能分支 C。然后,从 B 到 C 的cherry-pick提交。一旦我确定 C 是 B 的完整副本(并且只包含我的提交想要),我可以删除 B。我错过了什么吗?还是有更好/更快的方法?
解决方案
(首先,以防万一,中止任何仍在进行中的变基git rebase --abort
)
你是唯一一个在这个特性分支上工作的人吗?(我想是的,我会假设它为以下)
PR 是否已被接受/合并到 master 中?
如果不是,那么这是一个非常不可逆转的情况。(这可能是 Lux 在评论中暗示的)
首先,找到您需要恢复的提交哈希(z
在您的示例中)。为此,您可以检查您的分支的reflog(或者如果可用,可以从您最近的命令输出中选择它)。
然后将本地分支 B 恢复到旧引用(在变基之前)并再次将其推送到远程(使用--force
,因为 git 会抱怨这不是线性历史)。
git branch -f B <commit_hash_of_z>
git push -f origin B
现在你可以重做你的 rebase 并尝试找出它上次横盘的地方。
推荐阅读
- java - 使用 IF ELSE 时的颠簸转换将键映射到新键,并将这些替换用于新键值对
- amazon-web-services - Terraform 导入默认 dhcp 和主路由表 id
- sql - 如果相对表列的总和在请求的范围之间,我如何在 Laravel 中构建一个获取数据的查询范围?
- android - 将字符串转换为日期失败并出现异常 - 即使格式正确,日期也无法解析
- java - 通过代理使用 TLS/SSLContext 的 Java HttpClient
- mysql - Couchbase 基准测试显示非常慢的 INSERT 和 GET(使用 KeyValue 操作);比持久化 MySQL 数据慢
- cakephp - 无法在 Cake PHP 4.1 中验证用户
- javascript - 无法在车把视图中显示 ValidationResult
- laravel - Laravel 不广播到 Socket.IO 客户端
- java - 当关联对象“陈旧”时清理 Redisson pub/sub 侦听器