将现有未提交的工作移动到Git中的新分支

我开始了一个新功能的一些工作,编码了一段时间后,我决定这个功能应该在自己的分支上。

如何将现有未提交的更改移动到新分支并重置当前分支?

我想重置我的当前分支,同时保留现有的新功能的工作。

905994 次浏览

更新2020/Git 2.23

Git 2.23添加了新的#0子命令,试图清除#1重载使用带来的一些混乱(切换分支、恢复文件、分离HEAD等)

从这个版本的Git开始,将签出命令替换为:

git switch -c <new-branch>

行为是相同的,保持不变。


2020年更新之前/Git 2.23

使用以下方法:

git checkout -b <new-branch>

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

git add <files>

并承诺您的新分支

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

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

你不重置你的原始分支,它保持原样。<old-branch>上的最后一次提交仍然是一样的。因此你checkout -b然后提交。

或者:

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

    $ git stash

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

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

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

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

git cherry-pick <commitID>

有很多你可以做的樱桃选择,如这里所述,但这可能是一个用例。

如果你一直在做承诺在您的主分支上编码,但您现在想将这些提交移动到不同的分支,这是一个快速的方法:

  1. 将您当前的历史记录复制到一个新分支上,同时带来任何未提交的更改:

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

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

    例如:

     git branch -f master origin/master

    或者如果你做了4次提交:

     git branch -f master HEAD~4

警告:git branch -f master origin/master重置跟踪信息用于该分支。因此,如果您已将master分支配置为推送到origin/master以外的某个地方,那么该配置将丢失。

警告:如果您在分支后重新建立基础,则可能会丢失某些提交的危险,这就是这里描述。避免这种情况的唯一方法是使用Cherry-选择创建新的历史记录。该链接描述了最安全的防傻瓜方法,尽管不太方便。(如果您有未提交的更改,您可能需要在开始时git stash,在结束时git stash pop。)

常见的情况是这样的:我忘记为新功能创建新分支了,我正在老功能分支做所有的工作。我已经把所有的旧分支提交给master分支,我想让我的新分支从master分支成长。我还没有对我的新工作进行一次提交。下面是分支结构:"master"->"Old_feature"

git stashgit checkout mastergit checkout -b "New_branch"git stash apply

我用@罗宾@张子安回答并列出我所做的一切,

git status                               <-- review/list uncommitted changesgit stash                                <-- stash uncommitted changesgit stash branch <new-branch> stash@{1}  <-- create a branch from stashgit add .                                <-- add local changesgit status                               <-- review the status; ready to commitgit commit -m "local changes ..."        <-- commit the changesgit branch --list                        <-- see list of branches incl the one created abovegit status                               <-- nothing to commit, working tree (new-branch) is cleangit checkout <old-branch>                <-- switch back

!如果repo有多个存储,请查看将哪一个应用于new-分支:

git stash liststash@{0}: WIP on ...stash@{1}: WIP on ...

并检查个人藏匿处,

git stash show stash@{1}

或者一次检查所有藏匿:

git stash list -p

实际上,现在有一种非常简单的方法可以使用GitHub Desktop来做到这一点,我不认为这是以前的功能。

你需要做的就是切换到GitHub Desktop中的新分支,它会提示你将更改保留在当前分支上(将被隐藏),或者将更改带到新分支。只需选择第二个选项,将更改带到新分支。然后你可以像往常一样提交。

GitHub Desktop

这可能对所有使用GIT工具的人都有帮助

命令

切换分支-它会将您的更改移动到新分支。然后您可以提交更改。

 $ git checkout -b <new-branch>

TortoiseGIT

右键单击您的存储库,然后使用TortoiseGit->Switch/Checkout

在此处输入图片描述输入图片描述

资源树

使用“签出”按钮切换分支。单击分支后,您将在顶部看到“签出”按钮。当前分支的更改将自动应用。然后您可以提交它们。

在此处输入图片描述

提交更改的3个步骤

假设您在GitHub上创建了一个名为功能分支的新分支。

在此处输入图片描述

FETCH

    git pull --all         Pull all remote branchesgit branch -a          List all branches now

签出并切换到功能分支目录。您可以简单地从上面的分支-a命令的输出中复制分支名称

git checkout -b feature-branch

验证

接下来使用git分支命令查看当前分支。它将在前面显示带有*的功能分支

git branch

COMMIT

git add .   add all filesgit commit -m "Rafactore code or use your message"

在源服务器上进行更新和推送更改

 git pull origin feature-branchgit push origin feature-branch

这是告诉您使用git stash -k的唯一答案,您将需要…

如果你已经花了一个小时git add -p

然后决定要测试添加到索引之前中的内容进行实际提交。在这种情况下,<强>不使用普通git stash

而是这样做:

git stash -k

这将保留索引并删除仍在工作目录中且尚未添加到索引中的其余部分。正是您想要的。

现在您可以尝试编译/测试和提交。

makegit commit -m 'Yay!'

然后返回未提交的更改

git stash pop

如果你发现它不能编译,然后进行更改并将这些也添加到索引和提交中,这可能会混淆git stash pop。当涉及到合并时,它并不是那么好。在这种情况下,你可能无论如何都应该提交;因此:

makegit commit -m 'Grrrr'

然后创建一个新的分支,

git switch -c tmpbranch

在那里完成您的工作(更改代码、进行测试和更多提交)

/* blood sweat and tears */

一旦一切正常,将其提交到新分支

commit -a -m 'Finally!'

回到旧分支,然后使用与推送到存储时相同的工作目录执行git stash pop

git checkout youknowwhatbranchyouwereonrightgit stash pop

也提交,否则无法合并tmp分支。然后合并您创建的临时分支。

git commit -a -m 'Still working on this.'git merge tmpbranch/* fix collisions and commit */

现在你可以做一个rebase,把“仍在处理这个”放在顶部,然后把剩下的压缩/固定到一个评论中

git rebase -i

可能会给你:

pick 540623a Grrrpick a8589d3 Still working on this.pick d3b602c Finally

然后将其更改为:

reword 540623a Grrrfixup d3b602c Finallypick a8589d3 Still working on this.

最后撤消最后一次提交(“仍在处理这个”)

git reset HEAD~1

备选办法1(现有分支机构)

git stash (from main/any-branch)git checkout your-existing-branchgit stash apply

选项2(创建新分支)

git switch -c your-new-branch

对于那些使用Visual Studio Community 2022(可能还有更早版本)的人,当你有未提交的更改然后创建一个新分支时,你会看到如下对话框:

输入图片描述

只需选择第一个选项将更改带到“[你的新分支名称]”并单击继续结账。新的分支将被创建,您可以继续在那里提交更改。