Git rebase/checkout 保留最新修改的文​​件

Git rebase/checkout keep the latest modified file

我想知道怎么从源头拉rebase,如果文件有冲突我想保留最新修改的文​​件。

在 git 中有没有办法获取提交中每个文件的修改日期或仅获取提交日期?或者有没有一种方法可以列出与本地分支和源分支不同的文件,并告诉哪一侧是最新修改的文​​件?

示例场景:

origin/mybranch:
    - File A (modified today)
    - File B (modified yesterday)

local/mybranch:
    - File A (modified yesterday)
    - File B (modified today)

如果我git pull --rebase我想保留最新版本的文件A和文件B。

我正在使用 GitPython 来操作存储库,因此我需要一种使用此条件自动解决任何冲突的方法(保留最新修改文件中的更改)。

首先没有像"favor the latest change by the commit date"这样的合并策略 盒子外面。 Here's the list of supported strategies

从这个列表看来,带有 "ours/theirs" 选项的 "recursive" 策略似乎可以解决您的示例案例的某些部分:

因为你想使用 "rebase",这意味着它将以 "origin/mybranch" 作为你合并的基础,然后尝试在它之上应用你的新提交。

然后有 2 种情况:要么你的更改发生在以后 - 在这种情况下它会干净地应用, 或者你的改变发生在更早的时候 - 在这种情况下你说你想应用他们的版本(即 --strategy-option "ours" 或 "theirs",我认为它是 "ours" for rebase ,这令人困惑...)。

这样做的问题是,如果你的更改发生在今天,而他们的更改发生在昨天,但是你忘记在早上同步,那么即使你的更改发生在较晚的时间(按提交日期),它仍然会产生冲突, 并被不适当地解析为他们的版本而不是你的。

如果这不是您想要的,您可以编写一个自定义自动合并工具,当出现冲突时,它会找出导致它的提交日期,并根据提交选择 ours/theirs日期是最新的。

然后您可以编写一个脚本,在每次冲突时应用变基和您的自定义合并工具。

这种合并工具的简要逻辑

  1. 给定一个冲突的文件名,并知道远程和本地分支名称,您可以找出每个分支最后修改此文件的提交 - 参见 How do I find the most recent git commit that modified a file?

  2. 然后获取这 2 个提交的日期并进行比较

  3. 并做出适当的合并决定:复制 LOCAL 或 REMOTE。