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

我怎么能在git中做到这一点:

我目前的分支是branch1,我做了一些本地更改。 不过,我现在意识到,我实际上是想将这些更改应用到branch2。 有没有办法来应用/合并这些更改,以使它们成为branch2上的本地更改而不在branch1上提交它们?

由于您的文件尚未在branch1branch1

 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 

正如 benjohn所说 (见git stash手册页 ):

还要隐藏未跟踪的(新添加的)文件,添加参数-u ,所以:

 git stash -u 

存储,临时提交和重新分​​配可能都是过度的。 如果您还没有将已更改的文件添加到索引,那么您可能只能检出其他分支。

 git checkout branch2 

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

 git checkout -m branch2 

如果您已经对索引添加了更改,那么您首先需要重置撤销这些更改。 (这将保留您的工作副本,它只会删除上演的变化。)

 git reset 

这是一个较短的替代scheme,前面提到的隐藏方法:

暂时将更改移动到一个藏匿处。

git stash

创build并切换到一个新的分支,然后popup隐藏到一步。

git stash branch new_branch_name

然后addcommit更改到这个新的分支。

警告:不适合git新手。

这在我的工作stream程中已经足够了,我几乎试图为它写一个新的git命令。 通常的git stashstream程是要走的路, 有点尴尬。 我通常首先做一个新的提交,因为如果我一直在看变化,所有的信息都是新鲜的我脑海中 ,最好是刚开始git commit我发现(通常是一个错误修复属于我在工作中发现的主人在一个function分支)马上。

这也是有帮助的,如果你遇到这样的情况很多 – 要有另一个工作目录旁边你总是有master分支签出。

所以我如何做到这一点:

  1. git commit一个很好的提交消息的变化。
  2. git reset HEAD~1撤销当前分支的提交。
  3. (可选)继续处理该function。

有时以后(asynchronous),或立即在另一个terminal窗口中:

  1. cd my-project-master ,这是另一个WD共享相同的.git
  2. git reflog来find我刚刚做的错误修复。
  3. 提交的git cherry-pick SHA1

可选地(仍然是asynchronous的),您可以重新绑定(或合并)您的function分支以获取错误修正,通常在您即将提交PR时已经清理了您的function分支和WD:

  1. cd my-project ,这是我正在努力的主要WD。
  2. git rebase master来获得错误修正。

这样,我可以不间断的工作,不必担心git stash任何东西,或者必须在git checkout之前清理我的WD(然后再次检查function分支的backout),并且仍然拥有所有的bug修复去master而不是隐藏在我的function分支。

IMO git stashgit checkout是一个真正的PIA,当你正在处理某个大特性的时候。

如果是关于承诺的变更,你应该看看git-rebase,但正如VonC所指出的那样,当你谈论本地变更时,git-stash肯定会是这样做的好方法。

到目前为止所给出的答案并不理想,因为它们需要很多不必要的工作来解决合并冲突,或者做出了太多假设,而这些假设往往是错误的。 这是如何做到完美。 链接是我自己的网站。

如何在git中提交不同的分支

您在my_branch上有my_branch更改,您希望提交给master ,而不必提交my_branch所有更改。

 git merge master git stash -u git checkout master git stash apply git reset git add example.js git commit git checkout . git clean -f -d git checkout my_branch git merge master git stash pop 

说明

首先将master合并到你的分支,因为无论如何你都必须这样做,现在是解决冲突的最佳时机。

-u选项(aka --include-untracked )在git stash -u可以防止当你以后在master执行git clean -f -d时丢失未跟踪的文件。

git checkout master ,重要的一点是你不要git stash pop ,因为你以后需要这个存储。 如果popup在my_branch创build的存储,然后在master执行git stash ,那么稍后在my_branch应用该存储时,将导致不必要的合并冲突。

git reset搁置一切从git stash apply 。 例如,已经在存储器中被修改但在master不存在的文件被暂存为“被我们删除”的冲突。

git checkout . git clean -f -d丢弃所有未提交的内容:所有跟踪文件的变化以及所有未跟踪的文件和目录。 它们已经被保存在存储器中,如果留在master my_branchmy_branch在切换回my_branch时导致不必要的合并冲突。

最后一个git stash pop将基于原始my_branch ,所以不会导致任何合并冲突。 但是,如果你的存储包含你已经承诺掌握的未跟踪的文件,git会抱怨说“不能从存储中恢复未跟踪的文件”。 为了解决这个冲突,从你的工作树中删除这些文件,然后git stash popgit add . ,并git reset