git 切换分支而不丢弃本地更改

2024-07-03

好吧,假设有一天我们碰巧做了一堆修改,当我们去提交它们时,我们注意到我们正在错误的分支上工作。

我们如何强制git切换分支不丢弃本地更改.

在等待回复时,我可能会以一种天真的方式解决这个问题,但我想知道是否有正确的程序,因为如果我说这之前没有发生在我身上,我就是在撒谎......

  • 备份更改的存储库
  • git reset --hard
  • git checkout right-branch
  • 恢复更改
  • git commit -m "changes"

有很多不同的方法,具体取决于您的进度以及您希望它们位于哪个分支。

我们来看看一个经典错误:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

所以现在你想要这些改变,但你还没有承诺master,要在develop.

  1. If you 没有 a develop然而,该方法很简单:

    $ git checkout -b develop
    

    这创建了一个新的develop分支从你所在的地方开始 现在。现在你可以提交了,新的东西都已经上线了develop.

  2. You do have a develop。看看 Git 是否会让你不用切换 做任何事情:

    $ git checkout develop
    

    这要么成功,要么抱怨。如果成功了,那就太好了!只是 犯罪。如果不 (error: Your local changes to the following files would be overwritten ...), you still有很多选择。

    The easiest is probably git stash (as all the other answer-ers that beat me to clicking post said). Run git stash save or git stash push,1 or just plain git stash which is short for save / push:

    $ git stash
    

    这会使用以下命令提交您的代码(是的,它确实进行了一些提交) 一种奇怪的非分支方法。它所做的提交不在任何“上” 分支,但现在已安全地存储在存储库中,因此您现在可以 切换分支,然后“应用”存储:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    如果一切顺利,并且您喜欢结果,那么您应该git stash drop藏匿处。这会删除对奇怪的非分支提交的引用。 (它们仍然在存储库中,有时可以在紧急情况下检索,但对于大多数目的,您应该认为它们此时已消失。)

The apply步骤使用 Git 强大的底层合并机制来合并隐藏的更改,这与进行分支合并时使用的功能相同。这意味着如果您错误地处理的分支与您想要处理的分支有很大不同,您可能会遇到“合并冲突”。所以这是一个好主意仔细检查结果在你假设隐藏物应用干净之前,即使 Git 本身没有检测到任何合并冲突。

很多人都用git stash pop,这是git stash apply && git stash drop。就目前而言,这很好,但这意味着,如果应用程序导致混乱,并且您决定不想沿着这条路继续下去,那么您将无法轻松取回隐藏的内容。这就是为什么我建议单独apply,检查结果,drop仅当/当满意时。 (当然,这确实引入了另一点,您可以再喝杯咖啡休息一下,忘记自己在做什么,回来做wrong的事情,所以这不是一个完美的治疗方法。)


1The save in git stash save is the old verb for creating a new stash. Git version 2.13 introduced the new verb to make things more consistent with pop and to add more options to the creation command. Git version 2.16 formally deprecated the old verb (though it still works in Git 2.23, which is the latest release at the time I am editing this).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git 切换分支而不丢弃本地更改 的相关文章

  • git rebase -i --retain-empty-commits

    默认情况下 当您使用git rebase i它注释掉了空提交 我必须取消注释它们 它们对我有帮助 rebase 命令是否有一个选项可以防止这种我不想保留它们的不必要的假设 好吧 这比预期的要容易 git rebase i keep empt
  • 构建、部署、配置和回滚所需的 Jenkins 指南,保留 5 个版本

    我对詹金斯很陌生 有一定的了解 但需要进一步的指导 我在 Git 存储库上有一个 PHP 应用程序 它使用 Composer 具有资产 具有用户上传的媒体文件 使用 Memcache Redis 具有一些代理 工作人员 并且具有迁移文件 到
  • Git - 如何列出两次之间主分支上更改的所有文件? [复制]

    这个问题在这里已经有答案了 我想找出两个日期之间在主分支 或与此相关的任何一个分支 上修改的所有文件 我明白了 从这篇文章 如何仅列出两次提交之间更改的文件名 https stackoverflow com questions 155234
  • Git 合并顺序有何不同?

    有什么区别吗 git merge c1 c2 and git merge c2 c1 另外 两者之间有什么区别吗 git checkout c1 git merge c2 and git checkout c2 git merge c1 在
  • 显示按日期排序的 git 标签

    如何列出git标签按时间顺序排列 首先是最近的标签 git tag只显示字母顺序 正确答案是 git tag sort taggerdate taggerdate是适当的字段 根据git 标签手册页 https git scm com do
  • 如何在不丢失 Git 中上次提交的情况下返回到上一个提交?

    这就是我想做的 我想回到之前的 2 个提交 也许将该提交中更改的文件作为新的提交返回 但我不想失去最后一次提交 我上次提交的代码中有一些错误 但我想暂时保留该错误 我读过一些文档 但没有一个文档清楚地说明了当你重置头部时会发生什么 例如 您
  • 如何将裸仓库分支推送到另一个远程?

    我正在使用分散式工作流程 Central Fork 有时 我想快速转发我的分支上的所有远程分支 以及中央存储库上相应分支的最新更改 我已经创建了我的中央存储库的第二个克隆 它只是一个裸版本 与一个单一的git push命令 是否可以将所有分
  • Windows 版 Git - 每次推送时都要求输入 SSH 密码

    我今天安装了 Windows 版 git 并做了一些测试 我发现每次推送时都会要求我输入密码 Linux 上不会发生这种情况 我对另一个线程提出了一些建议 我发现我没有配置 ssh agent 但我这样做了 问题仍然存在 有什么建议吗 谢谢
  • Git-Flow 撤消已完成的功能分支

    如果您想 撤消 功能分支 您有哪些选择 假设您添加了一项新功能supercool feature您完成后 合并到开发中并删除功能分支 然后进入发布版本 但你的用户真的不喜欢这个supercool feature 我如何撤消 倒回 反转这个已
  • 从 git 安装时,我可以强制 pip 进行浅表签出吗?

    以下命令从 git 存储库安装 Python 包 pip install git ssh email protected cdn cgi l email protection username repo git Collecting git
  • 如果 git-am 失败并显示“索引中不存在”怎么办?

    我有一个补丁 当我尝试使用 git am 应用它时 它会给出以下输出 Checking patch old filename error old filename does not exist in index 在补丁中 旧 文件名实际上已
  • 如何退出git中的提交编辑消息?

    我通常通过输入来提交git commit m initial 默认情况下 GNU nano 编辑器是 ubuntu Gnome 19 04 上 git config editor 中的选择 我不小心提交了我的更改输入git commit输入
  • git:如何添加自定义合并策略?

    我正在尝试添加类似于此问题中的自定义合并策略 Git 合并冲突以始终获取最新文件 https stackoverflow com questions 7607125 git merge conflict to always take the
  • 在 git 项目中创建子模块

    我有一个 Django 项目 它当前托管在 GitHub 上并且是私有的 我希望将其许多有用的部分转移到一个开源项目中 我想我需要使用 子模块 但不幸的是我不知道如何操作它们 请有人帮助我 Joe 将其许多有用的部分移至开源项目中 这意味着
  • git 切换分支而不丢弃本地更改

    好吧 假设有一天我们碰巧做了一堆修改 当我们去提交它们时 我们注意到我们正在错误的分支上工作 我们如何强制git切换分支不丢弃本地更改 在等待回复时 我可能会以一种天真的方式解决这个问题 但我想知道是否有正确的程序 因为如果我说这之前没有发
  • 删除远程master分支,由于是当前分支而被拒绝

    如何从 GitHub Bitbucket 删除远程主分支 我想 git push bb delete master remote bb acl user is allowed accepted payload K remote error
  • .gitattributes 文件对于 git 真的有必要吗?

    我最近读了一些关于 gitattributes 的文章 也发现了像这样的地方 https github com alexkaratarakis gitattributes https github com alexkaratarakis g
  • git diff:--cached 和 --staged 之间有什么区别

    要将分阶段与上次提交进行比较 git diff cached git diff staged 两个命令生成相同的结果 对吧 的文档git diff says staged是 的同义词 cached 所以是的
  • 在 git Push 上硬重置

    我有一个接收后挂钩脚本位于我正在推送的远程存储库上 该脚本执行以下操作git reset hard 像这样的东西 git push opal Counting objects 74 done Delta compression using
  • TortoiseGit / Winforms:合并时解析 Resource.resx

    我对 TortoiseGit 还很陌生 想知道如果 resx 文件发生冲突 如何在合并过程中解决它 例如 我可以从菜单中选择 使用他们的 尝试进行拉动和推动 但这是正确的方法吗 我可以以某种方式使用他们的并通过我的项目更改重建它吗 差异 以

随机推荐