【问题标题】:Git rebase/checkout keep the latest modified filegit rebase/checkout 保留最新修改的文​​件
【发布时间】:2018-11-05 04:29:54
【问题描述】:

我想知道如何使用 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 来操作存储库,因此我需要一种使用此标准自动解决任何冲突的方法(保留最新修改文件中的更改)。

【问题讨论】:

  • 这与 git 的观点相矛盾。如果昨天有人在 A 中添加了“Hello”,而今天又有人添加了“World”,那么您为什么不希望两者都进行更改呢?诸如保管箱之类的东西更适合于此-始终应用最后一次更改。 GIT 专门用于合并来自不同团队成员的更改——不仅仅是版本控制。
  • 我要补充一点,GIT 并不真正关心“时间”,因为它关心树结构。如果您必须这样做,我认为解决方案将是手动的。
  • 我正在将 git 添加到 Web 平台以获取对该平台中代码所做更改的历史记录(该平台没有任何历史记录或任何内容,并且是多个用户的一个实例,因此代码将始终反映最新的更改,即使这意味着重写)。我确实需要更改的历史记录,但是当存在合并冲突时,我需要一种自动解决它们的方法,这就是上面描述的标准,因为这将反映 Web 平台中代码的当前状态。所有这些都是使用 Web 扩展和运行 gitpython 的服务器来完成的。
  • 如果 git 只在服务器上,所以每个人都在使用同一个 repo,这正是你想要的不是吗?始终考虑两个用户同时编辑,并节省几分钟 - 可能你想停止第二个,让他在覆盖之前看到差异。
  • 实际上,由于某些公司凭据问题,服务器现在在每台开发人员机器上运行(类似于 Zotero Web 扩展的工作方式)。如果服务器是集中式的,也许这不会成为问题。

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


【解决方案1】:

首先,没有“在提交日期之前支持最新更改”这样的合并策略 盒子外面。 Here's the list of supported strategies

从这个列表看来,带有“ours/theirs”选项的“递归”策略可能会解决您的示例案例的某些部分:

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

然后有两种情况:要么您的更改发生在以后 - 在这种情况下,它将完全适用, 或者您的更改发生得更早-在这种情况下,您说您要应用他们的版本(即--strategy-option“我们的”或“他们的”,我认为它是“我们的”用于rebase,这令人困惑......) .

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

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

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

这种合并工具的简要逻辑

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

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

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

【讨论】:

  • 感谢您的回答。看起来您甚至不需要知道分支名称,因为您可以查找修改每个冲突文件的提交并从最近的 sha 中签出文件,对吗?
  • 您需要一个分支名称才能在其中搜索提交,但这不是问题,您可以将其作为参数传递给您的自定义合并脚本,或者默认您总是合并您的当前分支到它的跟踪分支,然后得到它。
  • git log origin/branch-name --date-order -1 --date=iso8601 --format='%h %cd' -- conflict_file.txt 提供实际遥控器中文件的最新提交的sha,还是只提供遥控器的本地副本?
  • 是的,只是本地副本。 Git 总是在本地副本上工作。您可以使用“git fetch”将远程副本的状态下载到本地副本中。
猜你喜欢
  • 2022-11-22
  • 2020-05-19
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多