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