Git:如何从错误的推送中恢复并保持相同的合并策略?

Git:如何从错误的推送中恢复并保持相同的合并策略?,git,merge,Git,Merge,我们正在合并功能分支->发布分支 我们意外地推送了提交到发布分支,而不是功能分支 我们如何将提交转移到特性分支和发布分支之外,同时允许我们不断地对特性分支进行更改,并最终将其正确地合并到发布分支 我们可以做到: git checkout feature-branch git merge release-branch git checkout release-branch git reset --hard HEAD~1 但是,您如何对功能分支进行更改,然后执行向下合并到发布分支,从而将原始提交

我们正在合并功能分支->发布分支

我们意外地推送了提交到发布分支,而不是功能分支

我们如何将提交转移到特性分支和发布分支之外,同时允许我们不断地对特性分支进行更改,并最终将其正确地合并到发布分支

我们可以做到:

git checkout feature-branch
git merge release-branch
git checkout release-branch
git reset --hard HEAD~1 
但是,您如何对功能分支进行更改,然后执行向下合并到发布分支,从而将原始提交和更改拉到发布分支

你能做到吗

git checkout feature-branch
//Make changes to feature-branch
git checkout release-branch
git merge feature-branch

当然可以这样做,但既然您说您“推送”了提交,那么似乎不仅仅是您的本地存储库受到了影响。因此,在
git reset--hard HEAD~1
之后,您必须执行
git push--force
将非正向更新推送到远程发布分支


类似地,所有将发布分支错误提交到本地存储库中的开发人员都必须执行git重置--merge origin/release branch以将其设置为新的远程状态(而
origin
必须替换为远程的名称)。

当然可以这样做,但既然你说了“推送”提交时,似乎不仅本地存储库受到影响。因此在
git reset--hard HEAD~1
之后,您必须执行
git push--force
将非正向更新推送到远程发布分支


类似地,所有已经将错误的发布分支提交到本地存储库中的开发人员都必须执行
git reset--merge origin/release branch
以将其设置为新的远程状态(而
origin
必须替换为远程的名称).

如果您想保持简单,只需将commit from release分支切换到feature分支,然后在release分支中恢复commit。您没有做任何与历史有关的事情,只需简单的git命令。

如果您想保持简单,只需将commit from release分支切换到feature分支即可。

如果您想保持简单,只需将commit from release分支切换到feature branch,然后只恢复发布分支中的提交。你没有做任何喜欢历史的事情——只是普通的git命令。

你应该保护你的发布分支不受直接推送的影响。我认识的每个git托管提供商都可以设置这些分支策略。注意:)下次……可能的重复应该保护你的发布分支不受目录的影响ect推送。我认识的每个git托管提供商都可以设置这些分支策略。注意:)下一次….可能会重复
-force
git pull
,但是那些确实收到OP想要放弃的提交的人,必须在结束时采取措施放弃它,通常是重置或重新设置基础。(他们应该查看git文档中的“从上游再基础恢复”部分。)@torek我不认为其他人已经接受了提交。但是如果他们有什么行动需要采取?他们的分支在
push--force
之后同步到remote后会是什么样子?@david如果在所有这些之后,我们最终将功能分支合并到发布分支中会发生什么?合并会起作用并包括我们所做的更改吗在发布分支中重新设置一次?@torek:如果我键入
git help pull
,则git pull的获取部分有一个文件化的
f,--force
选项。@DavidOngaro:啊,我的观点是正确的,pull确实会通过该选项进行获取。但是,通常只有在使用
语法时才需要force选项,例如
gi例如,t fetch master:master
git pull release:release
。通常,即使使用
git fetch
,也不会使用此选项,更不用说使用
git pull
;通常应该让
remote..fetch
行指定本地端更新转到
refs/remotes//code>(自动强制)。在git pull上没有强制执行,但是那些接收到OP想要放弃的提交的人,必须在结束时采取行动放弃它,通常是重置或重新基址(他们应该查看git文档中的“从上游重新基址恢复”部分)@torek我不认为其他人已经接受了提交。但是如果他们有什么行动需要采取?他们的分支在
push--force
之后同步到remote后会是什么样子?@david如果在所有这些之后,我们最终将功能分支合并到发布分支中会发生什么?合并会起作用并包括我们所做的更改吗在发布分支中重新设置一次?@torek:如果我键入
git help pull
,则git pull的获取部分有一个文件化的
f,--force
选项。@DavidOngaro:啊,我的观点是正确的,pull确实会通过该选项进行获取。但是,通常只有在使用
语法时才需要force选项,例如
gi例如,t fetch master:master
git pull release:release
。通常,即使使用
git fetch
,也不会使用此选项,更不用说使用
git pull
;通常应该让
remote..fetch
行指定本地端更新转到
refs/remotes//code>(自动强制)。在这种情况下,在将功能分支合并回发布分支时,您必须还原还原。如果可能的话,我发现重置是更简单、更干净的解决方案。@David Ongaro是的,您的答案更好。我会尝试的第一件事是硬重置到特定的提交。我快速回答。在这种情况下,您必须在合并t时还原还原还原他将功能分支返回到发布分支。如果可能的话,我发现重置是更简单、更干净的解决方案。@David Ongaro是的,你的答案更好。我会尝试的第一件事是对特定提交进行硬重置。我很快回答了。