【发布时间】:2011-11-10 17:31:51
【问题描述】:
在 Git 中,我理解分支是指向提交的指针。
如何将特定分支点指向特定提交?假设我想让master 指向1258f0d0aae...,我该怎么做?
【问题讨论】:
-
@akostadinov 是的,那个人的答案更丰富(恕我直言)
标签: git git-branch
在 Git 中,我理解分支是指向提交的指针。
如何将特定分支点指向特定提交?假设我想让master 指向1258f0d0aae...,我该怎么做?
【问题讨论】:
标签: git git-branch
您可以这样使master 指向1258f0d0aae:
git checkout master
git reset --hard 1258f0d0aae
但你必须小心这样做。它很可能会改写那个分支的历史。如果你已经发布了它并且其他人正在分支上工作,那将会产生问题。
此外,git reset --hard 命令将丢弃任何未提交的更改(即那些仅在您的工作树或索引中的更改)。
您还可以使用以下命令强制更新分支:
git branch -f master 1258f0d0aae
...但如果你当时在 master,git 不会让你这样做。
【讨论】:
git branch -f 很有用。很高兴我可以更改分支而无需先检查它。
git reset --hard 1258f0d0aae
但是要小心,如果 1258f0d0aae 和 HEAD 之间的后代提交没有在其他分支中引用,那么恢复它们会很乏味(但并非不可能),所以你最好创建一个“备份”在当前HEAD 分支,结帐master,并重置为您想要的提交。
另外,请确保在 reset --hard 之前没有未提交的更改,它们将真正丢失(无法恢复)。
【讨论】:
git refloggit-scm.com/docs/git-reflog
git push -f推送
我选择 Mark Longair 的解决方案和 cmets,并建议任何人在行动前阅读这些内容,但我建议重点应该放在
git branch -f <branchname> <commit>
这是我需要这样做的一个场景。
在错误的分支上开发,因此需要重置它。
干净利落地开发和发布一些软件。
错误:在进一步开发时不小心停留在发布分支上。
“哦不!我不小心在发布分支上开发了。”工作区可能充满了一半已更改的文件,这些文件代表正在进行中的工作,我们真的不想接触和弄乱。我们只想让 git 翻转一些指针以跟踪当前状态并将发布分支恢复到应有的状态。
为最新的开发创建一个分支,保存迄今为止提交的工作并切换到它。
git branch development
git checkout development
现在我们遇到了问题,需要它的解决方案!纠正错误(将发布分支与开发一起推进)并将发布分支恢复到应有的状态。
更正发布分支以指向上一个真正的发布。
git branch -f release release2
release 分支现在又正确了,像这样...
git push -f <remote> <branch> 在另一个线程中有很好的描述,尽管标题中的“覆盖”一词具有误导性。
Force "git push" to overwrite remote files
【讨论】:
如果您当前不是在分支 master 上,那超级简单:
git branch -f master 1258f0d0aae
这正是您想要的:它将master 指向给定的提交,并且不执行任何其他操作。
如果您当前处于 master 状态,则需要先进入 detached head 状态。我推荐以下两个命令序列:
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 方法更好,因为它不会破坏索引或工作目录中的任何内容。
【讨论】:
reset --hard--我几乎失去了工作(幸好还有藏匿处)。感谢您提供直截了当的“我不想做其他更改”的解决方案。