Git - 处理错误的分支 - 如何将更改复制到现有主题分支
Posted
技术标签:
【中文标题】Git - 处理错误的分支 - 如何将更改复制到现有主题分支【英文标题】:Git - working on wrong branch - how to copy changes to existing topic branch 【发布时间】:2011-08-23 06:36:50 【问题描述】:我一直在做一个项目,但不幸的是,我忘记切换到我的分支,因此一直在做 master
如何在不提交到 master 的情况下将我在这里完成的工作(3 个文件)从 master 复制到我的分支(例如 branch123)?
【问题讨论】:
【参考方案1】:听起来您只需要以下内容:
git stash
git checkout branch123
git stash apply
那么你应该回到你自己的分支而不接触主分支。
【讨论】:
好的-我运行了它,但是当我切换回master(git checkout master)并运行git status时,相同的文件仍然“修改”-这是预期的吗? 如果您当前的分支 (master) 和主题分支 (branch123) 之间的差异不在您本地修改的任何文件中,您实际上可能不需要存储。在这种情况下,Git 会让你简单地检查主题分支。 @Alex:是的,这是意料之中的。这不涉及提交。stash
保存本地修改,然后 stash apply
将它们带回来。
我怎样才能从主分支中“摆脱”它们......保持干净?
git reset --hard HEAD
你又回到了你对主分支所做的最后一次提交。【参考方案2】:
公认的答案是最彻底的,但有一种特殊情况可以简化。如果您在工作目录中修改的文件在master
和branch123
中都相同,您可以简单地做
git checkout branch123
不需要存储任何东西,因为checkout
的默认行为是不覆盖工作目录中修改过的文件,所以你不会丢失任何东西。 (这实际上是 Cascabel 在 cmets 中首先提到的)
正如其他人在cmets中提到的,如果branch123
还不存在,你可以这样做
git checkout -b branch123
基于我发现的here。
【讨论】:
或者,如果你想创建一个新的分支,git checkout -b newbranch
这对我来说比 stash 效果更好,而且更容易。谢谢!
不,这不起作用。 Git 将向您显示此消息:“提交更改或存储它们,然后才能切换分支。”
@DegenSharew:是的,在某些情况下您是对的,即如果您在工作目录中修改的文件在master
和branch123
中不完全相同。请参阅我编辑的答案。
这对我很有用。我还没有创建分支,所以我这样做了:git checkout -b newbranchname。我的更改自行显示在该分支中。【参考方案3】:
git stash
是您所需要的。
完整的解释可以在Git-Tools-Stashing找到
【讨论】:
【参考方案4】:由于在签出文件时可以创建新分支但无法签出现有分支,因此我发现了以下使用临时分支工作的技巧:
这种情况至少适用于 VS 2015 Git 插件,但很可能适用于任何 git 工具。
-
签出并更改 master 中的文件(ups!,错误的分支)
从 master 创建一个新分支“temp”(或您选择的任何未使用的名称)。签出的文件现在将在 temp 中签出,而不是在 master 中。
签入对 temp 的更改(主文件未受影响)
现在所有内容都已签入,并且可以签出现有分支。查看想要的分支(我想要进行更改的分支)
3.5 Git 变基
将 temp 合并到想要的分支。现在更改位于正确的分支中。
删除临时分支,因为不再需要它
编辑:我发现您必须在执行合并之前执行临时分支的 rebase (git rebase --onto)。否则 master 中的更改将包含在合并中。上面的额外步骤 3.5。在此处进一步了解变基: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
【讨论】:
能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述? 感谢您的反馈。该解决方案非常简单,并且遵循与“stash”解决方案相同的原则,只是使用临时分支而不是 stash。这至少对 Visual Studio 用户来说更方便,因为 GIT 插件不支持 stash以上是关于Git - 处理错误的分支 - 如何将更改复制到现有主题分支的主要内容,如果未能解决你的问题,请参考以下文章