想要将我的主人更改为较旧的提交,我该怎么做?


91

我想回滚到先前的提交,然后发布该代码,然后回到最新的提交。

即,所以我的主人指向的是较早的提交版本,以便我可以修改该版本,然后我想回到最初是我提交的最新提交。

我怎样才能做到这一点?

Answers:


99

如果要执行此操作,然后将主服务器还原到上一个提交:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

或者:

git reset --hard master~1        # Reset current branch to one commit ago on master

1
因此,一年后,我正在研究这个问题,并认为这是一种糟糕的方法。哦,至少它有点容易理解。
泰勒·布洛克

1
是的,这就是为什么我投票赞成,易于理解,也许您应该提供了指向更好方法的链接?
Andrew Atkinson

1
我必须使用SourceTree做同样的事情。这个过程是相似的。1)为当前主状态创建新分支,因此您不会丢失任何内容。2)删除母版3)创建新的母版分支,选择所需的提交
Danilo Gomes,2016年

在此之后,我们从主服务器“删除”的提交会怎样?
亚瑟·科隆比尼·古斯芒

1
如果您有远程仓库,则应避免这种情况。如果这样做,则会导致一些错误,因为第一个主机的地址与您最近创建的新主机的地址不同。
MAChitgarha

59

您的问题不清楚。我认为您要的是:

git push -f origin $old_commit_id:master

这会做什么?它将推动$old_commit_id承诺origin作为新掌门originmaster分支。

如果这是您想要的,则完全不需要触摸本地master分支。


master (non-fast-forward)给我带来了失败。@jtdubs解决方案有效。
鲍比·诺顿

3
只需通过-f强制即可—尽管远程回购可能已配置为禁止这样做。我已经更新了答案。
亚里斯多德·帕加尔兹

不适用于我,但可以接受的答案
有用

您没有确切地说出您想要什么,或者为什么它不起作用,所以我无法告诉您为什么它没有以及如何制造(如果可以)。
亚里斯多德·帕加尔兹

您似乎确实失去了使用此方法的远程历史记录,对我来说很好。只是喊出来。
肖恩

43

使用 git reset --hard <old commit number>

它将HEAD重置为此旧的提交。

另外,您还需要使用git push -f origin来更改远程仓库。


34

如果您想避免强行推送,请按照以下方法将您的存储库恢复为较早的提交并保留所有介入的工作:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

做完了!将307a5cd替换为您在存储库中想要的任何提交。

(我知道前两行可以合并,但是我认为这不太清楚发生了什么事情)

这是图形化的:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

您可以有效地删除c3和c4,然后将项目设置回c2。但是,如果您想再次查看c3和c4,则它们在项目的历史记录中仍然可用。


1
这工作顺利!如果您走得这么远并且正在阅读本文-这似乎是将master还原为更深层提交的最干净的方法。
ddisqq

我找不到能说明我对此有多爱的词,除了能够修复导致我6个小时烦扰并令我头疼的东西之外,我无可厚非。谢谢你,先生!!!!!!!
Kostas Tsakalidis

这才救了我的命!谢谢
布莱德

9

假设这样的提交图:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

您要先结帐master并创建一个指向master当前位置的分支:

git checkout master
git branch pointer master

现在应该看起来像这样:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

既然您已经进入master,我们将告诉master分支向后移动一次提交:

git reset master~1

现在,master应该将其移回一个空格,但是pointer分支仍在最近的提交中:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

此时,您可以将其推master送到远程站点或任何地方,然后快速将其合并回pointer分支。您可以pointer在此时杀死分支:

git push origin master
git merge --ff-only pointer
git branch -D pointer

最后 :

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

1
如果origin / master位于C,git push origin master则将失败,因为当前分支的尖端在其远程对等后面。您还应该传递-f标志。
sassospicco

8

您可以只做git checkout <commit-id>任何您需要做的事,然后git checkout master返回到新代码。

如果您实际上需要修改旧代码以将其释放,则可能应该:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

另外,我不能推荐足够的git flow。这使所有这些变得非常容易。


1

移至先前版本:

git checkout <version hash>

在这里做您的工作并与

git commit --amend

回到大师

git checkout master


1
那行不通。 git reset --hard指出他的主分支回到旧提交,所以git checkout master什么也不会做。
jtdubs 2010年

是的,谢谢你的纠正。+1给您,也将删除我的答案,但我认为该commit --amend步骤足够有用
Pablo Fernandez 2010年

什么--amend
Shafizadeh,2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.