Git merge 和取消设置还原的提交

标签 git

我有一个包含功能 1、功能 2 和一些修复的开发分支。出于另一个开发原因,我们想从 develop 创建另一个分支,并且只需要该分支中的修复,而不需要功能 1 和功能 2。所以我从 develop 创建一个分支并恢复功能 1 和 2 的提交。现在我们在那个新分支做了一些开发。现在我想将这个分支与 develop 分支 merge 。但是我们需要开发分支中的功能 1 和 2。但是如果我们 merge ,那么功能 1 和 2 提交将从开发中删除。

那么在 git 中解决它的最佳方法是什么。一种方法是获取功能 1 和 2 的更改,并将其作为补丁应用到 merge 的开发分支。但问题是这两个功能有几个变化。

最佳答案

在下面的回答中,我假设当您从 develop 分支出来时,您做的第一件事是还原两个功能提交,然后才进行实际的开发工作。如果不是这种情况,我的回答应该仍然有帮助,尽管您可能需要执行一些额外的步骤来解决您的问题。

对于您的问题,从概念上讲最简单的解决方案可能是从新分支中挑选非还原提交到 develop:

git checkout develop
git cherry-pick B^..D

BD 替换为您要从新分支引入 develop 的提交的 SHA-1 提交哈希。请注意,您可能会因此而发生 merge 冲突,因为您正在将您的工作重新应用到不同的基础上。

如果您喜欢冒险,也可以尝试使用 git rebase --onto。这是一个图表,说明了您的新分支和 develop 的当前状态:

develop   ... ---A---B---C
                  \
newbranch          R1---R2---D---E

并且您想在 develop 之上播放来自 newbranchDE 提交,而忽略那些R1R2 还原提交。换句话说,你想以这样的方式结束:

develop   ... ---A---B---C---D'---E'
                  \
newbranch          R1---R2---D---E

您可以使用以下命令来实现此目的:

git checkout develop
git rebase --onto C R2 E

onto 命令表示以 C 为基础,并重放父级为 R2 的所有提交(但不包括 R2 本身)直至并包括提交 E。由于 CdevelopHEAD 重合,我们只是要求 Git 重放提交 D E,在 develop 顶部的那个顺序。

如果您想对 Git 的 rebase --onto 有一个很好的解释,我建议您阅读@Enrico 在这里给出的答案:

I can't understand the behaviour of git rebase --onto

关于Git merge 和取消设置还原的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42992021/

相关文章:

git-svn 忽略大型二进制文件

python - 依赖 setup.py 中的 git 仓库

git - 尽管文件内容没有改变,但 git clone 后 zip 文件的 Sha256 哈希值不同?

java - 使用 Git 查找 TODO 的日期

git - 如何通过推送将一个 git 远程镜像到另一个

eclipse - 无法使用 EGit 克隆远程 git 存储库

eclipse - Go语言配置

git-branch - git:列出悬挂标签

Git lfs - "this exceeds GitHub' s 文件大小限制为 100.00 MB"

java - Eclipse git 插件和获取当前分支的方法 - 将 id 提交到 Java 代码版本信息字符串