在我解决了我关心的所有合并冲突之后,我想合并而不管所有剩余的冲突.我想让git保留我要合并到的分支中的文件(--ours
策略).
我怎样才能做到这一点?
所以我只是想将我的代码上传到 git,我不知道我做了什么,但不知何故我有点困惑。
因为我的几乎所有文件中都存在很多冲突。
我不想通过检查每个文件来手动解决每个冲突,因为有数百个文件,并且每个文件中都有多个冲突。
那么我如何告诉 git 接受所有当前更改,但不接受传入更改,反之亦然?谢谢
我有许多远程存储库,我想合并在一起.这些存储库中的一些子树对于远程控制器是唯一的(它们包含特定于主机的数据),其他子树包含在所有远程控制器中通用的数据(应该是).
基本上,我想做的是为每个遥控器运行"git pull".这将使远程主服务器的跟踪分支上的本地主分支快速转发到远程主服务器上已更改的特定于主机的文件,并且对公共文件不执行任何操作,因为它们不会更改.
公共文件中的更改(称为F,更改为F')应该不是问题,即使它最初只发生在一个远程上.git-merge将做正确的事情并在我的复合工作区中给我一个F'的副本,这就是我想要的.如果同一个公共文件在另一个遥控器上以不同的方式改变(称之为F"),问题就出现了.git-merge将给我一个F'和F"的组合,这不是我想要的.我想要的只是F".
当我使用ClearCase时,我们将其称为复制合并.合并的结果始终是贡献者的精确副本.这听起来很像"git merge -s theirs",但它不存在.
我想知道我是否可以通过"git-read-tree -m -trivial"来做一些事情来快速合并,然后用git-merge和一个自定义合并工具来简单地复制$ REMOTE文件到$ MERGED.但即便如此,我也看不出如何从合成F'和F中停止git-merge,如果合并是微不足道的话.
我已阅读链接是否有"他们的"版本的"git merge -s ours"?在这个网站上,Junio Hamano的帖子引用了解释为什么"git merge -s theirs"是一个坏主意,但对我来说情况并非如此.我确实重视旧的历史,但我需要跳出船并在发生事件时跟踪远程站点上的更改.本地站点上没有新工作.它只需要形成所有远程站点的组合,在更改时从最后一个轮询的远程站点获取最新的"公共"文件.
在此先感谢您提供给我的任何帮助.
我们有一个叫做分支upgrade
这是分出master
5个月前.在upgrade
分支中,我们将所有项目重组为maven(master
是蚂蚁项目),因此两个分支中项目x的结构完全不同.
为了将项目重组为我们使用的专家git mv
,我们保留了历史.接下来,我们对文件进行了一些代码更改,upgrade
因为升级过程需要这些更改.
现在我想合并master
到upgrade
同时保留所有结构upgrade
.我该怎么做呢?
我git merge master
在upgrade
分支上尝试使用.
但这并没有让我对我们所做的代码更改产生任何冲突upgrade
; 相反,它给了我属性文件中的冲突.(我肯定肯定代码更改与upgrade
此冲突master
) - 可能是什么错误?
从git merge文档中提取的递归合并策略的定义。
这只能使用3向合并算法解析两个磁头。当有一个以上的公共祖先可用于三路合并时,它将创建一个公共祖先的合并树,并将其用作三路合并的参考树。据报道,这样做可以减少合并冲突,而不会因对Linux 2.6内核开发历史记录中的实际合并提交进行测试而导致合并错误。此外,这可以检测和处理涉及重命名的合并。当拉或合并一个分支时,这是默认的合并策略。
递归策略可以采用以下选项:
如前所述,递归策略是默认策略,它使用3向递归合并算法(在此处和Wikipedia上进行了说明)。
我的理解是冲突的大块必须手动解决,并且通常以这种方式表示
<<<<<<<<<<<
developer 1's code here
============
developer 2's code here
>>>>>>>>>>>
Run Code Online (Sandbox Code Playgroud)
在我们的递归合并策略的选择进行了说明如下:
通过支持我们的版本,此选项可以强制自动解决冲突的大块。与另一棵树不冲突的更改会反映到合并结果中。对于二进制文件,全部内容都是从我们这边获取的。
这不应与我们的合并策略混淆,该策略甚至根本不看另一棵树包含的内容。它丢弃另一棵树所做的所有操作,声明我们的历史包含其中发生的所有事件。
现在假设我有两个分支Y和M的头,并且具有一个共同的基本祖先B,如下所示
当使用默认递归策略合并Y和M时,第30行将变为Print("hello");
行,因为在第30行,Y表示从基本祖先开始的更改,而M则不是。但是如果我在M分支上并运行
git merge -s recursive -X ours Y
第30行会成为Print("bye");
合并后的输出吗?
对于那些说这很明显的人,请注意我们的选项指出
通过支持我们的版本,此选项可以强制自动解决冲突的大块。
但是(据我了解)在第30行没有冲突的块。
为了完整起见,我还将提供他们的选项的文档:
这与我们的相反。
我们的策略文档如下:
这样可以解析任意数量的head,但是合并的结果树始终是当前分支head的树,有效地忽略了所有其他分支的所有更改。它旨在取代侧支的旧开发历史。请注意,这与递归合并策略的-Xours选项不同。
所以回到上面的例子,如果我跑了
git merge -s ours Y
在分支M上,很明显第30行将Print("bye");
在合并的输出中。在这种情况下,为什么也没有 …
我有两个分支,"私人"和"公共".我在私人和定期工作,我想替换"公共"分支中的所有内容,以在"私人"中拥有一个干净的文件副本.
由于我不希望"私有"的历史转到"公共",我使用git merge --squash
,但我仍然手动逐个解决合并文件.有一个更好的方法吗?
我正在拉一个分支master
以合并它.
我正在运行的命令是(在master
检出时):git pull origin feature/some_branch
不幸的是,似乎我的同事已经在那里执行了一些(我认为是良性的)文件删除,现在git喷出了一个error: unable to unlink old 'somefile': No such file or directory
.
我试图在线查看,但此错误的大多数参考都涉及权限,这不是这里的情况.
在合并之前,主文件中不存在有问题的文件,而它在新分支中.
问题是master
在很长一段时间内没有更新,所以有太多的变化和文件影响我开始计算代码.
我只需要master
包含来自新分支的所有更改.我们从不master
通过合并直接提交任何内容.
到目前为止我尝试过的:
--force
参数,同样的问题git reset origin/master --hard
pull
再次运行同样的问题如何在master
不关心此类问题的情况下更新另一个更新的分支机构,同时保留其历史记录?
我遇到了一个经典的情况 - master 和多个分支。我需要将更改(通过多次提交进行的许多更改)合并到master中,但我想忽略master本身所做的任何更改。我希望master成为我分支的克隆。
我知道我可以将每个文件从分支签入主文件并提交更改,但这不会使图形变得漂亮:)
我怎样才能做到这一点?解决合并冲突还不够,因为仍然有一些更改被自动合并。我是否必须手动删除它们,或者是否有一些git merge --magic
选项可以帮助我?
添加:我希望文件在分支和主控 之间精确复制(而不是提交历史记录),但我希望将所有内容压缩为单个提交。
如何在保留历史记录的同时将目录从一个分支移动到另一个分支?
我想移动到同一个 repo 中。
我想用另一个开发分支(即 master)覆盖开发分支中的所有内容,但我不想错过开发分支上较旧的提交。
这就是我要的:
我尝试与我们的策略合并并进行硬重置,但开发分支不断丢失旧的提交。
我想要获得的是蓝色和红色之间差异为零的提交,以及在蓝色与第一个黑色差异时删除的代码。
只是分享迄今为止尝试过的解决方案的概述。通过做这个:
git checkout master
git merge -s ours dev
git checkout dev
git merge master
Run Code Online (Sandbox Code Playgroud)
我得到了这个(开发人员从主人那里获取了所有历史记录)
通过做这个
git checkout dev
git reset --hard master
Run Code Online (Sandbox Code Playgroud)
我得到了这个(如果我推动开发,我将丢失所有黑色提交):
如果我这样做:
git checkout dev
git merge $(git commit-tree -p dev -m "Align master > dev" master^{tree})
Run Code Online (Sandbox Code Playgroud)
我得到了这个(几乎完美,但我很难回忆起我完成这个技巧的确切时刻):
所以我遇到了与我的repo的合并冲突,旧版本都是〜1个月大,是否有任何简单的命令将所有较新的版本标记为正确而不是必须为每个单独的文件执行(我是使用~1000个文件)
谢谢
我的目标很容易解释,但是我找不到任何方法可以做到这一点。假设我有3个分支。A,B和C
A -------.
\--------.----------- B
\
.-------------- C
Run Code Online (Sandbox Code Playgroud)
我只是想将整个分支“ C”推送到分支“ B”。让我解释一下:我不想保留从B创建C之后在B中所做的任何事情。我只是希望B具有与分支C完全相同的代码。
我如何安全地做到这一点?
两者之间的差异超过10000个文件,因此手动选择不是一种选择。
我尝试了几种方法,包括将git与“他们的”策略合并,但是我仍然存在很多冲突。