如何更改git中的提交主控点?


75

在git中,我一直在提交提交到master分支上,而实际上我本应该在feature分支上工作。我想更改它,以便master可以回到它的开始位置,而master上的内容现在位于新分支上。基本上,我的提交历史如下:

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master

我希望它看起来像这样:

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master

如何更改主控点?

Answers:


76
  • 隐瞒您的承诺: git stash
  • 创建一个新分支: git branch new_branch
  • 将主机重置为原始主机: git reset --hard origin/master
  • 再次签出新分支: git checkout new_branch
  • 取消您的更改: git stash pop

如果您的工作树是干净的,则不需要存储/取消存储。只需确保您的工作树中没有任何更改,因为在重置--hard时这些更改将被删除


另一种可能性(更快,并且不需要隐藏和重置):

  • 结帐新分支: git checkout -b new_branch master
  • 创建一个“新” master分支,并将其指向原始/ master的提交: git branch -f master origin/master

2
请注意,只有在您进行任何未提交的更改时才需要隐藏。
Josh Lee 2010年

1
如果您的工作目录是干净的,则不需要stashunstash部分。否则完美:+1
Cameron Skinner's

10
太棒了!git reset --hard <commit>正是我想要的。
路德·兹沃林斯基

3
您实际上不应该.git/refs/手动修改文件(例如,任何给定的引用实际上都可以打包(放入.git/packed-ref文件中)而不是“松散”)。通常,用于修改ref的最低级别命令是git update-refgit symbolic-ref。在这种特定情况下,无需使用Git内部进行垃圾处理,甚至无需使用前面提到的Git“管道”命令;你可以做到这一点的Git分支git branch -f master origin/master
克里斯·约翰森

4
git branch -f master <commit>为我做了把戏,谢谢!
danr 2012年

27
$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>

例如试试这个

$ mkdir example; cd example
$ git init
$ vi testFile.txt
(now add "test commit 1" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 1st commit" to git commit)
$ vi testFile.txt
(now add "test commit 2" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 2nd commit" to git commit)
$ vi testFile.txt
(now add "test commit 3" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 3rd commit" to git commit)
$ git tag final_head
$ git reset --hard HEAD~1

此示例显示了将主服务器移至其他提交。注意这里的标记允许我们保存旧的母版,以防万一:)


4

就像这里概述的那样,但是更简单,不涉及任何重置,只需在master所在的位置创建一个新分支,然后不费力地删除master,然后再次签出要将master移至的位置并在其中创建新的master分支:

git stash
git checkout -b old_master_was_here
git branch -d master
git checkout origin/master
git checkout -b master

3

转到具有master哈希值的.git / refs / heads / master,然后将其更改为所需的值。我使用gitg快速查找master的哈希,然后使用该方法验证移动是否成功。


0

new_branch在当前HEAD上创建一个新分支(假设HEAD = master),将master重置为C并new_branch再次切换到(使用SmartGit来讲)。


0

请注意,在任何给定时间,您都可以使用来更改分支指向的位置git update-ref refs/heads/branch id,但是在执行此操作之前,必须在树的顶端指定一个名称,否则您的工作将无法访问。所以这两个命令可以完成任务

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

但是请确保您没有任何未提交的更改,否则所有地狱都会崩溃

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.