如何将我当前的更改提交到 Git 中的不同分支 [重复]

Posted

技术标签:

【中文标题】如何将我当前的更改提交到 Git 中的不同分支 [重复]【英文标题】:How to commit my current changes to a different branch in Git [duplicate] 【发布时间】:2011-02-26 00:46:40 【问题描述】:

有时我会在我的工作目录中进行一些更改,并且我意识到这些更改应该提交到与当前分支不同的分支中。这通常发生在我想尝试新事物或做一些测试并且我忘记事先创建一个新分支,但我不想将脏代码提交到主分支时。

那么,我怎样才能将未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?

【问题讨论】:

【参考方案1】:

您可以创建一个新分支并切换到它。然后提交您的更改:

git branch dirty
git checkout dirty
// And your commit follows ...

或者,您也可以签出现有分支(只需 git checkout <name>)。但前提是没有冲突(所有已编辑文件的基础与当前分支中的相同)。否则你会收到一条消息。

请注意,在切换到现有分歧分支的情况下,您可以使用 -m 选项告诉 git 尝试合并更改,即git checkout -m <name>

【讨论】:

注意在切换到existing divergent分支的情况下可以使用-m选项告诉git尝试合并更改,即git checkout -m <name> @Jefromi 的答案在我认为的几乎所有情况下都更好。 短版:git checkout -b dirty @user815423426:如果您编辑文件但不提交,您将无法签出未提交(或之前已删除)文件的分支。 Git 将中止:错误:您对以下文件的本地更改将被结帐覆盖:... 当您提交新分支时,这确实是更好的答案。 stash 删除你上演的内容;这种方法没有。【参考方案2】:

建议签出另一个分支然后提交到它的其他答案仅在考虑到本地修改的情况下可以签出时才有效。如果不是,您是git stash 的最常见用例:

git stash
git checkout other-branch
git stash pop

第一个 stash 隐藏您的更改(基本上是临时提交),随后的 stash pop 重新应用它们。这让 Git 可以使用它的合并功能。

如果,当您尝试弹出存储时,您遇到了合并冲突......下一步取决于这些冲突是什么。如果所有隐藏的更改确实属于另一个分支,那么您只需对它们进行排序 - 这是在错误分支上进行更改的结果。

另一方面,如果你真的搞砸了,并且你的工作树混合了两个分支的更改,并且冲突只是在你想要提交回原始分支的那些,你可以节省一些工作。像往常一样,有很多方法可以做到这一点。这是一个,从你弹出并看到冲突开始:

# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset

# Add the things you *do* want to commit here
git add -p     # or maybe git add -i
git commit

# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop

# Add the changes meant for this branch
git add -p
git commit

# And throw away the rest
git reset --hard

或者,如果您提前意识到这将发生,只需提交属于当前分支的内容即可。您可以随时返回并修改该提交:

git add -p
git commit
git stash
git checkout other-branch
git stash pop

当然,请记住,这一切都需要一些工作,下次避免它,也许可以通过将 $(__git_ps1) 添加到您的 PS1 环境变量中的 bashrc文件。 (例如参见Git in Bash 文档。)

【讨论】:

当你说:Checking out the branch and then committing would only work if the checkout is possible given the local modifications。你的意思是?你介意给出/讨论一个失败的简单例子吗? @user815423426 如果您有未提交的更改,当且仅当您更改的文件集和两个分支之间不同的文件集不相交时,您可以签出另一个分支。也就是说,如果您修改了文件 A,则只有当两个分支中的文件 A 相同时,您才能签出另一个分支。 谢谢!当您说 A 在两个分支中相同时,您的意思是 A 在我的更改之前(即每个分支的 HEAD 中的 A)。对吗? 如果工作树中还有其他更改,则此答案的效果很差,这些更改无法干净地卸载到我需要提交更改的分支上。 @Alex 如果您不能干净地取消存储,那是不可避免的合并冲突,这是基于错误分支进行更改的结果。 Git 无法为您神奇地解决它们。【参考方案3】:
    git checkout my_other_branch git add my_file my_other_file git commit -m

并提供您的提交信息。

【讨论】:

你可能想写出 coci 是什么......虽然你可以猜到(结帐,提交)^^ @tanascius 很好的建议,完成了。我已经使用别名很久了,我忘了它们不是默认的。

以上是关于如何将我当前的更改提交到 Git 中的不同分支 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何运行 git log 以仅查看特定分支的更改?

如何将我的 git 分支恢复到指定的提交?

Git - 处理错误的分支 - 如何将更改复制到现有主题分支

是否可以修复 git 中的旧提交? [复制]

Git:将提交合并到不同的分支

git stash -> 将隐藏的更改与当前更改合并