乐闻世界logo
搜索文章和话题

How to moving existing uncommitted work to a new branch in git?

7 个月前提问
3 个月前修改
浏览次数112

6个答案

1
2
3
4
5
6

当您在Git中工作时,有时会发现自己在错误的分支上进行了一些更改,或者决定您的修改应该在新的分支上进行,以保持主分支的清洁或为了其他原因。幸运的是,Git提供了灵活性,允许您将尚未提交的更改移至新的分支。以下是步骤:

  1. 检查当前更改: 在移动更改之前,您应该查看当前工作目录和暂存区的状态。可以使用以下命令:

    shell
    git status

    这将显示当前更改的状态,无论是已经暂存(staged)还是尚未暂存(unstaged)。

  2. 创建并切换到新分支: 如果您已经暂存了更改,首先应该将这些更改取消暂存(如果您希望这些更改也被移动到新分支)。然后,创建并切换到新分支,可以使用以下命令:

    shell
    git checkout -b new-branch-name

    这个命令会创建一个名为 new-branch-name 的新分支,并切换到那个分支。

  3. 添加和提交更改: 现在您已经在新分支上,可以添加并提交您的更改。使用以下命令来添加所有更改到暂存区:

    shell
    git add .

    或者,如果您想要添加特定文件,可以使用:

    shell
    git add <file-path>

    接下来,将更改提交到您的新分支:

    shell
    git commit -m "Commit message explaining the changes"
  4. (可选)保持主分支清洁: 如果您刚才从主分支(比如说 mainmaster)上创建了新分支,并且不想让这些更改出现在主分支上,您可以切回主分支并撤消这些更改。首先,切换回主分支:

    shell
    git checkout main

    然后,使用以下命令来撤销未提交的更改:

    shell
    git reset --hard

    这将重置主分支,将其恢复到最后一次提交的状态,丢弃所有未提交的更改。请注意,这是一个危险的操作,因为它会丢弃所有未提交的更改。在使用 git reset --hard 之前,请确保您不需要这些未提交的更改。

这就是将未提交的工作移动到新分支的基本过程。 让我们看一个具体的例子:

假设您正在主分支 main 上工作,并且进行了一些更改,现在您想要将这些更改移到一个新的分支 feature-x

  1. 检查更改:
    sh
    git status
  2. 创建并切换到新分支 feature-x:
    sh
    git checkout -b feature-x
  3. 添加所有更改并提交它们到新分支:
    sh
    git add . git commit -m "Start working on feature X"
  4. 如果需要,切换回 main 分支并撤销更改:
    sh
    git checkout main git reset --hard

现在,新分支 feature-x 包含了之前未提交的工作,而 main 分支保持不变。

2024年6月29日 12:07 回复

2020 更新/Git 2.23

Git 2.23 添加了新的switch子命令,试图消除由于超载使用checkout(切换分支、恢复文件、分离 HEAD 等)而产生的一些混乱。

从此版本的 Git 开始,将 checkout 命令替换为:

shell
git switch -c <new-branch>

行为是相同的并且保持不变。


2020 年更新之前/Git 2.23

使用以下内容:

shell
git checkout -b <new-branch>

这将使您当前的分支保持原样,创建并签出一个新分支并保留所有更改。然后,您可以暂存要提交的文件中的更改:

shell
git add <files>

并承诺您的_新分支_:

shell
git commit -m "<Brief description of this commit>"

工作目录中的更改和索引中暂存的更改_尚不属于任何分支_。这会更改这些修改结束的分支。

您无需_重置_原始分支,它会保持原样。最后一次提交<old-branch>仍然是相同的。因此你checkout -b然后承诺。

2024年6月29日 12:07 回复

将当前更改保存到临时存储中:

  1. $ git stash

  2. 基于此存储创建一个新分支,并切换到新分支:

    $ git stash branch <new-branch> stash@{0}

提示:使用 Tab 键来减少输入存储名称。

2024年6月29日 12:07 回复

如果您在编码时一直在主分支上进行提交,但现在想要将这些提交移动到不同的分支,这是一种快速方法:

  1. 将当前历史记录复制到新分支,同时也带来所有未提交的更改:

    shell
    git checkout -b <new-feature-branch>
  2. 现在强制原来的“混乱”分支回滚:(不切换到它)

    shell
    git branch -f <previous-branch> <earlier-commit-id>

    例如:

    shell
    git branch -f master origin/master

    或者如果您已进行 4 次提交:

    shell
    git branch -f master HEAD~4

警告: git branch -f master origin/master将_重置该分支的跟踪信息_。因此,如果您将master分支配置为推送到其他地方,origin/master那么该配置将会丢失。

_警告:_如果在分支后进行变基,则存在某些提交可能会丢失的危险,如此处所述。避免这种情况的唯一方法是使用cherry-pick 创建新的历史记录。该链接描述了最安全、万无一失的方法,尽管不太方便。(如果您有未提交的更改,则可能需要git stash在开始和git stash pop结束时进行更改。)

2024年6月29日 12:07 回复

常见的情况如下:我忘记为新功能创建新分支,并在旧功能分支中完成所有工作。我已将所有“旧”工作提交给 master 分支,并且我希望我的新分支从“master”中成长。我还没有对我的新工作做出任何承诺。这是分支结构:“master”->“Old_feature”

shell
git stash git checkout master git checkout -b "New_branch" git stash apply
2024年6月29日 12:07 回复

如果您提交它,您还可以选择单个提交 ID。当我开始在 master 中工作,然后想在推送到我的 origin/ 之前创建一个本地分支时,我经常这样做。

shell
git cherry-pick <commitID>

正如此处所述,您可以使用cherry-pick做很多事情,但这可能是您的一个用例。

2024年6月29日 12:07 回复

你的答案