【问题标题】:Git merging unpushed changes from one local branch to another - have i screwed up?Git 将未推送的更改从一个本地分支合并到另一个分支 - 我搞砸了吗?
【发布时间】:2021-09-18 16:59:31
【问题描述】:

我是一名 Git 新用户,我使用 SVN 多年,刚刚进行了切换。

我将尝试使用正确的“Git 语言”进行总结: 我是否可以安全地将未推送(即仅提交)的更改从一个本地分支合并到另一个分支,然后将这些提交推送到新分支,以便将提交从一个本地分支移动到另一个?

案例:

有 2 个开发分支,分别称为 source_branch 和 dest_branch。 source_branch 是多个工程师正在开发的主要开发分支。 dest_branch 是一个只有我的更改的分支。两者都是从 master 独立分支的。我在 dest_branch 上做了一些工作,提交并推回远程 dest_branch。然后我切换到 source_branch,进行了一些更改,在本地提交,但没有将它们推回远程 source_branch。然后很明显,我的改变比我想象的要复杂。我不再想在 source_branch 上工作,也不想将任何东西推送到远程 source_branch。我将 source_branch 的本地副本合并到 dest_branch 以尝试“移动”提交。这是一个坏主意吗?我应该做些不同的事情吗?当我尝试删除 source_branch 的本地副本时,我收到以下消息:

警告:不删除尚未合并到的分支“source_branch” '/origin/source_branch',即使它已合并到 HEAD。 错误:分支“source_branch”未完全合并。

我明白这意味着什么 - 但我不确定这是否会在以后再次咬我?

【问题讨论】:

标签: git merge commit


【解决方案1】:

我将 source_branch 的本地副本合并到 dest_branch 以尝试“移动”提交。这是个坏主意吗?

是的。如果您在分支 A 上提交并意识到您希望它们是在分支 B 上进行的,那么合并是完全错误的事情。它不会移动任何提交,并且会以不合需要的方式更改拓扑。

您的第一步应该是撤消合并。进入分支 B 并在合并之前硬重置提交,擦除合并提交。

现在你可以用正确的方式来做。仍然在分支 B 上,挑选应该在分支 B 上的提交。这会复制提交。现在切换到分支 A 并在不需要的提交之前重新设置,将它们从分支 A 中删除。

【讨论】:

    【解决方案2】:

    如果您合并到 dest_branch 或为此更改创建了另一个分支,它将记录在您本地的 Git 历史记录中。当您将该分支推送到原点时,其他人也可以访问它。在任何一种情况下,都不需要在source_branch 上进行更改。假设其他人会在某个时候更新source_branch,最好不要有本地提交。 一旦您的更改安全,您可以使用

    进行清理
    git checkout source_branch
    git reset --hard origin/source_branch
    

    小心:以上是破坏性命令,因此请确保将更改保存在其他地方!

    请注意,您的合并将在历史记录中留下可能被视为不干净的合并提交。为避免这种情况,您可以挑选或重新设置dest_branch

    【讨论】:

    • 这已经奏效,我可以在历史记录中看到我的提交现在在 dest_branch 上,并且我在 source_branch 上没有未完成的提交。谢谢。 “请注意,您的合并将在历史记录中留下一个可能被视为不干净的合并提交”......这里的不干净到底是什么意思?
    • 有多种方法可以将提交从一个分支移动到另一个分支。合并通常会留下一个合并提交(带有空差异)来记录此操作,尽管它可能不是必需的,并且有些人认为它会用不需要的信息污染或混乱历史。如果它困扰你,有git log --no-merges 隐藏它。
    猜你喜欢
    • 2022-11-15
    • 2015-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2022-08-17
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多