我正在开发一个项目,我有一个提交,它引入了一个主要问题但未立即发现的功能.现在我想完全删除该修订版,同时保持其后的工作,但我很难绕过这种3路合并.这是我的项目的简化图.
o changeset: 134:7f81764aa03a | tag: tip | parent: 128:451d8a19edea | summary: Backed out changeset 451d8a19edea | | @ changeset: 133:5eefa40e2a29 | | summary: (Change I need to keep keep) | | *snip 3 commits* | o changeset: 129:5f6182a97d40 |/ summary: (Change I need to keep keep) | o changeset: 128:451d8a19edea | summary: (Change that introduced a major problem) | o changeset: 127:4f26dc55455d | summary: (summary doesn't matter for this question)
如果我理解正确,r127和r134完全相同.当我hg up -C -r 133然后运行时hg merge …
假设我在我的文档中处于A状态.然后我按顺序进行B,C和D的更改.
有没有办法可以保持B和D的变化,但跳过C?
或者,假设我在我的文档中处于A状态.我做出更改B,撤消它,然后进行更改C和D(因此Vim有一个带有两个分支的撤消树).然后我改变了主意,决定要使用B和D而不是C.
我怎么能在Vim中这样做?我已gundo.vim安装插件,但我没有那么多使用它.
我的老板设置了我们新的Git存储库,一个在我们的Windows服务器上,一个在我们的Linux服务器上.
我被要求解决冲突,所以我选择使用Meld.
当我运行第一个文件时,它会打开3个窗口;
我已阅读文档和帮助,但我无法理解.从我所看到的,shipping.remote对我想要保留的Linux机器上的文件进行了更改.shipping.local是来自Windows服务器的文件,shipping.php是合并产生的文件.
因此,如果我只是从shipping.remote获取代码,将其移动到中间文件(shipping.php)并保存,我将在Linux机器上的Git存储库中获得我想要的更新文件?
我希望我正确解释,我只是不想弄乱一些东西.
我在一个由3名开发人员组成的团队中工作,最近我们从CVS切换到了Mercurial.我们正在使用水银具有对我们每个工作站的本地存储库和拉/推到开发服务器.我不确定这是最好的工作流程,因为在提交后很容易忘记推送,而且3路合并冲突可能会引起真正的麻烦.我们可以使用更好的工作流程,因为我认为分布式VC的复杂性超过了目前的好处.
谢谢
为什么'git mergetool'(meld)向我显示带有conclict标记的祖先视图?这是完全错误的,我永远不明白为什么会这样做.我该如何解决?
应该显示3路合并
[ Your Changes ] [ Common Base ] [ Upstream Changes ]
Run Code Online (Sandbox Code Playgroud)
我得到的是:
[ My Changes ] [ File with Conflict markers ] [ Upstream changes ]
Run Code Online (Sandbox Code Playgroud)
看到: 
git合并冲突解决方案本身是否比其他SCM(CVS,Subversion等)以及独立的合并工具更有效率?如果是这样,为什么?
澄清:这里我对算法本身更感兴趣 - 它与普通的diff3方法有什么不同?
一些工具声称更聪明(例如Guiffy),是否值得插入作为git合并工具?git是否更聪明地找出在文件内或跨文件移动的文本?(而不是报告嘈杂的冲突..我对Linus的谈话有一种模糊的印象).
背景:刚刚做了一个巨大的合并使用git-svn,导致了一半的冲突比我得到的普通svn merge(第一次合并没有跟踪)..所以我想了解原因.
类似的Qs/As周围,但它们更多的是关于过程的大局,以及合并如何更自然地适应.为此,git"优化合并"(而不仅仅是分支),它实际上意味着:
?现在,我最感兴趣的是1和2.
有些人喜欢git merge --squash的原因如下:
压缩到单个提交让您有机会清理杂乱的 WIP 提交,并为您正在合并的更改提供一个很好的理由。
https://coderwall.com/p/qkrmjq/git-merge-squash
但是,我认为有一些缺点超出了制作干净历史的优点。
git merge --squash产生一个非合并提交。因此,Git 不会将您正在合并的提交识别为合并基础。当 1) 在分支 X 上将 A 更改为 B,2)git merge --squash从分支 X 到分支 Y,以及 3) 在分支 X 上将 B 更改为 A(还原),以及 4) 将 X 合并到 Y
时,这会导致不需要的合并结果。
在第 4 步之后,在分支 Y 上,从 A 到 B 的更改不会恢复。这里,这是 3 路合并,因此比较从分支 X 到合并基的差异和从分支 Y 到合并基的另一个差异。前者包括没有变化,后者包括从A到B的变化,所以合并结果包括从A到B的变化。
提交作者被覆盖,这会丢弃贡献。git merge --squash产生一个名为 who did 的新提交git merge --squash。当然,提交内容来自原始提交。这听起来像是在窃取贡献。这成为https://github.com/Microsoft/winfile/pull/42#issuecomment-380681627 中的一个问题
什么是正确的用例git merge --squash?
我开始使用TortoiseGit for Windows但我发现有些烦人的事情.例如,当我在合并期间发生冲突时,我需要执行以下操作:
如果合并成功结束,是否有自动标记文件的方法?
谢谢你的任何指示,
尤利安
当我运行时git revert,可能会发生冲突。git 是否依赖于 3 路合并,如问题合并内部(参见下表)中所述,也适用于revert?
恢复的合并基础是什么?在使用 git 和 meld 进行交互式变基的 3 向合并中的三个文件是什么?这很清楚,但很难想象这是一个还原。
A - B - C - D - C^-1
Run Code Online (Sandbox Code Playgroud)
(如果我想C在最后恢复。)
3-way-merge ×9
git ×6
merge ×6
meld ×2
mercurial ×2
conflict ×1
dvcs ×1
git-revert ×1
merge-base ×1
repository ×1
revert ×1
squash ×1
tortoisegit ×1
tree ×1
undo ×1
vim ×1
windows-7 ×1
workflow ×1