我如何使一个分支点在一个特定的提交?

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

我如何使一个特定的分支指向一个特定的提交?假设我想让master指向1258f0d0aae...,我该怎么做?

245047 次浏览

你可以这样让master指向1258f0d0aae:

git checkout master
git reset --hard 1258f0d0aae

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

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

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

git branch -f master 1258f0d0aae

... 但git不会让你这样做,如果你在master的时候。

git reset --hard 1258f0d0aae

但是要小心,如果在1258f0d0aaeHEAD之间的后代提交没有在其他分支中引用,那么恢复它们将是乏味的(但并非不可能),所以你最好在当前HEAD创建一个“备份”分支,签出master,并重置为你想要的提交。

此外,要确保在reset --hard之前没有未提交的更改,它们将真正丢失(没有办法恢复)。

Git branch -f <branchname> <

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

git branch -f <branchname> <commit>

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

场景

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

开始好了

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

So far So good

在错误的分支上发展

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

After a mistake

认识到错误

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

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

git branch development
git checkout development

已更改为另一个分支

纠正分支

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

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

git branch -f release release2

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

Corrected

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

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

如果你当前在分支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方法更好,因为它不会破坏索引或工作目录中的任何内容。