是,这是可能的,并不难。简短版本:git branch aBranch
创建新分支,git stash
以保存任何未提交的更改,git reset --hard 1
将master
重置为您希望的提交,并且可选择git stash pop
将这些未提交的更改应用于当前工作副本(如果这些更改是为了新的master
分支。
下面是一个完整的解释和图表,所以你可以按照。在下面,我会用*
来告诉当前分支(HEAD)。
0--1 *master
0--1--2 *master
0--1--2--3 *master
在当前创建新的分支aBranch
指向承诺:
$ git branch aBranch
0--1--2--3 *master aBranch
如果你在工作副本尚未提交的任何更改,保存这些藏匿(这很重要,因为git reset --hard
会清除所有未提交的变更):
$ git stash
0--1--2--3 *master aBranch
\- 4 stash
现在重置master
回到您想要的版本。我使用下面的1
作为占位符;你可能想,如果你想将其重置为上游master
分支是在你做你的提交改版前使用SHA-1,或类似origin/master
:如果你有未提交
$ git reset --hard 1
0--1--2--3 aBranch
\ \- 4 stash
\- *master
您将工作副本中的变更隐藏起来,并且您希望将它们应用于master
,则可以使用git stash apply
或git stash pop
(apply
将使存储记录为提交; pop
将清理存储)。
$ git stash pop
0--1--2--3 aBranch
\- *master (with stashed changes now back in your working copy)
现在你master
,并重新提交1,完全按照你想要的。新的提交将转到master
分支。
0--1--2--3 aBranch
\-4 *master
0--1--2--3 aBranch
\-4--5 *master
需要注意的是,如果你的工作副本是干净的(没有通过git status
报道),你不需要git stash
命令。如果您想要将更改应用于aBranch
而不是master
,则在下一次切换回aBranch
时,您只需使用git stash pop
并开始再次处理它。
要牢记的一点是,您应该只在自己的私人存储库中编辑像这样的分支历史记录,而不是其他人可以从中取得的公共记录。如果你把它推到一个人们正在使用的公共仓库中,那么他们必须重新设定他们的所有变化,最好不要让他们这样做,除非绝对必要。
当我刚接触git并进入类似的情况时,发现“gitk -all”对于查看提交和分支如何相关以及在GUI上执行一些操作都非常有帮助。 – ndim 2010-01-21 02:40:38
事实并非如此,我需要直观地看到这些关系(爱gitk -all&tortoisegit以可视化的方式),但是我认为第1,第2和第3个提交在分支上* aBranch *,I应该有*开始* *分支*做第一个提交(我希望我对某人有意义:)。现在我意识到这是多么愚蠢。 – 2010-01-21 07:41:39