如何重新合并 GitHub 中删除的文件夹?
How to re-merge deleted folder in GitHub?
假设我有 3 个分支:main、dev 和 release
dev 分支是使用主分支创建的,并且位于主分支之前。 dev 分支有一个新文件夹,里面有一些新文件。
在GitHub中,我错误地从dev分支直接合并到release分支,而dev必须先合并到main分支,只有main分支才能合并到release分支。此时,dev 分支中的新文件夹已在发布分支中创建。
我立即恢复了发布分支中的合并。由于还原,新文件夹在发布分支中被删除。
接下来我将 dev 分支与 main 分支合并(这是我首先应该做的),然后将 main 分支与 release 分支合并。
但是,dev 分支中的新文件夹现在仅存在于 main 分支中,并且该文件夹及其文件不会在 release 分支中重新创建,因为该文件夹由于还原而被删除第一次合并。
如果我尝试创建一个从主分支到发布分支的新合并请求,GitHub 显示发布分支是最新的,包含来自主分支的所有提交,并且发布在主分支之前。
将main合并到release中的解决方案是什么,以便从dev分支进入main的新文件夹在release分支中重新创建?
编辑 1:
无论我从 dev 合并到 release 什么都是正确的代码,但只是我不应该直接从 dev 合并到 release 作为实践。
git不太关心文件;它更不关心文件夹。这里实际发生的是您有一些 提交 git 认为不需要合并 。那是因为,就git而言,你已经合并了它们。
这里的关键点是恢复不记录他们正在恢复的提交;每次你 运行 git revert
,它只是创建一个新的提交,就像原始的镜像一样。假设您创建了提交 abc123,然后 运行 git revert abc123
:这将创建一个新的提交 def456,它 撤消 abc123 的更改;但它不会撤消该分支历史记录中提交 abc123 的存在。
假设您的原始更改是提交 b1b1b1,而 abc123 是您将其合并到发布;您的历史现在可能看起来像这样:
release
|
v
+---------<* abc123 <- def456
/ /
... <- 000aaa /
\ /
<- b1b1b1
^
|
my_branch
现在,每当您尝试将“my_branch”合并到“release”时,git 将查找 在该分支上尚不存在的提交.提交 abc123 仍然是分支的一部分,并且由于它将 b1b1b1 记录为其父级,因此 b1b1b1 也是分支的一部分。因此合并将简单地跳过该提交 - 它不知道您后来恢复了更改。
因此,您需要“还原还原”- 请参阅 How do I "un-revert" a reverted Git commit? and How can I fix a reverted git commit? 以及可能还有很多其他类似的问题。
在这种情况下,如果您 运行 git revert def456
,您创建了第三次提交,789aaa,它撤消了撤消 - 换句话说,它重新创建了提交 abc123 的原始更改。如果你认为还原是镜像,那么还原还原就是镜像的镜像——和原来的一样。
鉴于上图,我们可能首先将“release”合并到“my_branch”,这样abc213和def456就在那个分支上。这样,我们就可以在某个地方放置我们的“还原的还原”,而无需直接提交“发布”。然后当我们还原 def456 时,结果是这样的:
release
|
v
+---------<* abc123 <- def456
/ / \
... <- 000aaa / \
\ / \
<- b1b1b1 ---------------------<* c2c2c2 <- 789aaa
^
|
my_branch
现在,如果我们要求 git 将“my_branch”合并到“release”中,它会再次查找目标分支上尚不存在的提交。在这种情况下,它会找到提交 c2c2c2(没有更改的合并提交)和 789aaa(还原的还原)。
release
|
v
+---------<* abc123 <- def456 -------------------*> 999fff
/ / \ /
... <- 000aaa / \ /
\ / \ /
<- b1b1b1 ---------------------<* c2c2c2 <- 789aaa
^
|
my_branch
其中,git应用的是一个变更:创建文件是变更,其镜像是删除文件;在文件中添加一行也是一种更改,镜像将删除该行。没有办法简单地“提醒 git 一个文件存在”——如果你试图对“丢失”的文件进行更改并合并它,你会遇到冲突,因为没有地方可以进行更改制作。
底线是这样的:要在发布分支上重新创建文件,您需要创建一个新的提交来创建这些文件。
该提交需要在文件尚不存在的分支上,因此在您的情况下,我相信您需要:
- 将“release”合并到“main”中:由于意外提交,它目前领先于“main”,以及您还原它的提交。
- 完成后,文件将在“main”上删除。要取回它们,您需要 还原还原。
- 这实际上会创建原始更改的新副本,重新创建文件。
- 将“main”合并到“release”现在将根据需要创建文件。
假设我有 3 个分支:main、dev 和 release dev 分支是使用主分支创建的,并且位于主分支之前。 dev 分支有一个新文件夹,里面有一些新文件。
在GitHub中,我错误地从dev分支直接合并到release分支,而dev必须先合并到main分支,只有main分支才能合并到release分支。此时,dev 分支中的新文件夹已在发布分支中创建。
我立即恢复了发布分支中的合并。由于还原,新文件夹在发布分支中被删除。
接下来我将 dev 分支与 main 分支合并(这是我首先应该做的),然后将 main 分支与 release 分支合并。
但是,dev 分支中的新文件夹现在仅存在于 main 分支中,并且该文件夹及其文件不会在 release 分支中重新创建,因为该文件夹由于还原而被删除第一次合并。
如果我尝试创建一个从主分支到发布分支的新合并请求,GitHub 显示发布分支是最新的,包含来自主分支的所有提交,并且发布在主分支之前。
将main合并到release中的解决方案是什么,以便从dev分支进入main的新文件夹在release分支中重新创建?
编辑 1:
无论我从 dev 合并到 release 什么都是正确的代码,但只是我不应该直接从 dev 合并到 release 作为实践。
git不太关心文件;它更不关心文件夹。这里实际发生的是您有一些 提交 git 认为不需要合并 。那是因为,就git而言,你已经合并了它们。
这里的关键点是恢复不记录他们正在恢复的提交;每次你 运行 git revert
,它只是创建一个新的提交,就像原始的镜像一样。假设您创建了提交 abc123,然后 运行 git revert abc123
:这将创建一个新的提交 def456,它 撤消 abc123 的更改;但它不会撤消该分支历史记录中提交 abc123 的存在。
假设您的原始更改是提交 b1b1b1,而 abc123 是您将其合并到发布;您的历史现在可能看起来像这样:
release
|
v
+---------<* abc123 <- def456
/ /
... <- 000aaa /
\ /
<- b1b1b1
^
|
my_branch
现在,每当您尝试将“my_branch”合并到“release”时,git 将查找 在该分支上尚不存在的提交.提交 abc123 仍然是分支的一部分,并且由于它将 b1b1b1 记录为其父级,因此 b1b1b1 也是分支的一部分。因此合并将简单地跳过该提交 - 它不知道您后来恢复了更改。
因此,您需要“还原还原”- 请参阅 How do I "un-revert" a reverted Git commit? and How can I fix a reverted git commit? 以及可能还有很多其他类似的问题。
在这种情况下,如果您 运行 git revert def456
,您创建了第三次提交,789aaa,它撤消了撤消 - 换句话说,它重新创建了提交 abc123 的原始更改。如果你认为还原是镜像,那么还原还原就是镜像的镜像——和原来的一样。
鉴于上图,我们可能首先将“release”合并到“my_branch”,这样abc213和def456就在那个分支上。这样,我们就可以在某个地方放置我们的“还原的还原”,而无需直接提交“发布”。然后当我们还原 def456 时,结果是这样的:
release
|
v
+---------<* abc123 <- def456
/ / \
... <- 000aaa / \
\ / \
<- b1b1b1 ---------------------<* c2c2c2 <- 789aaa
^
|
my_branch
现在,如果我们要求 git 将“my_branch”合并到“release”中,它会再次查找目标分支上尚不存在的提交。在这种情况下,它会找到提交 c2c2c2(没有更改的合并提交)和 789aaa(还原的还原)。
release
|
v
+---------<* abc123 <- def456 -------------------*> 999fff
/ / \ /
... <- 000aaa / \ /
\ / \ /
<- b1b1b1 ---------------------<* c2c2c2 <- 789aaa
^
|
my_branch
其中,git应用的是一个变更:创建文件是变更,其镜像是删除文件;在文件中添加一行也是一种更改,镜像将删除该行。没有办法简单地“提醒 git 一个文件存在”——如果你试图对“丢失”的文件进行更改并合并它,你会遇到冲突,因为没有地方可以进行更改制作。
底线是这样的:要在发布分支上重新创建文件,您需要创建一个新的提交来创建这些文件。
该提交需要在文件尚不存在的分支上,因此在您的情况下,我相信您需要:
- 将“release”合并到“main”中:由于意外提交,它目前领先于“main”,以及您还原它的提交。
- 完成后,文件将在“main”上删除。要取回它们,您需要 还原还原。
- 这实际上会创建原始更改的新副本,重新创建文件。
- 将“main”合并到“release”现在将根据需要创建文件。