繁体   English   中英

Git:由于看似随机的合并,更改不断丢失

[英]Git: Changes keep getting lost due to seemingly random merges

我觉得这将是一个显而易见的答案,但我似乎无法解决。

似乎发生的事情是我向服务器提交/推送了一些更改,并且我的副本上的一切看起来都很好。

然后,另一个开发人员从同一分支从服务器中提取(据我所知,据称看到了我的更改),进行了一些修改,将它们提交到他们自己的本地副本,然后最终将其推送回服务器。

在执行此操作的过程中,我的更改会丢失,因为它们的推送 (326c8fd0...) 会导致与大量删除/添加行合并,将存储库重置为更旧的版本。 即使使用存储库的新副本,这种情况现在也发生了几次。

下面突出显示的行 (8def6e9..) 是我所做的提交,假设其他开发人员拉动了更改,则以下提交应该在同一个分支上。 合并发生在 326c8fd0 最终导致错误地重置存储库,丢失以前的更改。

TortoiseGit 日志

关于为什么会发生这种情况,我是否遗漏了一些非常明显的东西? 我们都在使用 TortoiseGit。

对不起,可能是含糊的解释。

在您的示例中,有人正在合并 f36908d(第一个父项;合并时的 HEAD)和 8def6e9(第二个父项;可能是合并时源分支的尖端)以生成 326c8fd0。

如果合并提交 (326c8fd0) 缺少与其父项中的任何一个相关的重要内容(f36908d 和 8def6e9;您说它缺少后者的部分),那么创建合并提交的人可能正在以不适当的方式执行合并时尚。

此人可能正在使用ours合并策略(使用-s ours / --strategy=ours合并或拉取),默认递归合并策略的ours选项(使用-X ours / --strategy-option=ours合并或拉取),或者他们可能只是在手动解决合并冲突时做出了错误的决定。

ours的策略完全忽略了除第一个之外的所有父母在历史上所做的任何内容更改。 您通常可以识别这种类型的合并,因为合并提交及其第一个父级(即它们的更改)将具有相同的树(即git diff f36908d 326c8fd0不会显示任何差异)。

ours合并策略选项也将忽略来自第二个父级历史的更改(即您的更改),但只会忽略那些与第一个父级历史中所做的更改(即他们的更改)相冲突的更改。 在这种情况下,来自第二个父项的某些更改可能会进入结果,但其他更改可能会完全删除。

另一种可能的选择是,他们只是在解决默认合并期间产生的冲突时做出了错误的决定。

无论哪种方式,有人可能必须与进行合并的用户交谈,以了解他们究竟做了什么,以及他们为什么这样做,以便制定政策来防止将来出现问题。


要恢复,您可以自己重做合并,然后他们将结果合并到历史的当前提示中:

git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git checkout develop
git merge remerge
# maybe resolve more conflicts

# eventually: git branch -d remerge

或者,如果您可以重写历史记录:

git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git rebase --onto remerge 326c8fd0 develop
# maybe more conflicts to resolve at each rebased commit

如果您正在丢失提交,请确保你们都没有在您的 gui 上使用 --force 或强制标志来摆脱被拒绝的情况。 看看 DAG 的解释。

http://progit.org/book

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM