【问题标题】:Rebase Commits With Incrementally Appended Text带有增量附加文本的 Rebase 提交
【发布时间】:2019-03-17 17:41:44
【问题描述】:

假设我正在处理我的本地存储库,并且在编辑单个文件时经常提交 - brandNewFile.txt。所以在开始之前,在原始提交中我们只有一行文本:"It's a nice day"
现在我们在文件末尾添加一行,仅包含 "generic1" 文本,并创建一个新的提交 (A)。
这再次重复,使用 "generic2" 行,导致提交 B。 我们最终得到了 2 个新的提交(A 和 B)。

现在在推送到每个人都可以访问的远程存储库之前,我决定我想清理一点历史记录,并保留我认为与我正在执行的操作相关的有意义的提交。

所以我将从原始提交开始做一个变基,但在应用(选择)B 的同时删除 A。变基一开始,在应用 B 之后会出现以下输出:

Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

both modified:   brandNewFile.txt

no changes added to commit (use "git add" and/or "git commit -a")

为什么会报告冲突,而我想要的只是一次提交,将一行文本附加到已经存在的提交的“顶部”?
对我来说,这不是一个正在尝试的合并操作,尽管结果似乎确实表明这是正在发生的事情。

【问题讨论】:

    标签: git


    【解决方案1】:

    这是因为你的初始提交只有一行:

    It's a nice day
    

    而提交 B 有三行

    It's a nice day
    generic1
    generic2
    

    现在,当 rebase 将提交 B 合并到初始提交时,会发生冲突。 rebase 需要从初始提交中删除第 2 行(generic1),但初始提交只有 1 行。

    【讨论】:

    • 我认为我的错误是我考虑的是引起的更改,而不是修改的文件。该示例是对更“真实”场景的简化:我们从包含一组函数的文件开始,然后添加一些显示调试信息的文本(提交 A),然后对一个函数的其中一行添加一些改进( B),然后缩进一些文本(C),然后删除输入的调试信息(D)。在这 4 个中,我想只保留 B 和 C。我是否可以认为它无法完成,并且在这种情况下需要整个提交字符串?
    • 尝试解决冲突。他们你已经解释过了,不应该有复杂的冲突。否则,您可以从初始状态创建一个新分支 & cheery-pick Commit B & C。
    • 那肯定会解决它,但我希望让 git 自动执行此操作。但是对于初始情况(每次都进行追加),在交互式 rebase 中不能删除任何提交,因为这将实质上中断进程,提示解决冲突。
    • 另一件事:当在初始提交之上应用提交 B 时,git 应该只关心从初始文件(1 行)的状态到提交 B 中的文件状态(3 行)。它应该忘记提交 A 中删除的行,无论如何都会被删除。问题是 - 我相信 - git 无法弄清楚如何安全地(“安全地”,如在结果的一致性方面毫无疑问)从一个状态到另一个状态。
    • 经过大量时间试图了解整个情况 - 事实证明 git 还需要特定更改的上下文才能应用它。在我的示例中,“generic2”确实是 B 与 A 引入的唯一更改,但是围绕此单个更改的上下文包括“generic1”。当 git 尝试应用更改时,它需要上下文才能成功执行此操作,但这无处可寻(“generic1”在初始提交中尚不存在)。这里有人解释的很好stackoverflow.com/questions/33627737/…
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多