Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 将主机合并到分支,然后提交并将更改推送到分支。如果不用力推,这怎么能解开呢?_Git_Gitlab_Git Merge_Git Revert - Fatal编程技术网

Git 将主机合并到分支,然后提交并将更改推送到分支。如果不用力推,这怎么能解开呢?

Git 将主机合并到分支,然后提交并将更改推送到分支。如果不用力推,这怎么能解开呢?,git,gitlab,git-merge,git-revert,Git,Gitlab,Git Merge,Git Revert,我犯了一个错误 我有一个分支(a),它是从Master分支出来的Master比A领先了相当一点。几天前,我意外地将Master合并到A中并按下了。那天晚些时候我注意到了我的错误,但不确定如何修复它,所以我尝试添加一些功能标志来关闭不应该在A中启用的功能,并按下它们。后来,我决定尝试还原A分支,以摆脱所有Master提交。我经历了所有的更改(大约100个文件),现在A看起来像以前的Master。但是,我现在的问题是,如果没有合并尝试删除主控中存在的所有更改,我就无法将A合并到主控。(也就是说,在M

我犯了一个错误

我有一个分支(
a
),它是从
Master
分支出来的
Master
A
领先了相当一点。几天前,我意外地将
Master
合并到
A
中并按下了。那天晚些时候我注意到了我的错误,但不确定如何修复它,所以我尝试添加一些功能标志来关闭不应该在
A
中启用的功能,并按下它们。后来,我决定尝试还原
A
分支,以摆脱所有
Master
提交。我经历了所有的更改(大约100个文件),现在
A
看起来像以前的
Master
。但是,我现在的问题是,如果没有合并尝试删除
主控
中存在的所有更改,我就无法将
A
合并到
主控
。(也就是说,在
Master
中创建的新文件在
A
的还原中被删除,所以现在git想要从
Master
中删除文件,如果我尝试将
A
合并到
Master


我怎样才能修复我的巨大错误,然后回到我可以在
A
上做维护补丁的地方,并相应地与
Master
合并,这样将来的版本就不会丢失补丁了?

ic。你真是大功告成。最好的方法是删除主控的合并到。。。。但它有一个巨大的价格标签。不那么优雅的方法是取消从相关主服务器恢复的更改,以便它们不再消失。那么当你把一个母版合并成一个母版时,你就不会看到那个大逆转了。我不喜欢,但是……

我喜欢。你玩得很开心。最好的方法是删除主控的合并到。。。。但它有一个巨大的价格标签。不那么优雅的方法是取消从相关主服务器恢复的更改,以便它们不再消失。那么当你把一个母版合并成一个母版时,你就不会看到那个大逆转了。我不喜欢它,但是……

如何在没有强制推送的情况下撤消合并的简短回答?是:你不能

较长的答案是你不能,但你也不需要,只要你知道你在做什么以及合并是如何工作的;如果您能够说服所有其他用户相信您以这种方式强制使用的存储库,那么强制推送有时会更方便

TL;DR:如果你真的需要恢复一个合并,就这样做;您可以稍后还原还原 另请参阅,它几乎是Linus Torvald关于恢复合并的描述的复制粘贴

了解所有这些(长) 理解为什么会出现这种情况以及如何处理的关键是认识到任何提交集的“合并性”都是提交本身固有的。分支名称仅用作查找提交的方法。强制推送是一种方法,通过这种方法,您可以更改名称指向的位置,这样人们(和Git)就无法再找到一些提交

一旦你明白了,这很容易看出来,但我仍然不知道如何正确地解释它,除了说服人们画图表。Linus Torvalds对其进行了准确但棘手的总结:

[正在]还原合并提交。。。撤消提交更改的数据。。。这对合并对历史的影响毫无影响。因此,合并仍然存在,它仍然被视为将两个分支连接在一起,未来的合并将把合并视为最后一个共享状态,而还原引入的合并的还原将根本不会影响这一点。因此,“还原”会撤消数据更改,但从不会撤消提交对存储库历史记录的影响的意义上讲,它不是“撤消”。因此,如果您将“恢复”视为“撤消”,那么您将始终错过恢复的这一部分。是的,它会撤消数据,但不会撤消历史记录

“历史”是提交图。图由提交决定,但我们通过分支名称找到提交。因此,我们可以通过更改存储在名称中的哈希ID来改变所看到的内容。但直到你知道,并在你自己的头脑中看到,这是如何工作的,这并没有真正的帮助

你可能会花一些时间浏览教程,但是为了快速复习,请考虑这些事实:

  • Git提交由两部分组成:它的主数据,它是所有文件的快照,我们将在这里不再多说,它的元数据包含提交本身的信息。大多数元数据都是供您以后使用的信息:提交人、提交时间以及他们的日志消息,这些消息告诉您他们为什么提交。但是元数据中有一项是针对Git本身的,那就是父提交哈希ID的列表

  • 任何Git提交中存储的所有内容实际上,在任何Git对象中,但大多数情况下,直接处理提交对象都是完全只读的。原因是Git通过散列ID查找对象。Git有一个存储这些对象的大键值数据库;键是散列ID,值是对象的内容。每个键唯一标识一个对象,每个提交都是不同的,因此每个提交都有一个唯一的哈希ID。2

  • 因此,提交的哈希ID实际上是该提交的“真实名称”。每当我们将该散列ID存储在某个地方,例如,文件中,或电子表格中的某一行,或其他任何地方,我们都会说该条目指向提交

  • 因此,存储在每个提交中的父哈希ID指向以前的提交。大多数提交只有一个父哈希ID;使提交成为合并提交的原因是它有两个或多个父哈希ID。Git确保每当有人进行新的提交时,该提交中列出的父哈希ID都是现有提交的哈希ID。3

所有这一切的结果是,大多数普通的提交点bac
... <-F <-G <-H
...--F--G--H   <-- master
...--G--H   <-- dev, master
          I   <-- master (HEAD)
         /
...--G--H   <-- dev
          I--J   <-- master
         /
...--G--H   <-- dev (HEAD)