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

时间:2010-12-05 16:04:46

标签: git

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

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

我该怎么做?

8 个答案:

答案 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