[英]How to "force" a pull request from a specific commit?
场景如下:
123abc
;我们在这里尝试了一些事情:
我们创建了一个名为feature/something
的新分支,以便恢复提交并向主分支发出pull request
。 但是,VSTS 抱怨我们没有新的更改。
当我们执行git reset --hard 123abc
到master
分支时,我的本地空间恢复到给定的提交,到目前为止还可以。 但是,我无权强制推送到主分支。
所以,我的问题是:
关于第一次尝试,如何让 git 明白我想将这些更改拉到 master 分支并且不要抱怨?
关于第二次尝试,如何从给定的提交强制从主分支拉取请求?
谢谢你们!
无法通过拉取请求对旧提交进行分支。
如果你没有强制推送权限,你应该恢复对新分支的更改并创建 PR 将新分支合并到master
,或者你可以要求团队项目管理员将 master 分支重置为旧提交。
master
分支上的更改假设 master 分支上的提交历史如下,并且提交C1
到C10
是您要还原的提交:
…---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
分支有分支策略,您可以从master
分支创建一个新分支(例如feature/something
分支),然后在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
。 它不应该抱怨没有新的变化,除非你以相反的方式恢复/合并。
master
分支如果master
分支上没有分支策略,您可以要求团队项目管理员重置master
分支,然后强制推送(作为您尝试的第二次尝试)。 或者您可以要求管理员允许您强制推送。
选项 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
(用 ID 或其他解析为相应提交的表达式替换A
和J
;在本例中,一种拼写方法是
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
分支的历史记录中删除原始提交。 您的第二次尝试是一种方法。 正如您所注意到的,并非每个遥控器都允许您进行强制推送 - 并且有充分的理由(有副作用)。 重写历史的每种方法最终都需要强制推送,因此如果您没有权限,那么这根本不是一种选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.