从当前已检出的主分支中创建Git分支?

79
在服务器上有一个受Git控制的文件夹,主分支已经检出,一堆文件已被修改但未提交。是否有办法将这些更改提交到另一个分支,以便我可以返回到干净的版本?
即,我想撤消所有这个人的更改,但将它们存储在另一个分支中,以便该人可以切换到该分支获取他们的更改。
(是的,我知道这不是Git的设计方式,但这就是我的情况!)非常感谢任何想法。

1
类似于https://dev59.com/7XM_5IYBdhLWcg3wZSPX#1394804。嘿,Git在你的情况下运行得非常好,我不会说它不适合这样的工作流程。它是适合的! - knittl
仅供澄清,我预计这些更改永远不会被使用,但我确实需要一个永久记录以防万一。 - corydoras
3个回答

138

首先,根据当前HEAD移动到不同的分支是这样执行的:

git checkout -b newbranch

提交所有更改(假设没有新添加的文件,否则使用git add添加):

git commit -a

回到主分支:

git checkout master

之前未提交的更改将全部位于新分支newbranch上,而master分支仍将保持没有这些更改的状态。


5
说明: 工作库和暂存更改的内容不属于任何分支。只需从 HEAD(最后一次修订)创建新分支即可使新提交进入刚创建的 <newbranch> 分支。 - Jakub Narębski
谢谢大家,我原本以为切换到一个新分支会清除掉更改。由于我之前使用的是SVN,所以我认为这样的切换是不可能的。现在正在测试它。 - corydoras

13

你可以随时隐藏你的更改。

git stash
git checkout -b bravenewmaster
git stash apply

同时要记住,如果您将代码提交到了“错误”的分支上,您可以随时将该分支移回原来的位置,因为分支本质上只是指向某个提交的指针。


3
如果你打算立即重新应用相同的更改,为什么还要隐藏代码?你可以直接使用git checkout -b bravenewmaster,这样不但输入更少,而且不会不必要地触及所有更改过的文件。 - CB Bailey
1
好的,我没有尝试过,但我认为 git 由于某种原因不允许在有更改时使用 git checkout -b。否则,为什么要质疑呢?;-) - Michael Krelin - hacker
实际上,根据“我想有效地撤销这个人所做的所有更改,但在另一个机会中存储它们,以便如果该人想要他们的更改,他们可以切换到该分支”的说法 - 仅使用藏匿就足够了,不需要分支和应用。 - Michael Krelin - hacker
1
如果他正在存储更改(而不是暂时“藏匿”),那么在命名分支上进行提交(带有消息)可能比不能意外删除的隐藏更合适。两者都可以使用。 - CB Bailey
1
当然,我无法完全理解他人的意图,但我有一种感觉,“我想在这个实例上工作,但你修改了它,你能否请回避并稍后自己处理呢”;-) - Michael Krelin - hacker

13

这个方法很有用:

git checkout -B <new_branch> <start point>

说明:

  • <new_branch> 是你的新分支(例如 my_branch
  • <start point> 是你的起始分支(在你的情况下是 master
  • -B 创建一个从 <start point> 开始的新分支,如果它已经存在,则将其重置为 (它不会像 -b 一样在分支已经存在时失败)
  • 有时候可以使用 -m 来指定切换分支时进行三方合并,这将在当前分支、你的工作树内容之间执行三方合并(对于脚本很有用)。

更多详情请参见:man git-checkout


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