【问题标题】:Git conflict when pulling from repo forked from me, even though last thing I did was pull from it从我分叉的回购中提取时发生 Git 冲突,即使我做的最后一件事是从中拉出
【发布时间】:2014-05-23 13:55:50
【问题描述】:

上下文

很久以前我创建了https://github.com/nicolas-raoul/Anki-Android ("repo1")。

有人将它分叉到https://github.com/ankidroid/Anki-Android ("repo2"),现在我们大家都在这里进行协作。

我想做什么

我想更新 repo1 以获得来自 repo2 的最新源代码(以便我可以创建功能分支并发送拉取请求)。

我尝试了什么

repo1 的本地克隆中,我运行了 git pull <repo2> master,但我遇到了巨大的冲突。

我觉得这很令人惊讶,因为 last thing I did 是完全相同的命令。自从我上次从 repo2 拉出后,即使我没有修改 repo1,怎么会发生冲突? (我刚刚删除了我的本地 repo 并从 repo1 重新克隆,因此您可以确定我的本地 repo 没有问题)

我认为我不能使用 rebase,因为 repo2 最初是从我的 repo repo1 分叉出来的。

【问题讨论】:

  • 我还没有仔细查看你的提交日志,但听起来有人可能已经重写了分叉仓库中的现有提交,比如通过 rebase、cherry-pick、修改等。这是我要检查的第一件事。事实上,我现在就去挖掘......
  • 第二个 repo 实际上并不是直接从你的 repo 派生出来的,它是从 this one 派生的,它是从你的 repo 派生出来的。所以涉及到 3 个 repos。
  • 另一种可能性是行尾差异(Windows vs OS X)。我还在检查...
  • 您使用的是什么操作系统?视窗?操作系统?你的合作者呢?是否有人将 core.autocrlf 设置为 true 用于他们的 git 配置?
  • 您真的需要/关心 repo1 上的内容吗?如果没有,只需将 repo2 的 HEAD 强制推送给它,不要介意。

标签: git git-rebase git-pull git-fork


【解决方案1】:

最简单的解决方案是将当前的repo1 master 分支替换为来自repo2 的分支。

 cd repo1
 git add remote repo2 /url/repo2
 git fetch repo2
 git checkout master
 git reset --hard repo2/master
 git push -f

如果您是唯一一个在 repo1 上工作的人,那么在其上强制设置新历史不会影响其他任何人。
即使有人克隆 repo1,现在在 repo2 的协作,所以再次无关紧要。

但如果你想格外小心,你可以:

  • 基于repo2/master创建一个新分支
  • 将新分支推送到repo1
  • repo1 上的新分支完成的分支发出您的拉取请求(到repo2

在最后一种情况下,没有强制推动,没有伤害。

【讨论】:

    【解决方案2】:

    @VonC's answer 非常好,我什至没有考虑过基于 Repo2 的 master 添加和推送另一个分支的选项。我想补充一些关于为什么会发生这种情况的额外信息。

    所以经过大量的挖掘,我找到了 Repo1 和 Repo2 之间的分歧点。两个 repos 的 master 分支之间当前最古老的共同祖先正好位于标签 v2.0

    git log -1 4e4bafe
    commit 4e4bafed59520908e4f1e7f0b3cb71f96f59a236
    Author: nobnago <ksdfhskdjfwdewf@gmail.com>
    Date:   Thu Jan 3 11:36:00 2013 +0100
    
        bump version 2.0
    

    在那之后,这两个分支似乎不再有任何共同的历史。我在我的 cmets 中提到我怀疑有人在之后重写了公开推送的提交,因为 Repo2 包含标签 v2.0.1,但是标签引用的提交不包含在 Repo2 的任何分支中,也不包含在任何其他标签(包括最新的)。

    但是,在查看主分支的日志时,我没有看到任何重写提交的明确证据(创作日期与提交日期大不相同,并且作者和提交者是不同的人):

    # Repo2. "datelog" is an alias that displays author/author-date
    # on the left, and committer/commit-date on the right.
    git datelog -3 9f38b64
    *   9f38b64 Flavio Lerda Flavio Lerda Thu Jan 3 15:11:35 2013 -0800 Thu Jan 3 23:14:33 2013 +0000 Merge pull request #1 from agrueneberg/searchbox
    |\
    | * b397e36 Alexander Grüneberg Alexander Grüneberg Sat Nov 17 21:16:03 2012 -0600 Thu Jan 3 16:27:47 2013 -0600 Search on Enter key.
    * | 4e4bafe nobnago nobnago Thu Jan 3 11:36:00 2013 +0100 Thu Jan 3 11:36:00 2013 +0100 bump version 2.0
    
    # Repo1
    git datelog -2 badbf87
    * badbf87 nobnago nobnago Thu Jan 3 12:55:42 2013 +0100 Thu Jan 3 12:55:42 2013 +0100 uncomment logs
    * 4e4bafe nobnago nobnago Thu Jan 3 11:36:00 2013 +0100 Thu Jan 3 11:36:00 2013 +0100 bump version 2.0
    

    然而,我在 Repo1 的日志中看到的是,您直到大约 4.5 个月后才将您的 fork 与 Repo2 同步!:

    git datelog -1 nicolas/master
    *   5d4ad0f Nicolas Raoul Nicolas Raoul Wed Apr 17 14:40:24 2013 +0900 Wed Apr 17 14:40:24 2013 +0900 Merge branch 'master' of github.com:ankidroid/Anki-Android
    

    我看到你在这期间收到了来自其他分叉的拉取请求。如果 Repo2 旨在成为您项目的规范 repo,那么您应该考虑更频繁地与它同步,以避免您自己的分叉中的历史记录出现太多分歧。 “更频繁”不一定意味着“每周 X 次”,它可能意味着在您接受每个拉取请求之后,而不是稍后执行 X 次拉取请求。

    【讨论】:

    • 实际上,我们有大约一年(或两年?)的 master,当时 master 只包含一个 README,所有源代码都在分支中。这就是为什么让 master 保持最新不是我的首要任务。你的意思是如果我更频繁地更新 master 就不会发生问题了吗?
    • @NicolasRaoul 有一个非常规的设置,我不太确定。通常,最好让所有分支尽可能保持最新状态,以减少冲突。
    • 对分支历史的良好分析。比我的回答更详细。 +1
    猜你喜欢
    • 2017-07-03
    • 2021-10-03
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2012-05-27
    • 2010-12-28
    相关资源
    最近更新 更多