如何在特定提交中创建分支点?

Ram*_*hum 174 git git-branch

在Git中,我理解分支是指向提交的指针.

如何为特定提交创建特定分支?说我想master指出1258f0d0aae...,我该怎么做?

Mar*_*air 227

您可以master在点1258f0d0aae是这样的:

git checkout master
git reset --hard 1258f0d0aae
Run Code Online (Sandbox Code Playgroud)

但你必须小心这样做.它可能会重写该分支的历史.如果您已经发布它并且其他人正在分支机构工作,那将会产生问题.

此外,该git reset --hard命令将丢弃任何未提交的更改(即仅在您的工作树或索引中的更改).

您还可以使用以下命令强制更新分支:

git branch -f master 1258f0d0aae
Run Code Online (Sandbox Code Playgroud)

...但是如果你master当时正在打开,git不会让你这样做.

  • `git Branch -f` 很有用。很高兴我可以更改分支而无需先检查它。 (7认同)
  • 你不需要--hard (2认同)

cma*_*ter 34

如果您目前不在分支机构主管上,那非常简单:

git branch -f master 1258f0d0aae
Run Code Online (Sandbox Code Playgroud)

这完全符合您的要求:它指向master给定的提交,而不执行任何其他操作.

如果你当前在掌握,你需要先进入分离头状态.我建议使用以下两个命令序列:

git checkout 1258f0d0aae    #detach from master
git branch -f master HEAD   #exactly as above

#optionally reattach to master
git checkout master
Run Code Online (Sandbox Code Playgroud)

但请注意,任何明确操纵分支点的位置都有可能留下任何分支都无法访问的提交,从而成为垃圾回收的对象.所以,在你输入之前先想想git branch -f!


此方法优于git reset --hard方法,因为它不会破坏索引或工作目录中的任何内容.

  • 当我搜索这个时,这始终是我想要的,每个人都在推动“重置 --hard”——我几乎失去了这样做的工作(谢天谢地,仍然有藏匿处)。感谢您提供简单的“我不想进行其他更改”的解决方案。 (10认同)

Cha*_*esB 33

git reset --hard 1258f0d0aae
Run Code Online (Sandbox Code Playgroud)

但是要小心,如果后代在其他分支之间提交1258f0d0aae并且HEAD没有在其他分支中引用,那么恢复它们将是繁琐的(但并非不可能),所以你最好在当前HEAD,结帐master时重置为"备份"分支,并重置为你想要的提交.

另外,确保在a之前没有未提交的更改reset --hard,它们将真正丢失(无法恢复).

  • 并使用`git push -f`来推送 (11认同)
  • 如果有人不小心这样做并需要撤消一些事情,请参阅`git reflog` http://git-scm.com/docs/git-reflog (4认同)

Iva*_*van 20

git branch -f <branchname> <commit>

我选择马克·朗格尔的解决方案和评论,并建议任何人在演戏前阅读这些内容,但我建议重点放在上面

git branch -f <branchname> <commit>
Run Code Online (Sandbox Code Playgroud)

这是我需要这样做的场景.

脚本

在错误的分支上开发,因此需要重置它.

开始吧

干净地开发和发布一些软件.

到现在为止还挺好

在错误的分支上发展

错误:在进一步发展的同时,意外地留在发布部门.

出错后

意识到错误

"哦不!我不小心在发布分支上开发了." 工作区可能会有一半变化的文件混乱,代表正在进行的工作,我们真的不想触摸和搞乱.我们只是喜欢git来翻转几个指针以跟踪当前状态并将该发布分支放回原来的状态.

为目前为止提交的工作创建最新的开发分支并切换到该分支.

git branch development
git checkout development 
Run Code Online (Sandbox Code Playgroud)

改为另一个分支

纠正分支

现在我们处于问题状态,需要解决方案!纠正错误(将发布分支与开发一起推进)并将发布分支放回原来的状态.

更正发布分支以指回最后一个实际版本.

git branch -f release release2
Run Code Online (Sandbox Code Playgroud)

发布分支现在再次正确,像这样......

更正

如果我把错误推到遥控器怎么办?

git push -f <remote> <branch>虽然标题中的"覆盖"一词具有误导性,但在另一个帖子中有很好的描述. 强制"git push"覆盖远程文件