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

Bla*_*man 81 git

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

即所以我的主人指向一个较旧的提交版本只是因为我可以推动该版本,然后我想回到我最初的最新提交.

我怎样才能做到这一点?

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:master
Run Code Online (Sandbox Code Playgroud)

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

如果这是您想要的,您根本不需要触摸本地master分支.

  • 只需传递`-f`来强制它 - 虽然远程仓库可能配置为禁止它.我已经更新了答案. (3认同)
  • 通过这种方法,您似乎确实会丢失远程过去的历史记录,这对我来说很好。只是喊出来而已。 (2认同)

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,则它们在项目的历史记录中仍然可用。

  • @Blankman我建议你将其作为公认的答案,它涵盖了人们需要的一切,并且与当前的最佳答案不同,它是安全的。 (4认同)
  • 这需要更多的支持 (3认同)
  • 这工作顺利!如果你已经读到这里并且正在阅读这篇文章——这似乎是将 master 恢复到更深层次提交的最干净的方法。 (3认同)
  • 对于那些对上面提到的“我们的”感到困惑的人。它是一个内置的 git 命令.. https://howchoo.com/git/git-merge-conflicts-rebase-ours-theirs (3认同)
  • 我找不到言语来解释我有多爱你,我非常感激能够修复一些让我被窃听了 6 个小时并让我非常头疼的东西。谢谢你,先生!!!!!!! (2认同)
  • 这就是我一直在寻找的答案!亲爱的读者,这是您应该尝试的答案。 (2认同)

C0M*_*M37 9

假设提交图如下:

| (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)


jtd*_*ubs 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
Run Code Online (Sandbox Code Playgroud)

另外,我不能推荐足够的git flow.它使所有这一切变得非常容易.


Pab*_*dez 1

要移至以前的版本:

git checkout <version hash>

在这里做你的工作并提交给

git commit --amend

回到master

git checkout master