我在Git中有一个存储库.我做了一个分支,然后对主人和分支做了一些改变.
然后,几十次提交之后,我意识到分支处于比主设备好得多的状态,所以我希望分支"成为"主设备并忽略主设备上的更改.
我无法合并它,因为我不想在master上保留更改.我该怎么办?
额外:在这种情况下,'old'主服务器已经被push转到另一个存储库,例如GitHub.这怎么改变了?
当使用主题分支"B"合并到"A"时git merge,我会遇到一些冲突.我知道使用"B"中的版本可以解决所有冲突.
我知道git merge -s ours.但我想要的是类似的东西git merge -s theirs.
它为什么不存在?在与现有git命令冲突合并后,如何获得相同的结果?(git checkout来自B的每个未合并文件)
更新:从分支A(合并提交点到树的B版本)丢弃任何东西的"解决方案"不是我想要的.
我遇到了硬盘故障导致Git存储库的某些文件损坏.运行时,git fsck --full我得到以下输出:
error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted
Run Code Online (Sandbox Code Playgroud)
我有存储库的备份,但包含包文件的唯一备份已经损坏了.所以我认为我必须找到一种方法从不同的备份中检索单个对象,并以某种方式指示Git生成一个只有正确对象的新包.
你能否告诉我如何修复我的存储库?
我有一个分支demo,我需要与master分支合并.我可以使用以下命令获得所需的结果:
git pull origin demo
git checkout master
git pull origin master
git merge demo
git push origin master
Run Code Online (Sandbox Code Playgroud)
我唯一关心的是,如果有任何合并问题,我想告诉git覆盖master分支中的更改而不给我合并提示.因此,demo分支中的更改基本上应该自动覆盖master分支中的更改.
我环顾四周有多种选择,但我不想冒险合并.
当我在Git中合并一个分支来掌握时,我经常会遇到合并冲突.有没有办法合并一个分支,只是覆盖当前分支中的东西?
我使用Git和Github(私人账户).
在这个线程上显示类似的东西,但这里是一个旧文件,添加到一个功能分支,该分支合并到一个开发分支,最后合并到master,因为这样做了很多更改.所以它不一样,所需要的是更改历史记录,并隐藏该文件以保护隐私.
让我们假设foo/bar.txt在运行时遇到合并冲突:
$ git checkout A
$ git merge B
Run Code Online (Sandbox Code Playgroud)
我想foo/bar.txt从分支A中自动解决冲突.(我知道我在做什么,我确实需要这个.分支B中的版本是错误的,我不关心失去工作中的变化在这种情况下树.)似乎我可以通过运行这些命令来做到这一点:
$ git reset foo/bar.txt
$ git checkout foo/bar.txt
Run Code Online (Sandbox Code Playgroud)
是否有更简单的单命令解决方案?
不幸的是,foo/bar.txt即使没有冲突,这些命令也会改变,我不希望这样.如果没有冲突,我希望保持foo/bar.txt在任何状态下git merge B都离开它.
所以我需要一个Unix shell命令,它会检测是否存在冲突foo/bar.txt,如果有,它将通过foo/bar.txt从当前分支获取版本来解决冲突.它不会做任何其他事情,即它不会修改其他文件,它不会提交更改,并且foo/bar.txt如果该文件中没有冲突则不会更改.
我有 3 个分支:development、qa和staging。development我在和中都有几乎相同的代码,因此从到qa进行公关不会产生太多更改(和/或冲突)。developmentqa
但现在我把所有的东西都从 搬到qa了staging。而且qa代码实际上与 完全不同并且是新的staging,那么最好的选择是什么?我搜索并找到了另一个答案:
git checkout qa
git merge -s ours staging
git checkout staging
git merge qa
Run Code Online (Sandbox Code Playgroud)
这对我的情况来说是个好主意吗?提前致谢!
编辑:我不想丢失暂存分支的所有提交。
有没有办法在git合并两个分支而不合并文件?换句话说就是绘制合并箭头.
假设我有分支A和B.我需要将分支B合并到A,但不需要B中的所有更改,而只需要链接到分支.
git checkout A
git merge B --no need changes
Run Code Online (Sandbox Code Playgroud)
通常有一种方法可以合并两个没有子模块的分支.我想保留分支A中的子模块,仍然需要合并分支B.
更新
git merge -s我们的BRANCH_NAME为我工作.
从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)覆盖开发分支中的所有内容,但我不想错过开发分支上较旧的提交。
这就是我要的:
我尝试与我们的策略合并并进行硬重置,但开发分支不断丢失旧的提交。
我想要获得的是蓝色和红色之间差异为零的提交,以及在蓝色与第一个黑色差异时删除的代码。
只是分享迄今为止尝试过的解决方案的概述。通过做这个:
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)
我得到了这个(几乎完美,但我很难回忆起我完成这个技巧的确切时刻):