Git分支 - 如何将当前的主分支变成一个分支,然后将主分支恢复到先前的版本?

4
这可能很简单,但我现在是一个git新手,还没有完全理解git分支模型。假设我当前除了master之外没有其他分支,但现在我做了一些更改,自上次提交以来我已经决定不想保留这些更改(注意:这些更改尚未提交)。然而,我暂时不想摆脱这些更改 - 我想把它们放在它们自己的分支中(称为experimental_stuff),然后从我的上一个提交继续开发。所以我想步骤是:
- 把当前的master分支变成一个分支(git branch experimental_stuff?) - 回到上一个提交(git checkout ?) - 把这个提交作为我的新的主分支,以便将来的提交从这里继续(git ????)
这是否是正确的方法,如果有的话,最后一部分需要什么git命令(如果有的话)?
[注:这只是我一个人使用的本地git存储库,如果有任何区别,请注意。]
2个回答

8

你已经接近完成了。

假设你已经在开发文件上进行了提交。然后...

git branch experimental_stuff(创建一个名为experimental_stuff的新分支)

git reset --hard HEAD^(回到主分支的前一个提交,以继续开发)

假设你还没有对开发文件进行提交。那么...

git stash(将当前更改保存到临时目录中)

git checkout -b experimental_stuff(创建并切换到名为experimental_stuff的分支)

git stash pop(将临时目录中的更改应用到experimental_stuff分支中)

git checkout master(返回主分支,这次不需要回退到之前的提交,因为你没有那个提交)


好的 - 谢谢 - 但是如果我还没有提交我的当前更改呢?我是不是应该先提交它们,然后再使用上述方法? - Paul R
好的,你可以将这些当前的更改(我们称之为工作目录),保存到一个临时空间中。好的,也许我会在答案中添加更多内容。 - TheOneTeam
抱歉,有一个打印错误,应该是 HEAD^ 或 HEAD~1。 - TheOneTeam
1
第二步(返回主分支)是不必要的。创建一个分支不会检出它,所以在执行“git branch experimental”之后,您仍然在主分支上。此外,“git branch e-s; git checkout -b e-s”的第一步也是不必要的,因为“git checkout -b”已经为您完成了这一步骤。-b 的整个意义在于为您创建一个新的分支以供检出。换句话说,“git checkout -b foo”与“git branch foo; git checkout foo”是相同的。 - William Pursell
你确定第二部分可行吗?在我执行stash pop命令并切换到主分支后,未提交的更改仍然存在于主分支中。 - Sebastianb
显示剩余4条评论

2
假设我目前没有任何分支。
纠正一下,你在Git中总是至少有一个分支。即使主分支也是一个分支,具有与其他分支相同的功能。Git不会将名为master的分支与另一个分支区别对待。这只是一个约定,大多数开发人员将其主要分支命名为“master”,但您不需要这样做。您甚至可以删除主分支并创建诸如开发、发布等分支。对于您的问题本身:Kit Ho的答案很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接