git - "Reverse-merge"一个分支

标签 git merge branch

假设我有一个分支 case-xyz,我在其中处理案例 #xyz,“实现 Hello World”。

在开发过程中,我添加了调试输出等,这些不应成为最终提交的一部分。

我可以做类似下面的事情吗:

  • 分支到 case-xyz-debug 并只在那里提交调试代码。
  • 偶尔将 case-xyz-debug merge 到 case-xyz。
  • 在 case-xyz 中提交应该进入最终补丁的内容。
  • 最后,“反向 merge ”case-xyz-debug,即删除来自该分支的所有更改,与 merge 到 case-xyz 的时间无关。换句话说,这应该等同于从 case-xyz-debug 中恢复所有 merge 。

我知道在还原 merge 提交时,Git 不会忘记 merge ,也就是说,它仍然认为你已经 merge 了,所以你只能通过还原还原来重新 merge 。因此,只需要删除最初在 case-xyz-debug 中提交的所有更改,如何记录是无关紧要的。但是,如果我也可以执行以下操作,那就太好了:

  • git checkout case-xyz
  • git checkout case-xyz-done
  • git "反向 merge "case-xyz-debug

因为我可能想继续开发/调试:

  • git checkout case-xyz
  • 更改文件
  • git commit -am "哎呀,忘了东西"
  • git checkout case-xyz-really-done
  • git "反向 merge "case-xyz-debug

我希望我的意图是明确的。如果能以完全不同的方式实现这一点,我也会很高兴。

最佳答案

作为我正常工作流程的一部分,我经常通过交互式 rebase 来做这类事情。我提交的内容包括调试日志记录、临时测试更改(例如线程 sleep 调用以测试计时问题、故意抛出异常以测试错误处理代码)、硬编码值,以便更轻松地在我的应用程序中进行端到端测试,而无需在 UI 中输入值等。我将这些事情保存在独立的提交中;按照我自己的惯例,如果提交日志消息全部大写,则表示不应将提交推送到远程。

当我准备好“反向 merge ”这些更改(删除它们)时,我会通过交互式 rebase 这样做:

git rebase -i <id of branch point>

我只是删除了包含所有大写消息的提交。

(您实际上可以将其用于其他目的,例如将它们重新排序以便它们都位于分支的开头,这对于 git commit --amend 'ing 您的实际工作很有用,或者将它们重新排序到末尾,这可以当你想将 branch-point..<id of last real commit> 推送到远程时很有用,让你的“调试”提交完好无损并在当前历史行的末尾。)

知道 <id of branch point> 是什么可能有点痛苦;在我的工作流程中,我不想将我的分支重新定位到 f.e. 的末尾。 master ,同时删除调试提交;出于这个原因,我保留了一个本地 float 标签,我将其用作引用点,我将其简单地称为 rebase(这可能会造成混淆,但您可以选择任意命名)。如果这看起来工作量太大,使用 git rebase -i `git merge-base HEAD master` 可能是您的一个选择。

(我理解关于这是一种危险做法的论点,但我不认为它们特别有说服力;使用 SCM 有上百万种方法可以搬起石头砸自己的脚。您应该考虑 git rebase --abortgit reflog 将成为你的“逃生舱口”,以防你不小心删除了包含超过你的调试代码的提交。)

HTH

关于git - "Reverse-merge"一个分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12492881/

相关文章:

join - 将制表符分隔的文本文件合并到单个文件中

java - 在 Java 中拆分和合并大文件(大小以 GB 为单位)

git - 使用 'pull'或 'merge' merge 本地分支?

git - 重用 merge 的开发分支/使用 git 重新 merge 到未更改的稳定分支

git - .gitignore 不忽略子目录,都试过了

Git:git svn rebase 失败。 RA层请求失败

git - 如何在git中列出当前项目的所有日志?

git - 我可以从 git-diff 获得补丁兼容的输出吗?

json - 使用 jq 将两个数组合并为一个对象

mercurial - Subversion用户的思考: What is a "branch" in Mercurial terms?