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

我如何使一个特定的分支指向一个特定的提交?比如我想在1258f0d0aae做主点…我该怎么做呢?


当前回答

如果你现在不在master分支上,这非常简单:

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方法更好,因为它不会破坏索引或工作目录中的任何东西。

其他回答

如果你现在不在master分支上,这非常简单:

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方法更好,因为它不会破坏索引或工作目录中的任何东西。

git reset --hard 1258f0d0aae

但是要注意的是,如果1258f0d0aae和HEAD之间的后代提交没有在其他分支中引用,那么恢复它们会很繁琐(但不是不可能),所以你最好在当前HEAD创建一个“备份”分支,签出主,并重置到你想要的提交。

此外,要确保在重置之前没有未提交的更改——很难,它们将真正丢失(无法恢复)。

您可以在1258f0d0aae设置主点:

git checkout master
git reset --hard 1258f0d0aae

但是你做这个的时候要小心。它很可能改写这一分支的历史。如果您已经发布了它,而其他人正在处理这个分支,那么就会产生问题。

此外,git reset——hard命令将丢弃任何未提交的更改(即那些只是在你的工作树或索引中)。

你也可以强制更新一个分支:

git branch -f master 1258f0d0aae

... 但如果你当时是大师,少管所不会让你这么做的。

Git branch -f <branchname> <提交>

我赞同Mark Longair的解决方案和评论,并建议任何人在行动前阅读这些内容,但我建议重点应该放在

git branch -f <branchname> <commit>

这是一个我需要这样做的场景。

场景

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

开始好了

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

在错误的分支上发展

错误:在进一步开发时不小心停留在发布分支上。

认识到错误

“哦,不!我不小心在发布分支上开发了。”工作空间可能被表示正在进行的工作的半成品文件弄得乱七八糟,我们真的不想碰它。我们只是想让git翻转几个指针来跟踪当前状态,并将释放分支放回它应该的状态。

为开发创建一个最新的分支,该分支持有迄今为止提交的工作,并切换到它。

git branch development
git checkout development 

纠正分支

现在我们正处于问题的境地,需要解决它!纠正错误(将发布分支与开发一起向前推进),并将发布分支放回它应该是的样子。

修正发布分支,使其指向最后一个真正的发布。

git branch -f release release2

发布分支现在又正确了,像这样…

如果我把错误推到遥控器上呢?

Git push -f <remote> <branch>在另一个线程中有很好的描述,尽管标题中的“覆盖”这个词是误导性的。 强制“git push”覆盖远程文件