Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 - Fatal编程技术网

Git 从主服务器回滚旧的分支,而不考虑随后推送的其他分支

Git 从主服务器回滚旧的分支,而不考虑随后推送的其他分支,git,gitlab,Git,Gitlab,第一个场景: 我有三个分支,我工作。分行A、分行B、分行C 我开发、测试并合并/推动分支A成为master。我删除了分支A,因为它已合并到主分支 一周后,分支B和C被测试并推送到master。我删除了B和C,因为它们被合并为master 又过了一个星期,老板来到办公室说:“A是个坏主意,我想把它去掉。”。 显然,他想删除A,但想在生产中保留B和C 我该怎么做?在这个场景中,A完全独立于B和C 第二种情况: 此场景与第一个场景相同,只是当A合并到主场景时,B和C重设为主场景。 因此,多亏了A,他们

第一个场景:

我有三个分支,我工作。分行A、分行B、分行C

我开发、测试并合并/推动分支A成为master。我删除了分支A,因为它已合并到主分支

一周后,分支B和C被测试并推送到master。我删除了B和C,因为它们被合并为master

又过了一个星期,老板来到办公室说:“A是个坏主意,我想把它去掉。”。 显然,他想删除A,但想在生产中保留B和C

我该怎么做?在这个场景中,A完全独立于B和C

第二种情况:

此场景与第一个场景相同,只是当A合并到主场景时,B和C重设为主场景。 因此,多亏了A,他们得到了可用的新方法,并使用了它们

现在我想知道,我们如何“移除”A而不破坏B和C

对我来说,答案是“测试会告诉你出了什么问题”,但我们没有测试


谢谢。

对于第一个场景:找到分支A的合并提交哈希并执行

git revert <hash>
git还原
如果将A合并到主程序中,第二种方案的效果应该相同,因为恢复合并提交将撤消更改,而将B和C合并到主程序中不会再次带来更改


但是,您也可以通过对每个哈希执行
git revert
来撤消分支A中的每个提交。编辑:记住以相反的顺序执行单个提交的还原,即从最新的开始。

对于第一个场景:找到分支A的合并提交哈希并执行

git revert <hash>
git还原
如果将A合并到主程序中,第二种方案的效果应该相同,因为恢复合并提交将撤消更改,而将B和C合并到主程序中不会再次带来更改


但是,您也可以通过对每个哈希执行
git revert
来撤消分支A中的每个提交。编辑:请记住,要以相反的顺序还原单个提交,即从最新的提交开始。

因为您的上司希望从
A
分支中完全删除引入
master
的更改,所以您应该能够在
master
中简单地还原
A
合并提交。使用
git revert
将引入一个新的提交,它将有效地撤消原始提交引入的所有内容

git checkout master
git log
# find the SHA-1 hash of merge commit A (e.g. d82n93kd...)
git revert d82n93kd -m 1

由于您的上司希望从
A
分支中完全删除引入
master
的更改,因此您只需在
master
中还原
A
合并提交即可。使用
git revert
将引入一个新的提交,它将有效地撤消原始提交引入的所有内容

git checkout master
git log
# find the SHA-1 hash of merge commit A (e.g. d82n93kd...)
git revert d82n93kd -m 1

正如其他答案已经说过的那样,第一个场景可以用
git revert-m1
解决。“-m1”告诉git合并提交的哪个父级是主线,不应还原。您可以使用git show查看父级,它将提供类似“Merge:”的输出。如果要保留对其及其所有父项的更改,请使用“-m 1”

这将导致一个新的提交,它只会撤消分支a所做的所有更改

另一种方法是将
git-rebase
--preserve merges
选项一起使用,该选项允许您重写历史记录并删除该合并。然而,这将改变你的历史,这不是一个好主意,如果该分支已经被其他人使用(这是很可能的,如果它是你的主人)


关于你的第二个场景,我确信如果没有一些手工工作,这是不可能的。删除A在任何情况下都会删除该分支引入的函数,如果B和C依赖于这些函数,则会中断对它们的更改。因此,您可以手动删除功能,保留所有仍然需要的功能。或者,您按照上述方式还原,然后再次手动添加这些函数。哪个选项更好取决于分支A的实际删除量和保留量。

正如其他答案所述,第一个场景可以用
git revert-m 1
解决。“-m1”告诉git合并提交的哪个父级是主线,不应还原。您可以使用git show查看父级,它将提供类似“Merge:”的输出。如果要保留对其及其所有父项的更改,请使用“-m 1”

这将导致一个新的提交,它只会撤消分支a所做的所有更改

另一种方法是将
git-rebase
--preserve merges
选项一起使用,该选项允许您重写历史记录并删除该合并。然而,这将改变你的历史,这不是一个好主意,如果该分支已经被其他人使用(这是很可能的,如果它是你的主人)


关于你的第二个场景,我确信如果没有一些手工工作,这是不可能的。删除A在任何情况下都会删除该分支引入的函数,如果B和C依赖于这些函数,则会中断对它们的更改。因此,您可以手动删除功能,保留所有仍然需要的功能。或者,您按照上述方式还原,然后再次手动添加这些函数。哪个选项更好取决于应该删除多少分支A以及应该保留多少分支。

所以您是说git revert将“删除”合并,但每次提交(不是来自A)之后还会有吗?@SteveChamaillard
git revert
实际上添加了一个新的提交,该提交会镜像合并的内容