我想回滚到先前的提交,然后发布该代码,然后返回到最新的提交。
即。所以我的主人指的是一个较旧的提交版本,所以我可以推动该版本,然后我想回到我最初提交的最新提交。
我该怎么做?
答案 0 :(得分:88)
如果要执行此操作并将主服务器还原为先前的提交:
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 :(得分:47)
你的问题不清楚。我认为你要求的是:
git push -f origin $old_commit_id:master
这会怎么做?它会将$old_commit_id
提交推送到origin
作为origin
的{{1}}分支的新主管。
如果这是您想要的,您根本不需要触摸本地master
分支。
答案 2 :(得分:25)
使用git reset --hard <old commit number>
它会将HEAD重置为此旧提交。
此外,您还需要使用git push -f origin
来更改远程仓库。
答案 3 :(得分: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。它使所有这一切变得非常容易。
答案 4 :(得分:8)
假设提交图如此:
| (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)
答案 5 :(得分:2)
要转到以前的版本:
git checkout <version hash>
在这里做你的工作并用
提交 git commit --amend
返回主:
git checkout master
答案 6 :(得分:0)
如果要避免强制执行,请按照以下方法将存储库恢复为较早的提交并保留所有介入的工作:
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在项目的历史记录中仍然可用。
答案 7 :(得分:0)
结帐到您的旧提交:
git reset --hard <your old commit>
创建一个新分支:
git checkout -b BugfixingV1
现在将它与 master 分支合并并通过冲突保留您的更改:
git merge -s ours master
现在我们的新分支已经准备好成为我们新的主分支,所以让我们再次切换到主分支:
git checkout master
现在我们需要将新分支合并到 master 中!
git merge BugfixingV1
最后,我们会将更改推送到存储库:
git push