使用当前更改创建Git分支

wil*_*ood 776 git git-branch

我开始在我的主分支上工作,认为我的任务很简单.过了一会儿,我意识到这将需要更多的工作,我想在一个新的分支中完成所有这些工作.如何创建一个新分支并随身携带所有这些更改而不会弄脏主人?

Von*_*onC 625

如果你还没有做出任何提交,只有(1:branch)和(3:checkout)就足够了.
或者,在一个命令中:git checkout -b newBranch

git reset手册页中所述:

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
Run Code Online (Sandbox Code Playgroud)
  1. 你做了一些提交,但意识到他们在" master"分支中还为时过早.您想继续在主题分支中对它们进行抛光,因此请创建topic/wip当前分支HEAD.
  2. 倒回master分支以摆脱这三个提交.
  3. 切换到" topic/wip"分支并继续工作.

注意:由于命令的"破坏性"效果git reset --hard(它确实会重置索引和工作树.<commit>因此丢弃工作树中跟踪文件的任何更改),我宁愿选择:

$ git reset --soft HEAD~3  # (2)
Run Code Online (Sandbox Code Playgroud)

这将确保我没有丢失任何私有文件(未添加到索引).
--soft选项根本不会触及索引文件或工作树(但重置头部<commit>,就像所有模式一样).

  • 未来读者需要注意:从下到上阅读(或者一定要阅读整篇文章).`git reset --hard`会破坏你的变化,如果它们没有被提交,那么它们是不可恢复的!你可能只需要`git checkout -b ...` (36认同)
  • 值得注意的是,如果您已将主题材料提交到其他人从中获取的存储库中的主分支,那么这可能也不是一个好主意.或者至少,如果你确实需要进行重置,你需要告诉别人你正在做的事情,所以来自他们下一次拉动的警告不会太令人震惊. (5认同)
  • 为什么主题/分支?为什么不只是branchname,这个命名是否有特殊原因?就是想. (5认同)
  • @ConradMeyer好点。我已经编辑了答案,并把`git checkout -b`首先。 (3认同)
  • @它只是命名空间命名约定(一种轻松对分支进行分类的方法,使用 **hierarchical** 分支名称来定义命名空间):http://stackoverflow.com/a/2527436/6309。例如,对于问题:http://randyfay.com/content/pushing-and-deleting-git-topic-branches-screencast。命名分支时不必使用层次结构。`topic_wip` 也可以工作;) (2认同)
  • 给读者的提醒:当尝试一个你不熟悉的 git 操作时,在处理数据时你不确定它的结果你会不高兴/沮丧地丢失(例如 OP 的更改仅存在于本地 master 分支中) ),请先复制您的 repo 目录。这样,如果事情没有按预期发展,您可以随时返回。 (2认同)

EeK*_*Kay 243

就像这个问题中所述:Git:从master上的无标记/未更改的更改创建一个分支:stash不是必需的.

只需使用:

git checkout -b topic/newbranch

任何未提交的工作都将被带到新分支.

如果您尝试推送,您将收到以下消息

致命:当前分支功能/ NEWBRANCH没有上游分支.要推送当前分支并将远程设置为上游,请使用

git push --set-upstream origin feature/feature/NEWBRANCH
Run Code Online (Sandbox Code Playgroud)

只需按照建议远程创建分支:

git push --set-upstream origin feature/feature/NEWBRANCH

  • 只有在推送新分支时才会出现"无上游分支"错误,而不是在提交新工作时. (2认同)
  • @sam 我已经相应地修改了答案 (2认同)

Ava*_*dhP 70

跟着这些步骤:

  1. 创建一个新分支:

    git branch newfeature
    
    Run Code Online (Sandbox Code Playgroud)
  2. 结帐新分行:(这不会重置您的工作.)

    git checkout newfeature
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在在这个新分支上提交你的工作:

    git commit -s
    
    Run Code Online (Sandbox Code Playgroud)

使用上述步骤将保持原始分支清洁,您不必执行任何'git reset --hard'.

  • @ScottBiggs这是不必要的,但有些人遵循的做法.它是[--signoff"的缩写](https://git-scm.com/docs/git-commit)并将您的用户名添加到提交中,以便将来查看日志的人知道您已经宽恕了此提交. (11认同)
  • 很好的答案,但在第3步中不需要`-s`. (5认同)
  • "-s"在第3步中做了什么? (3认同)

Ali*_*liA 36

我发现这里的大多数答案都已经过时了。无需使用新的 switch 命令进行 stash 和 pop 操作。

git switch -c new_branch -m
Run Code Online (Sandbox Code Playgroud)

将创建一个名为“new_branch”的新分支,切换到它并将所有未提交的更改作为修改后的文件带来。然后您可以继续进行更改或将它们提交到新分支等。


Eth*_*her 22

由于您尚未进行任何提交,因此可以将所有更改保存到存储,创建并切换到新分支,然后将这些更改弹回到工作树中:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Run Code Online (Sandbox Code Playgroud)

  • 或者当VonC指出'git checkout -b newbranch'并跳过藏匿处 (9认同)
  • 我认为这是一个错字,但只是一个抬头,'git stash push`不是命令.你可能想要使用`git stash`或`git stash save`.如果要在存储中包含未跟踪的文件,请使用`--include-untracked`选项.同样,如果要在存储中包含未跟踪和忽略的文件,请改用"--add"选项. (2认同)

Pat*_*fer 10

要向新分支添加新更改并推送到远程:

git branch branch/name
git checkout branch/name
git push origin branch/name
Run Code Online (Sandbox Code Playgroud)

通常我会忘记添加原始部分来推送并弄清楚为什么我没有在bitbucket中看到新的分支/提交