如何"强迫"来自特定提交的拉取请求?

时间:2017-12-26 18:34:21

标签: git version-control git-push pull-request git-reset

方案如下:

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

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

  • 我们创建了一个名为feature/something的新分支,以便恢复提交并对主分支执行pull request。然而,VSTS抱怨我们没有新的变化。

  • 当我们git reset --hard 123abc进入master分支时,我的本地空间将恢复为给定的提交,到目前为止还可以。但是,我没有权限 强制 推送到主分支。

所以,我的问题是:

  • 关于第一次尝试,如何让git明白我想将这些更改提取到主分支并且不要抱怨?

  • 关于第二次尝试,如何 强制 来自该分支的主分支的拉取请求?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

无法通过拉取请求对旧提交进行分支。

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

选项1:还原master分支

上的更改

假设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/something合并到master。除非你以相反的方式恢复/合并,否则它不应该抱怨没有新的变化。

选项2:要求团队项目管理员重置并强制推送到master分支

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

答案 1 :(得分:0)

选项1:revert

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

当然,如果这样做了你当前想要的,那么这意味着正常的合并会不断地从合并的一方或其他方面撤消更改 - 这正是合并应该做。

在git中,您尝试做的是revert。如果你有

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

并且您要撤消AJ,您可以说

git revert -n A^..J

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

git revert -n master~11..master^

记住第一个表达式会指向A&#39; s 而不是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的角度来看,即使你以后碰巧撤消了这些更改,这些更改也已合并) 。您可以稍后恢复恢复&#34;,或者您可以使用新提交重新创建分支并从中重新合并。

选项2:重写历史记录

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