Git 从主服务器恢复本地分支的提交

Git 从主服务器恢复本地分支的提交,git,commit,revert,Git,Commit,Revert,我有一个功能分支,其中有一些提交。然后我运行git rebase master并将该分支合并回master 所以就像 git checkout -b somebranch ......some work commits here ..... git checkout master git fetch git merge origin/master git checkout somebranch git rebase master git checkout master git merge s

我有一个功能分支,其中有一些提交。然后我运行git rebase master并将该分支合并回master

所以就像

git checkout -b somebranch
......some work commits here .....
git checkout master
git fetch
git merge origin/master
git checkout somebranch 
git rebase master
git checkout master
git merge  somebranch
现在,我需要将某个分支中的所有提交全部从主节点中取出,可能需要稍后将其合并回主节点


更新:更改在一段时间前被推送到master,合并后有许多提交,因此如果合并提交仍然是最新的,并且您尚未将该提交推回到上游,则重置到head将不起作用,git reset-hard HEAD^应该在合并之前让您重新提交-即,将主分支返回到git merge origin/master之后的位置。

如果合并提交仍然是最新的,并且您尚未将该提交推回上游,git reset-hard HEAD^应在合并之前将您重新提交-即,将您的主分支返回到git merge origin/master之后的位置。

在master的本地副本上,您可以尝试以下操作,该操作将创建一个新的提交,其中恢复的更改与您在master上已执行的操作相反

git还原旧的\u提交^..新的\u提交

其中,较旧的_提交是功能分支提交的第一次提交,较新的_提交是功能分支的最后一次提交

或者,你也可以试试

git revert-n较旧的\u提交..较新的\u提交

它将还原提交所做的更改,但不会使用还原的更改创建任何新的提交。还原仅修改工作树和索引

注意:在母版的本地副本上使用1.7.4+

时,您可以尝试以下操作,使用还原的更改创建新的提交,与您在母版上已执行的操作相反

git还原旧的\u提交^..新的\u提交

其中,较旧的_提交是功能分支提交的第一次提交,较新的_提交是功能分支的最后一次提交

或者,你也可以试试

git revert-n较旧的\u提交..较新的\u提交

它将还原提交所做的更改,但不会使用还原的更改创建任何新的提交。还原仅修改工作树和索引

注:使用1.7.4+

所以我们有类似于

A -> a1 -> a2 -> B <= master
 \
  x -> y -> z      <= somebranch
然后推

现在,在您可以再次合并某个分支之前,您必须像最初一样重新设置它的基础。这是可行的,但你最终会在大师的历史中留下一些噪音

如果有有限数量的人看到和/或承诺过孩子,你可以与他们协调,这是可以避免的,但这需要大量的工作。 如果可能的话,您必须确保他们正在处理的所有内容都已提交并推送,然后您可以重新设置此基础:

A -> ... -> B -------------> C -> c1 -> c2 -> D <= master
             \              /
              x' -> y' -> z' <= somebranch
其他所有人现在都必须更新到新的头部D',例如:

git fetch
git checkout master
git reset --hard origin/master
请注意,如果任何人的本地提交仍然依赖于C,并且在重新设置基址时在c1..D链中不可见,那么他们将需要重新设置基址或将其挑选到新的历史记录中。这可能是大量容易出错的工作,因此最好尽可能避免

所以我们有类似于

A -> a1 -> a2 -> B <= master
 \
  x -> y -> z      <= somebranch
然后推

现在,在您可以再次合并某个分支之前,您必须像最初一样重新设置它的基础。这是可行的,但你最终会在大师的历史中留下一些噪音

如果有有限数量的人看到和/或承诺过孩子,你可以与他们协调,这是可以避免的,但这需要大量的工作。 如果可能的话,您必须确保他们正在处理的所有内容都已提交并推送,然后您可以重新设置此基础:

A -> ... -> B -------------> C -> c1 -> c2 -> D <= master
             \              /
              x' -> y' -> z' <= somebranch
其他所有人现在都必须更新到新的头部D',例如:

git fetch
git checkout master
git reset --hard origin/master

请注意,如果任何人的本地提交仍然依赖于C,并且在重新设置基址时在c1..D链中不可见,那么他们将需要重新设置基址或将其挑选到新的历史记录中。这可能是大量容易出错的工作,因此最好尽可能避免。

我既不完全理解这个问题,也不了解它与恢复的关系。请将恢复视为删除,而不是git revert命令。我只需要删除在master的分支中所做的更改。但我很确定它与git revert有关,为什么不将master重置为功能分支的重基/合并之前的位置?因为其他人也会推动master,并且在将要移除的内容上有很多更改。顺便说一句,您在一段时间前推动的事实与解决方案有关-您可以将其有效地添加到问题。我既不完全理解这个问题,也不了解它与恢复的关系。请将恢复视为删除,而不是git revert命令。我只需要删除在master的分支中所做的更改。但我很确定它与git revert有关,为什么不将master重置到特性分支的重基/合并之前的位置呢?因为其他人也会推动master,而且在g
要被删除顺便说一句,你在一段时间前推动的事实与解决方案相关-你可以将它添加到问题中。我所说的更改是旧的,并且是在一段时间前推动的,在Master中,它上面有许多提交。在这种情况下,它可能会变得混乱。在我的脑海中,我建议1在有问题的合并之前在提交时创建一个新分支,2在合并到新分支上之后选择所有内容,3声明您的新主节点。当然,这会产生上游影响,因为它已经被推送了,但这可能是消除一个合并提交的最直接的方法…我所说的更改很旧,并且是在一段时间前推送的,在Master中,在它上面有许多提交。在这种情况下,它可能会变得混乱。在我的脑海中,我建议1在有问题的合并之前在提交时创建一个新分支,2在合并到新分支上之后选择所有内容,3声明您的新主节点。当然,这会产生上游影响,因为它已经被推送了,但这可能是消除一个合并提交的最直接的方法。。。
git rebase --onto B C c1
git push --force
git fetch
git checkout master
git reset --hard origin/master