方案如下:
123abc
;我们在这里尝试了一些事情
feature/something
的新分支,以便恢复提交并对主分支执行pull request
。然而,VSTS抱怨我们没有新的变化。git reset --hard 123abc
放入master
分支时,我的本地空间将恢复为给定的提交,到目前为止还可以。但是,我没有权限强制推送到主分支。所以,我的问题是:
谢谢你们!
没有办法通过pull请求对旧提交进行分支。
如果您还没有强制推送权限,则应还原新分支上的更改并创建PR以将新分支合并到master
,或者您可以要求团队项目管理员将主分支重置为旧提交。
master
branch假设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
分支有分支策略,你可以从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
。除非你以相反的方式恢复/合并,否则它不应该抱怨没有新的变化。master
branch如果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
(将A
和J
替换为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
分支的历史中删除原始提交。你的第二次尝试是一种方法。正如您所注意到的,并非每个遥控器都允许您进行强制推动 - 并且有充分的理由(有副作用)。每种重写历史记录的方法最终都需要强制推送,所以如果你没有权限,那么这根本就不是一种选择。