如何“强制”来自特定提交的拉取请求?

问题描述 投票:1回答:2

方案如下:

  • 我们有大约10个提交,我们希望从我们的主分支恢复。他们造成某种问题,我需要恢复到特定的提交123abc;

我们在这里尝试了一些事情

  • 我们创建了一个名为feature/something的新分支,以便恢复提交并对主分支执行pull request。然而,VSTS抱怨我们没有新的变化。
  • 当我们将git reset --hard 123abc放入master分支时,我的本地空间将恢复为给定的提交,到目前为止还可以。但是,我没有权限强制推送到主分支。

所以,我的问题是:

  • 关于第一次尝试,如何让git明白我想将这些更改拉到master分支并且不抱怨?
  • 关于第二次尝试,如何从给定的提交强制来自master分支的pull请求?

谢谢你们!

git version-control git-push pull-request git-reset
2个回答
1
投票

没有办法通过pull请求对旧提交进行分支。

如果您还没有强制推送权限,则应还原新分支上的更改并创建PR以将新分支合并到master,或者您可以要求团队项目管理员将主分支重置为旧提交。

Option 1: revert the changes on master branch

假设master分支上的提交历史如下,并且提交C1C10是你想要恢复的提交:

…---A---C1---C2---…---C10   master
  • 如果master分支没有分支策略,您可以直接恢复master分支并推送到远程。 # On local master branch git revert C1^.. git push origin master 还原更改后,master分支上的提交历史记录应为: …---A---C1---C2---…---C10---C10'---C9'---…---C1' master
  • 如果master分支有分支策略,你可以从feature/something分支创建一个新分支(例如master分支),然后在feature/something分支上恢复提交并创建PR以将feature/something分支合并到master# On local master branch git checkout -b feature/something git revert C1^.. git push -u origin feature/something 然后提交历史将是: …---A---C1---C2---…---C10 master \ C10'---C9'---…---C1' fearure/something 你可以创建一个PR来合并feature/somethingmaster。除非你以相反的方式恢复/合并,否则它不应该抱怨没有新的变化。

Option 2: ask team project administrator to reset and force push to master branch

如果master分支上没有分支策略,您可以要求团队项目管理员重置master分支,然后强制推送(作为您尝试的第二次尝试)。或者您可以要求管理员允许您强制推送。


0
投票

选项1:revert

在第一次尝试中,您似乎想要向master添加提交以撤消10次提交的更改。您将此设想为master的当前ip与您要撤消的10次提交之前的提交之间的合并。

当然,如果这确实是您当前想要的,那么这意味着正常的合并将不断地从合并的一侧或其他方面撤消更改 - 这正是合并应该不做的事情。

在git中,你想要做的是revert。如果你有

x -- x -- x -- A -- B -- ... -- I -- J -- o <--(master)

你想通过A撤消J,你可以说类似的东西

git revert -n A^..J

(将AJ替换为ID或其他解析为相应提交的表达式;在此示例中,拼写出来的一种方法是

git revert -n master~11..master^

记住第一个表达式将指向A的父级而不是A本身)。

这将更新索引和工作树,以撤消指定提交范围内的更改。那么

git commit -m "Revert commits A through J"

如果您不想显式提交,可以不使用-n选项,但是您将获得10个新提交(一个用于撤消每个原始提交)。

提交不一定必须是顺序的;您可以单独命名每个提交,而不是指定范围。无论分支拓扑如何,这都应该有效。请注意,还原操作可能会发生冲突,并且在您提交之后发生的更改发生了更多更改,冲突变得更可能发生。

作为一种特殊情况,如果10个提交组成了所有的功能分支,就像在

x -- x -- x -- x -- x -- x -- y --- M -- o <--(master)
           \                       /
            A -- B -- ... -- I -- J <--(feature_branch)

你可以说

git revert -m1 M

(其中M再次表达如M的提交ID,或者本例中的master^等)

这意味着您要应用M对其第一个父级(y)所做的更改的反转。但请注意,一旦你恢复合并,你不能只是稍后重做合并(因为从git的角度来看,即使你碰巧后来撤消了这些更改,这些更改也已合并)。您可以稍后“恢复还原”,或者您可以使用新提交重新创建分支并从中重新合并。

选项2:重写历史记录

另一方面,您可以从master分支的历史中删除原始提交。你的第二次尝试是一种方法。正如您所注意到的,并非每个遥控器都允许您进行强制推动 - 并且有充分的理由(有副作用)。每种重写历史记录的方法最终都需要强制推送,所以如果你没有权限,那么这根本就不是一种选择。

© www.soinside.com 2019 - 2024. All rights reserved.