在Git中,我理解分支是指向提交的指针。
如何为特定提交创建特定分支?假设我想master
指向1258f0d0aae...
,我该怎么做?
答案 0 :(得分:190)
您可以master
这样点1258f0d0aae
:
git checkout master
git reset --hard 1258f0d0aae
但你必须小心这样做。它可能会重写该分支的历史。如果您已经发布了这个问题而其他人正在分支机构工作,那么这会产生问题。
此外,git reset --hard
命令将丢弃任何未提交的更改(即工作树或索引中的更改)。
您还可以使用以下命令强制更新分支:
git branch -f master 1258f0d0aae
...但如果您当时正在master
,那么git不会让您这样做。
答案 1 :(得分:32)
git reset --hard 1258f0d0aae
但是要小心,如果1258f0d0aae
和HEAD
之间的后代提交未在其他分支中引用,那么恢复它们将是乏味的(但并非不可能),因此您最好创建当前HEAD
的“备份”分支,结帐master
,并重置为您想要的提交。
另外,请确保在reset --hard
之前没有未提交的更改,它们将真正丢失(无法恢复)。
答案 2 :(得分:27)
如果你当前不在分支主机上,这非常简单:
git branch -f master 1258f0d0aae
这完全符合您的要求:它在给定的提交中指向master
,并且不执行任何其他操作。
如果您目前在掌握,您需要先进入分离头状态。我建议使用以下两个命令序列:
git checkout 1258f0d0aae #detach from master
git branch -f master HEAD #exactly as above
#optionally reattach to master
git checkout master
但是,请注意,任何明确操纵分支点的位置都有可能留下任何分支都无法访问的提交,从而成为垃圾回收的对象。所以,在输入git branch -f
之前先想一想!
此方法优于git reset --hard
方法,因为它不会破坏索引或工作目录中的任何内容。
答案 3 :(得分:15)
我选择Mark Longair的解决方案和评论,并建议任何人在演戏前阅读这些内容,但我建议重点放在
上git branch -f <branchname> <commit>
这是我需要这样做的场景。
开发错误的分支,因此需要重置它。
干净地开发和发布一些软件。
错误:在进一步发展的同时,意外地留在发布分支。
“哦不!我在发布分支上意外地开发了。”工作区可能会有一半变化的文件混乱,代表正在进行的工作,我们真的不想触摸和搞乱。我们只是喜欢git来翻转几个指针以跟踪当前状态并将该发布分支放回原来的状态。
为目前为止提交的工作创建最新的开发分支并切换到该分支。
git branch development
git checkout development
现在我们处于问题状态,需要解决方案!纠正错误(将发布分支带到开发中)并将发布分支放回原来的状态。
更正发布分支以指回最后一个真正的版本。
git branch -f release release2
发布分支现在再次正确,就像这样......