如何在git中更改哪些提交主指向?

Rud*_*ski 69 git

在git中,我一直在提交到master分支,我真的应该在一个功能分支上工作.我想改变它,以便master回到它开始的地方,而master上的内容现在在一个新的分支上.基本上,我的提交历史记录如下:

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master
Run Code Online (Sandbox Code Playgroud)

如何更改主要点?

kni*_*ttl 70

  • 藏匿你未提交的: git stash
  • 创建一个新分支: git branch new_branch
  • 将master重置为origin/master: git reset --hard origin/master
  • 再次检查新分支: git checkout new_branch
  • 取消您的更改: git stash pop

如果您的工作树是干净的,则不需要使用stash/unstash.只需确保工作树中没有任何更改,因为重置时会删除这些更改--hard


另一种可能性(更快,无需存储和重置):

  • 结帐新分行: git checkout -b new_branch master
  • 创建一个"新的"主分支并将其指向origin/master的提交: git branch -f master origin/master

  • 真棒!`git reset --hard <commit>`正是我想要的. (10认同)
  • `git branch -f master <commit>`为我做了诀窍,谢谢! (4认同)
  • 你真的不应该手工修改`.git/refs /`中的文件(例如,任何给定的ref实际上可能被打包(放入`.git/packed-ref`文件中)而不是"松散").通常,您应该用来修改ref的最低级别命令是*git update-ref*或*git symbolic-ref*.在这个特定的例子中,不需要使用Git内部,甚至使用前面提到的Git"plumbing"命令; 你可以用*git branch*:`git branch -f master origin/master`来做. (3认同)
  • 请注意,只有在您有任何未提交的更改时才需要存储。 (2认同)

J-D*_*zle 22

$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>
Run Code Online (Sandbox Code Playgroud)

例如试试这个

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

此示例显示将主服务器移动到其他提交.请注意,标签允许我们保存旧主人,以防:)