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

Git rebase/checkout保留最新修改的文件,git,git-rebase,gitpython,git-merge-conflict,Git,Git Rebase,Gitpython,Git Merge Conflict,我想知道如何从原点使用rebase进行拉取,如果文件有冲突,我想保留最新修改的文件 git中是否有方法获取提交中每个文件的修改日期,还是仅获取提交日期?或者,是否有一种方法可以列出与您的本地分支和原始分支不同的文件,并告诉您最新修改的文件位于哪一侧 示例场景: origin/mybranch: - File A (modified today) - File B (modified yesterday) local/mybranch: - File A (modifie

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

首先,没有“在提交日期前支持最新更改”这样的合并策略 开箱即用

从这个列表中可以看出,带有“我们的/他们的”选项的“递归”策略可能会解决示例案例的某些部分:

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

然后有两种情况:要么是您的更改发生在稍后,在这种情况下,它将干净地应用, 或者您的更改发生在更早的时候-在本例中,您说您希望应用他们的版本(即
--策略选项
“我们的”或“他们的”,我认为对于rebase来说是“我们的”,这令人困惑…)

问题是,如果您的更改发生在今天,而他们的更改发生在昨天,但您忘记在早上同步,那么即使您的更改发生在稍后(在提交日期之前),它仍然会产生冲突,并且会对他们的版本而不是您的版本进行不适当的解决

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

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

这种合并工具的简要逻辑
  • 给定一个冲突的文件名,并且知道远程和本地分支名称,您可以找到每个分支上次修改此文件的提交-请参阅

  • 然后获取这两次提交的日期并进行比较

  • 并做出适当的合并决策:通过本地或远程复制


  • 这与git的观点相矛盾。如果有人在昨天添加了“Hello”,而另一个人在今天添加了“World”,为什么您不希望这两个更改?dropbox之类的东西更适合这种情况,因为最后的更改总是应用于这种情况。GIT专门用于合并来自不同团队成员的更改,而不仅仅是版本控制。我要补充的是,GIT并不像关心树结构那样关心“时间”。如果必须这样做,我认为解决方案将是手动的。我将git添加到web平台,以记录对该平台中代码所做更改的历史记录(该平台没有任何历史记录或任何内容,并且是多个用户的一个实例,因此代码将始终反映最新的更改,即使这意味着重写内容)。我确实需要更改的历史记录,但是当存在合并冲突时,我需要一种自动解决它们的方法,这就是上面描述的标准,因为这将反映web平台中代码的当前状态。所有这些都是通过一个web扩展和一个运行gitpython的服务器来完成的。如果git只在服务器上,那么每个人都在使用相同的repo,这正是你想要的吗?总是考虑两个用户同时编辑,并节省分钟。可能你想停止第二个,并让他在重写之前看到差异。实际上,服务器在每个开发机器上运行(类似于ZoTeO Web扩展的工作方式),这是由于一些公司凭证问题。如果服务器是集中式的,这可能不会成为问题。谢谢你的回答。看起来您甚至不需要知道分支名称,因为您可以查找修改每个冲突文件的提交,并从最新的sha签出文件,对吗?您需要一个分支名称才能在其中搜索提交,但这不是问题,您可以将其作为参数传递给自定义合并脚本,或者,默认情况下,您总是将当前分支合并到其跟踪分支,并按此方式获取。git log origin/branch name--date order-1--date=iso8601--format='%h%cd'--conflict_file.txt
    给出实际远程设备中文件的最新提交的sha,或者仅给出远程设备的本地副本?是,只是本地拷贝。Git总是在本地副本上工作。您可以使用“git fetch”将远程副本的状态下载到本地副本中。