如何将本地未提交的更改合并到另一个 Git 分支?

Posted

技术标签:

【中文标题】如何将本地未提交的更改合并到另一个 Git 分支?【英文标题】:How do I merge my local uncommitted changes into another Git branch? 【发布时间】:2010-10-08 02:25:15 【问题描述】:

如何在 Git 中执行以下操作?

我当前的分支是 branch1,我做了一些本地更改。但是,我现在意识到我实际上打算将这些更改应用到 branch2。有没有办法应用/合并这些更改,以便它们成为分支 2 上的本地更改,而无需在分支 1 上提交它们?

【问题讨论】:

在 SO 上有一个很棒的 Git 教程here。它是所有关于堆栈溢出的 git 问题的中心。 由于 *** 的魔法,这个链接存在于右侧的“链接”问题集中,但我认为它值得一个评论链接:另见 Move existing, uncommitted work to a new branch in Git。 【参考方案1】:

由于您的文件尚未在branch1 中提交:

git stash
git checkout branch2
git stash pop

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

以上是rbento的answer的更长更明确的版本:

git stash
git stash branch branch2

它使用:

git stash branch <branchname> [<stash>]

从最初创建 <stash> 的提交开始,创建并签出一个名为 <branchname> 的新分支, 将<stash> 中记录的更改应用到新的工作树和索引。

如果成功,并且<stash>stash@<revision> 形式的引用,则删除<stash>

如果您运行 git stash push 的分支发生了足够大的变化,以至于 git stash apply 由于冲突而失败,这将非常有用。 由于 stash 条目应用在运行 git stash 时为 HEAD 的提交之上,因此它恢复了最初的隐藏状态,没有冲突。


As commentedbenjohn(见git stash man page):

要同时存储当前未跟踪(新添加的)文件,请添加参数-u,因此:

git stash -u

【讨论】:

不客气。 unethicalblogger.com/posts/2008/11/… 的更多存储使用示例。 如果您正在寻找使用 TFS 的相同问题的解决方案,等效的解决方案是搁置您的更改,然后使用 TFS Power Tools 使用 /migrate 开关取消搁置到正确的分支。跨度> 这对我有用。但是,我还必须为“stash pop”创建一个本地分支才能工作。如果您遇到类似情况,请查看***.com/questions/1783405/git-checkout-remote-branch。 要同时存储当前未跟踪的(新添加的)文件,添加参数-u,即:git stash -u @Benjohn 好点。我已将您的评论包含在答案中以提高知名度。【参考方案2】:

存储、临时提交和变基可能都过大了。如果您还没有将更改后的文件添加到索引中,那么您可以只签出另一个分支。

git checkout branch2

只要您正在编辑的文件在分支 1 和分支 2 之间没有不同,这将起作用。它会将您留在 branch2 上,并保留您的工作更改。如果它们不同,那么您可以指定要将本地更改与通过使用-m 结帐选项切换分支引入的更改合并。

git checkout -m branch2

如果您对索引添加了更改,那么您需要先通过重置来撤消这些更改。 (这将保留您的工作副本,它只会删除分阶段的更改。)

git reset

【讨论】:

我认为存储“更简单”以某种方式理解,但您的方法更好地考虑跨不同分支的工作目录。 +1 简单的传统结帐似乎更适合手头的问题。 checkout 的重量更轻,它只是更新需要更改的文件。也许更容易理解 stash 方法,或者可能只是在这个用例中结帐是“安全”的还不够明显。 如果checkout -m 在某些情况下不是“安全的”(可能会导致合并冲突),那么 stash 会提供任何优势(例如,您可以取消弹出 stash pop)吗? @craigMcQueen 你不能取消弹出一个弹出的存储,但是当你弹出它时,存储会抱怨冲突。您可以修复冲突然后提交,但在这种情况下,原始存储仍然在堆栈上! :) 如果发生合并冲突,文件不是备份为.orig吗?【参考方案3】:

接受答案的更简短的替代方法是:

暂时将更改移动到存储区。

    git stash

创建并切换到一个新分支,然后只需一步将 stash 弹出到它。

    git stash branch new_branch_name

然后只需 addcommit 对这个新分支进行更改。

【讨论】:

【参考方案4】:

警告:不适合 git 新手。

这在我的工作流程中出现得足够多,以至于我几乎尝试为它编写一个新的 git 命令。通常的git stash 流程是要走的路有点尴尬。我通常首先进行新的提交,因为如果我一直在查看更改,所有信息在我脑海中都是新鲜的,最好从git commit-ing 我发现的内容开始(通常是一个错误修复属于我在功能分支上工作时发现的master)。

如果您经常遇到这样的情况,将another working directory 与您当前始终签出master 分支的分支放在一起也很有帮助。

所以我是这样实现的:

    git commit 立即通过良好的提交消息进行更改。 git reset HEAD~1 撤消当前分支的提交。 (可选)继续开发该功能。

有时稍后(异步),或立即在另一个终端窗口中:

    cd my-project-master 是另一个共享相同 .git 的 WD git reflog 找到我刚刚做的错误修复。 提交的git cherry-pick SHA1

您可以选择(仍然是异步的)然后重新设置(或合并)您的功能分支以获得错误修复,通常是在您即将提交 PR 并且已经清理您的功能分支和 WD 时:

    cd my-project 这是我正在开发的主要 WD。​​li> git rebase master 获取错误修正。

这样我可以不间断地继续使用该功能,而不必担心git stash-ing 任何事情或必须在git checkout 之前清理我的WD(然后再次检查功能分支退出。)和仍然有我所有的错误修复都转到master,而不是隐藏在我的功能分支中。

IMO git stashgit checkout 是真正的 PIA,当您正在开发一些重要功能时。

【讨论】:

我的答案的有趣且有效的替代方案。 +1 你来自 mercurial 吗? my-project-master 共享相同的 .git 听起来很像。为什么不git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard,然后稍后(异步)在mastergit cherry-pick <SHA1 of the commit(s) in bugfixABC 上? (甚至,为了避免必须从您当前所在的任何分支中找出 SHA1,git rebase --onto master feature bugfixABC。这意味着您可以在上面的 git reset 之后直接执行此操作,而在 feature 上。) 但是,OP 听起来他们还没有准备好提交更改,在这种情况下,checkout -m 更好。【参考方案5】:

如果是关于提交的更改,你应该看看 git-rebase,但正如 VonC 在评论中指出的那样,当你谈论本地更改时,git-stash 肯定是做到这一点的好方法.

【讨论】:

我不明白这个解决方案:它会从 branch1 重写 branch2 的提交历史......为什么当我们只想获取 branch1 的本地未提交更改时,从 branch2 获取所有已提交的更改分支2 ?... @VonC :同意,在这种情况下,rebase 获取自上次分支之间合并到 branch1 以来所有已提交的更改。一开始我没有得到这个问题的“未提交”参数。 rebase 不是一个好的答案。 @claferri: pfew...我开始头疼了 ;) 我会否决你的答案,但由于我自己发表了一个,所以存在“明显的利益冲突”。有了您更新的帖子,我现在根本不必投票。谢谢:) @VonC : 下次,只要我的回答和这个一样错,请随意投反对票;)【参考方案6】:

这些是我遵循的步骤:

git 克隆 link cd repo 文件夹

您可以检查状态以及您正在使用的分支:

git 状态 git 分支 git 分支-a

注意:如果您在移动到新分支之前在本地存储库中进行了更改,则以下步骤应该仍然有效。

如果“git branch”显示master,并且你想创建+移动到另一个分支:

git checkout -b 分支名称

使用“git branch”再次检查分支 它现在应该表明您在新分支中。

现在添加、提交和推送:

git 添加。 git commit -m "新增分支" git push origin 分支名称

上述步骤适用于我在移动到新的本地分支之前进行更改或在移动到新分支之后进行更改的情况。 我希望它可以帮助遇到类似情况的人。

【讨论】:

以上是关于如何将本地未提交的更改合并到另一个 Git 分支?的主要内容,如果未能解决你的问题,请参考以下文章

git远程存储库包含未合并到本地分支的提交

如何将多个提交合并到另一个分支上作为单个压缩提交?

Git - 如何合并功能分支,但排除一些提交?

我是否可以拉出远程Git存储库并获得远程(未提交的)工作更改?

IDEA中Git分支未push的变更集如何合并到另一个分支

Git:如何防止特定的提交被合并到另一个分支中?