我想回滚到先前的提交,然后发布该代码,然后返回到最新的提交.
即所以我的主人指向一个较旧的提交版本只是因为我可以推动该版本,然后我想回到我最初的最新提交.
我怎样才能做到这一点?
Tyl*_*ock 91
如果要执行此操作并将主服务器还原为先前的提交:
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
Run Code Online (Sandbox Code Playgroud)
或者:
git reset --hard master~1 # Reset current branch to one commit ago on master
Run Code Online (Sandbox Code Playgroud)
Ari*_*zis 52
你的问题不清楚.我想你要求的是:
git push -f origin $old_commit_id:masterRun Code Online (Sandbox Code Playgroud)
这会怎么做?这将推动$old_commit_id承诺origin作为新掌门origin的master分支.
如果这是您想要的,您根本不需要触摸本地master分支.
Kaw*_*iKx 31
使用 git reset --hard <old commit number>
它会将HEAD重置为此旧提交.
另外,您还需要使用git push -f origin来改变远程仓库.
bro*_*son 10
如果您想避免强行推送,请按照以下方法将您的存储库恢复为较早的提交并保留所有介入的工作:
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!
Run Code Online (Sandbox Code Playgroud)
做完了!将307a5cd替换为您在存储库中想要的任何提交。
(我知道前两行可以合并,但是我认为这不太清楚发生了什么)
这是图形化的:
c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
\ /
'------------'
Run Code Online (Sandbox Code Playgroud)
您可以有效地删除c3和c4,然后将项目设置回c2。但是,如果您想再次查看c3和c4,则它们在项目的历史记录中仍然可用。
假设提交图如下:
| (A) ---------> (B) ----------> (C)
| ^
| (master)
Run Code Online (Sandbox Code Playgroud)
您想首先签出master并创建一个指向master当前位置的分支:
git checkout master
git branch pointer master
Run Code Online (Sandbox Code Playgroud)
现在看起来应该是这样的:
| (A) ---------> (B) ----------> (C)
| ^
| (HEAD, master, pointer)
Run Code Online (Sandbox Code Playgroud)
既然你已经在master,我们将告诉master分支向后移动一个提交:
git reset master~1
Run Code Online (Sandbox Code Playgroud)
现在,master应该移回一个空间,但pointer分支仍在最近的提交中:
| (A) ---------> (B) ----------> (C)
| ^ ^
| (HEAD, master) (pointer)
Run Code Online (Sandbox Code Playgroud)
此时,您可以推master送到远程或任何地方,然后快速将其合并回到pointer分支.你可以pointer在那一点杀死分支:
git push origin master
git merge --ff-only pointer
git branch -D pointer
Run Code Online (Sandbox Code Playgroud)
最后 :
| (A) ---------> (B) ----------> (C)
| ^ ^
| [ origin/master ] (HEAD, master)
Run Code Online (Sandbox Code Playgroud)
您可以随心所欲地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
Run Code Online (Sandbox Code Playgroud)
另外,我不能推荐足够的git flow.它使所有这一切变得非常容易.
要移至以前的版本:
git checkout <version hash>
在这里做你的工作并提交给
git commit --amend
回到master:
git checkout master