【问题标题】:How to select the file version from master during a rebase?如何在 rebase 期间从 master 中选择文件版本?
【发布时间】:2021-02-18 09:46:24
【问题描述】:

我在更新的 master 上启动了我的分支的 rebase。在 rebase 期间,有一些冲突的文件很容易解决。然而,一个文件是一个包含数百个宏定义的巨大标题,这些宏定义都是相互冲突的。

我想简单地从 master 中选择文件版本,而不编辑当前的冲突标记文件。

在不放弃我已经对其他文件进行的冲突解决的情况下,我怎样才能做到这一点?

选项是使用命令行或 TortoiseGit。

【问题讨论】:

    标签: git git-merge rebase merge-conflict-resolution


    【解决方案1】:

    您可能会考虑必须手动引入您在分支中引入的更改。假设你的分支是 X,那么你可以这样做:

    git checkout HEAD -- the-file # have the file exactly as it is in the base branch of the rebase
    # now, **manually**, check the differences between "the common ancestor",
    # which in a rebase it has a different meaning, and what is being rebased:
    git diff HEAD~ REBASE_HEAD -- the-file
    # find a way to have the file as it is in your working tree to include those changes that the diff is showing
    # when you are done:
    git add the-file
    git rebase --continue
    

    【讨论】:

    • 谢谢。我没有对该文件进行任何更改。一位同事在他的分支中制作并合并为master。我现在正试图通过对 master 的这些更改来重新调整我的分支,并且该头文件显示为冲突。往里看,所有的冲突都只是行尾的空格字符,在较新的版本中被删除(目前在 master 中)。 (而且只是强调一下,我现在在 rebase 中间,不想git rebase --abort
    • 那么,您想要做的是将文件保持原样? git checkout HEAD -- the-file; git add the-file; git rebase --continue。请记住,HEAD 在变基期间是您要变基的分支上,不是正在变基的分支。
    • 我在从 master 分支的分支 X 上。取得了一些进展,从远程(“原点”)更新了 master,现在尝试在 master 的最新更新之上重新调整我的分支 X。通常,在我的分支中,我会先做git fetch orign master:master 然后git rebase master 然后解决冲突和git rebase --continue。然后结帐 master 并将我的分支合并到 master 中。现在我在变基操作中间遇到了这个巨大的文件冲突。我不想git rebase --abort。只是为了获得相关文件的主版本,添加它并继续 rebase。
    • Right: git checkout HEAD -- the-file; git add the-file; git rebase --continue 使用 master 而不是 HEAD 如果这会让你感觉更舒服......这是一回事只要你不关心你可能已经执行的任何更改你的分支上的文件。
    • 谢谢,我没有更改文件。
    【解决方案2】:

    考虑到您正在使用 master 进行变基。您可以从 master 分支签出该特定文件,这将覆盖本地副本。

    git checkout --theirs my/file.js
    

    (这里 --theirs 告诉 git 从我们正在变基的分支中获取文件)

    【讨论】:

    • 确定吗?在 rebase HEAD 中是基本分支,而 REBASE_HEAD 是您目前在 rebase 操作中挑选的内容。 git checkout 在进行变基时意识到了这种区别,因此它改变了它们的含义?
    • @eftshift0 使用REBASE_HEAD 可能会撤消在被重新定位的分支中发生的非冲突更改,即在几次提交之前发生但不在master 中的更改。使用 REBASE_HEAD 会将内容添加到当前提交中以撤消该更改。建议阅读本文的人使用git showgit diff 以避免做出类似的意外更改。
    • 此命令将更改相关文件,对吗?然后我可以git add my/file.js 然后git rebase --continue?
    • 好吧,在签出并添加文件之后,然后运行rebase --continue 我收到一条消息说没有任何变化,也许我忘了添加我的文件?在敲了几下头之后,我决定中止变基。由于我更新的唯一文件没有冲突,我想再试一次,这次检查 all 较小的冲突文件。最终放弃了这个 rebase 尝试。我讨厌 git。
    • 如果你 rebase --continue 显示没有文件更改,那么你可以使用 rebase --skip 跳过那个特定的提交。由于您只有一个更改也被 rebase 分支替换,因此跳过不会影响其他任何内容。
    猜你喜欢
    • 2020-01-06
    • 2019-04-25
    • 1970-01-01
    • 2013-03-14
    • 2021-10-14
    • 1970-01-01
    • 2014-02-24
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多