使用当前更改创建Git分支


848

我开始在分支上工作,以为我的任务会很容易。过了一会儿,我意识到这将需要更多的工作,我想在一个新分支中完成所有这些工作。

如何创建一个新分支并随身携带所有这些更改而不会弄脏主服务器




4
是的,这些都是重复的问题,但是措辞却是如此不同,以至于我认为这很有用。请在此处注意关键字:branch current changesvs existing uncommited branch。任何说英语的人都会立即发现它们是相同的,但是搜索引擎可能不会。保留这个问题。
Scott Biggs

Answers:


690

如果您尚未进行任何提交,则仅(1:分支)和(3:结帐)就足够了。
或者,在一个命令中: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)
  1. 您已经进行了一些提交,但是意识到它们还不成熟,因此无法进入“ master”分支。您想在主题分支中继续完善它们,因此请topic/wip从current分支创建分支HEAD
  2. 快退master分支以摆脱这三个提交。
  3. 切换到“ topic/wip”分支并继续工作。

注意:由于命令的“破坏性”效果git reset --hard(它确实会重置索引和工作树。对工作树中跟踪文件的任何更改<commit>都将被丢弃),我宁愿使用:

$ git reset --soft HEAD~3  # (2)

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


使用Git 2.23+时新命令git switch将在一行中创建分支(具有相同的种类reset --hard,因此请注意其效果):

git switch -f -c topic/wip HEAD~3

6
可能还值得注意的是,如果您已将主题资料提交给其他人从其来的存储库中的master分支,则这不是一个好主意。或者至少,如果您确实需要进行重置,则需要告诉人们您正在执行的操作,这样,下一次拉动发出的警告就不会太令人震惊。
Andrew Walker 2010年

38
给未来读者的注意事项:从下至上阅读(或一定要完整阅读)。git reset --hard会取消您的更改,如果尚未提交,则无法恢复!您可能只需要git checkout -b …
康拉德·迈尔

3
@ConradMeyer好点。我已经编辑了答案并放在了git checkout -b第一位。
VonC 2012年

5
为什么选择主题/分支?为什么不只是分支名称,这种命名是否有特殊原因?就是想。
山姆·斯托林加2012年

1
@这只是一个命名空间命名约定(一种使用层次化分支名称定义命名空间来轻松对分支进行分类的方法):stackoverflow.com/a/2527436/6309。例如,对于问题:randyfay.com/content/…。命名分支时不必使用层次结构。topic_wip也会工作;)
VonC 2012年

269

像这个问题中所述:Git:从master上未标记/未提交的更改创建分支:不需要隐藏

只需使用:

git checkout -b topic/newbranch

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

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

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

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

按照建议的方法远程创建分支:

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


3
仅当您推送新分支时才会出现“无上游分支”错误,而在提交新工作时则不会。
山姆

2
@sam我已经相应地修改了答案
Nick Kennedy

73

按着这些次序:

  1. 创建一个新分支:

    git branch newfeature
    
  2. 签出新分支:(这不会重置您的工作。)

    git checkout newfeature
    
  3. 现在,在这个新分支上提交您的工作:

    git commit -s
    

使用上述步骤将使您的原始分支保持干净,并且您无需执行任何“ git reset --hard”操作。


3
步骤3中的“ -s”做什么?
Scott Biggs 2015年

12
@ScottBiggs不必要,但是有人遵循的做法。它是“ --signoff”的缩写,它将用户名添加到提交中,以供将来查看日志的人知道您已接受此提交。
Frank Bryce

5
尼斯的答案,但没有必要-s在第3步
穆罕默德阿里

我从评论中学到了新的东西,谢谢@FrankBryce
Kasparov92

30

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

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

9
或正如VonC指出的“ git checkout -b newbranch”并跳过
隐藏-willcodejavaforfood 2010年

@will:我当时想创建一个新分支会覆盖您所做的所有未提交的更改,但是如果不是这样,可以跳过存储。
以太2010年

1
我尝试了一下,它工作正常,git非常周到,不会覆盖任何本地更改
willcodejavaforfood 2010年

2
我认为这是拼写错误,但请注意,这git stash push不是命令。您可能想使用git stashgit stash save。如果要在存储中包含未跟踪的文件,请使用该--include-untracked选项。同样,如果要在存储中包含未跟踪的文件和被忽略的文件,请改用该--add选项。
2015年

如果您已经创建了分支,这将很有帮助。
当然

13

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

git branch branch/name
git checkout branch/name
git push origin branch/name

很多时候,我忘记添加原点部分以进行推送,并且感到困惑,为什么我在bitbucket中看不到新的分支/提交

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.