Git-在错误的分支上工作-如何将更改复制到现有主题分支


333

我一直在从事一个项目,但是不幸的是,我忘记了切换到我的分支,因此一直在从事master

如何将我在这里完成的工作(3个文件)从master复制到我的分支(例如,称为branch123)而又不提交给master?

Answers:


540

听起来您所需要的是以下内容:

git stash
git checkout branch123
git stash apply

然后,您应该回到自己的分支上,而不要接触master分支。


6
好的,我运行了,但是当我切换回master(git checkout master)并运行git status时,相同的文件仍然被“修改”了-是预期的吗?
亚历克斯(Alex)

5
如果当前分支(母版)和主题分支(branch123)之间的差异不在您本地修改的任何文件中,那么您实际上不必隐藏。在这种情况下,Git使您可以简单地检出主题分支。
卡斯卡贝尔2011年

3
@Alex:是的,这是预期的。这不涉及提交。stash保存本地修改,然后stash apply将其恢复。
卡斯卡贝尔2011年

6
我怎样才能从master分支中“摆脱”它们呢?
亚历克斯(Alex)

7
git reset --hard HEAD然后返回到对主分支所做的最后一次提交。
gna 2011年

46

公认的答案是最彻底的,但是在特殊情况下可以简化。如果你在工作目录中修改的文件是在两个相同的master,并branch123可以简单地做

git checkout branch123

无需隐藏任何内容,因为的默认行为checkout是不覆盖工作目录中的已修改文件,因此您不会丢失任何内容。(这实际上是Cascabel首先在评论中提到的)

正如其他人在评论中提到的那样,如果branch123尚不存在,您可以

git checkout -b branch123

根据我在这里找到的内容。


3
或者,如果您想创建一个新分支,git checkout -b newbranch
Phil Mitchell

2
这对我来说比隐藏更好,而且容易得多。谢谢!
Matthias 2014年

31
不,这不起作用。Git会向您显示此消息:“提交更改或隐藏更改,然后才能切换分支。”
dsharew

1
@DegenSharew:是的,在某些情况下您是对的,即,如果您在工作目录中修改的文件在master和中不相同branch123。看到我编辑的答案。
罗素·德克斯

1
这对我来说很棒。我还没有创建分支,所以我这样做了:git checkout -b newbranchname。我的更改独自出现在该分支中。
dex3703 '16


0

由于可以创建一个新分支,但无法在检出文件时检出现有分支,因此我发现了以下使用临时分支的技巧:

这种情况至少适用于VS 2015 Git插件,但很可能适用于任何git工具。

  1. 签出并更改master中的文件(ups !,错误的分支)
  2. 从master创建一个新的分支“ temp”(或您选择的任何未使用的名称)。现在,已签出的文件将在临时而不是主文件中签出。
  3. 签入对温度的更改(未更改主机)
  4. 现在,所有内容都已签入,可以签出现有分支。签出想要的分支(我想进行更改的分支开始)3.5 Git Rebase
  5. 合并临时到想要的分支。现在,更改已在正确的分支中。
  6. 删除临时分支,因为不再需要它

编辑:我发现,在执行合并之前,您将必须执行temp分支的rebase(git rebase --onto)。否则,母版中的更改将包含在合并中。上面的额外步骤3.5。在此处查看有关变基的更多信息:https : //git-scm.com/book/en/v2/Git-Branching-Rebasing


您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明?
abarisone 2015年

感谢您的反馈意见。但是,该解决方案非常简单,并且遵循与“存储”解决方案相同的原理,不同之处在于,使用临时分支代替存储。至少对于Visual Studio用户而言,这更方便,因为GIT插件不支持隐藏功能
Pasi 2015年
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.