【问题标题】:Git: Merge old commit into current head versionGit:将旧提交合并到当前的头版本中
【发布时间】:2012-01-16 08:18:02
【问题描述】:

有一个文件有两个感兴趣的提交,都在Master 分支上,都只修改了一个文件foo:以前的提交AA,当前版本在HEAD。我想将文件的两个版本合并到 HEAD Master 上,同时保留两者的位。

我做了我认为可行的最简单的事情:

git checkout -b merge-purgatory AA
git commit -m "pulled foo back from previous commit for merging into HEAD."
git checkout master
git merge merge-purgatory

这只是用AA 版本覆盖foo 的当前HEAD 版本。 也尝试了更详细的git checkout -m,结果相同:愚蠢的覆盖。

如何强制 git 将 fooAA 版本视为与当前 HEAD 版本的冲突合并?

【问题讨论】:

    标签: git merge


    【解决方案1】:

    如果 git 的合并没有达到你想要的效果,你可以改为:

    1. 确保文件foo 中没有未提交的更改,例如确保git status 是干净的。
    2. 使用AA 中的版本覆盖foo,使用:git show AA:foo > foo
    3. 选择性地仅暂存 foo 中您想要的更改:git add -p foo
    4. git checkout -- foo 放弃对foo 的所有其他更改
    5. 提交分阶段的更改:git commit

    或者,如果您更愿意使用图形差异工具(例如 meld),您可以这样做:

    git show AA:foo > old-foo
    meld old-foo foo
    

    【讨论】:

    • 所以基本上,只需绕过 git 对先前提交的了解并使用手动合并/合并工具。希望从 git 中获得更多的行为,但这太简单了,以至于我成功地使用了它,之后只是做了一些清理工作。谢谢!
    【解决方案2】:

    先前的答案没有保留更改的故事,因此您使用先前的提交来生成新提交的事实。 以下过程将保留此故事。

    git checkout -b merge-purgatory AA
    

    这里你需要稍微修改你的文件,例如你可以添加一个空行。那么

    git commit "pulled foo back from previous commit for merging into HEAD."
    git checkout master
    git merge --no-commit merge-purgatory
    

    这样合并会失败,然后你需要做的就是解决冲突。这对我有用。

    【讨论】:

      【解决方案3】:

      我摆脱它使用:

      git checkout -f b855a13754fabf5cef6ff93ab00558608a839377 -- .

      这会强制将提交 ID 更改到我当前的分支(master)中,然后我从这些应用的更改中创建了一个新分支 (checkout -b),并从后者创建了一个合并请求。

      以上都不适合我 :-(

      【讨论】:

        【解决方案4】:
        git merge --no-commit merge-purgatory
        

        至少会让您有机会审查:在提交之前更改合并。
        另请参阅“How do you merge selective files with git-merge?”中提出的基于樱桃采摘或结帐的技术。


        关于强制手动合并,您可以在.gitatributes file 中为该特定文件声明一个合并策略设置为未设置

        执行三路合并

        合并

        The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick.
        
        Unset 
        

        取当前分支的版本作为暂定合并结果,并声明合并有冲突。这适用于没有明确定义的合并语义的二进制文件。

        【讨论】:

        • 而且,无论如何,“自动合并进展顺利;在按要求提交之前停止”并不能完全回答我的问题:如何防止“自动合并”的发生,而是处理这两个版本冲突(它们是,覆盖彼此的行)并需要手动合并?
        • @Noel:对不起,我破坏了手动合并部分。我已经编辑了我的答案。
        • 谢谢!但是,hrm: echo "* -merge" >> .git/info/attributes 然后 git merge --no-commit merge-purgatory 仍然会导致“自动合并顺利;在按要求提交之前停止”。
        • @Noel 看起来像 stackoverflow.com/questions/3122056/… 并且应该可以工作。您是否使用/path/to/your/file merge=unset 行将政策设置为未设置?
        • @Noel 我理解(并且赞成马克的回答)。如果它对您更有效,那么它就是正确的答案;)
        猜你喜欢
        • 2017-09-26
        • 1970-01-01
        • 2020-09-05
        • 2015-11-05
        • 2017-06-21
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        相关资源
        最近更新 更多