【问题标题】:Create Git branch with current changes使用当前更改创建 Git 分支
【发布时间】:2011-04-23 09:55:06
【问题描述】:

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

我怎样才能创建一个新分支并随身携带所有这些更改而不弄脏master

【问题讨论】:

标签: git git-branch


【解决方案1】:

如果您还没有提交任何内容,那么只需 (1: branch) 和 (3: checkout) 就足够了。
或者,在一个命令中:git checkout -b newBranch

使用Git 2.23+(2019 年第三季度),new command git switch 将在一行中创建分支(使用相同类型的reset --hard,因此注意它的影响):

# First, save your work in progress!
git stash

# Then, one command to create *and* switch to a new branch
git switch -f -c topic/wip HEAD~3

git reset man page中提到的:

$ git stash                # (0) Save your work in progress
$ 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”分支中还为时过早。您想在主题分支中继续完善它们,因此从当前的 HEAD 创建“topic/wip”分支。
  2. 倒回master 分支以摆脱这三个提交。
  3. 切换到“topic/wip”分支继续工作。

再次:新方法(自 2019 年和 Git2.23 起)在一个命令中完成所有操作:

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

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

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

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


【讨论】:

  • 可能还值得注意的是,如果您已将主题材料提交到其他人从中提取的存储库中的主分支,这不是一个好主意。或者至少,如果你确实需要进行重置,你需要告诉人们你正在做什么,这样他们下一次拉动的警告就不会太令人震惊。
  • 未来读者注意:从下往上阅读(或确保通读全文)。 git reset --hard 将取消您的更改,如果尚未提交,则无法恢复!你可能只需要git checkout -b …
  • @ConradMeyer 好点。我已经编辑了答案并将git checkout -b放在第一位。
  • 为什么选择主题/分支??为什么不只是分支名称,这个命名有什么特殊原因吗?只是想知道。
  • @这只是一个命名空间命名约定(一种轻松分类分支的方法,使用分层分支名称来定义命名空间):stackoverflow.com/a/2527436/6309。例如,对于问题:randyfay.com/content/…。命名分支时不必使用层次结构。 topic_wip 也可以;)
【解决方案2】:

就像这个问题中所说的:Git: Create a branch from unstagged/uncommited changes on master: stash 是没有必要的。

只需使用:

git checkout -b topic/newbranch

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

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

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

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

按照建议远程创建分支:

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

【讨论】:

  • 只有在推送新分支时才会出现“无上游分支”错误,而不是在提交新工作时。
  • @sam 我已经相应地修改了答案
【解决方案3】:

按照以下步骤操作:

  1. 创建一个新分支:

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

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

    git commit -s
    

使用上述步骤将使您的原始分支保持清洁
而且您不必执行任何“git reset --hard”。

附:提交的-s 参数用于--signoff

【讨论】:

  • 第 3 步中的“-s”有什么作用?
  • @ScottBiggs 这是不必要的,但有些人遵循的做法。它是 short for "--signoff" 并将您的用户名添加到提交中,以便将来查看日志的人知道您宽恕了此提交。
  • 不错的答案,但在第 3 步中不需要-s
【解决方案4】:

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

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

【讨论】:

  • 或者正如 VonC 指出的 'git checkout -b newbranch' 并跳过存储
  • @will:我在想创建一个新分支会覆盖你所有未提交的更改,但如果不是这种情况,是的,你可以跳过存储。
  • 我试过了,效果很好,git很周到,不会覆盖任何本地更改
  • 我认为这是一个错字,但只是提醒一下git stash push 不是命令。您可能想使用git stashgit stash save。如果要在存储中包含未跟踪的文件,请使用 --include-untracked 选项。同样,如果您想在存储中包含未跟踪和忽略的文件,请改用--add 选项。
  • 如果您已经创建了分支,这很有帮助。
【解决方案5】:

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

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

我经常忘记添加要推送的原始部分并感到困惑,为什么我在 bitbucket 中看不到新的分支/提交

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2013-07-13
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2011-06-12
    • 2018-01-27
    相关资源
    最近更新 更多