如何将我的本地未提交更改合并到另一个Git分支?
我怎么能在git中做到这一点:
我目前的分支是branch1,我做了一些本地更改。 不过,我现在意识到,我实际上是想将这些更改应用到branch2。 有没有办法来应用/合并这些更改,以使它们成为branch2上的本地更改而不在branch1上提交它们?
由于您的文件尚未在branch1
中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
正如 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
然后add
并commit
更改到这个新的分支。
警告:不适合git新手。
这在我的工作stream程中已经足够了,我几乎试图为它写一个新的git命令。 通常的git stash
stream程是要走的路, 但有点尴尬。 我通常首先做一个新的提交,因为如果我一直在看变化,所有的信息都是新鲜的我脑海中 ,最好是刚开始git commit
我发现(通常是一个错误修复属于我在工作中发现的主人在一个function分支)马上。
这也是有帮助的,如果你遇到这样的情况很多 – 要有另一个工作目录旁边你总是有
master
分支签出。
所以我如何做到这一点:
-
git commit
一个很好的提交消息的变化。 -
git reset HEAD~1
撤销当前分支的提交。 - (可选)继续处理该function。
有时以后(asynchronous),或立即在另一个terminal窗口中:
-
cd my-project-master
,这是另一个WD共享相同的.git
-
git reflog
来find我刚刚做的错误修复。 - 提交的
git cherry-pick SHA1
。
可选地(仍然是asynchronous的),您可以重新绑定(或合并)您的function分支以获取错误修正,通常在您即将提交PR时已经清理了您的function分支和WD:
-
cd my-project
,这是我正在努力的主要WD。 -
git rebase master
来获得错误修正。
这样,我可以不间断的工作,不必担心git stash
任何东西,或者必须在git checkout
之前清理我的WD(然后再次检查function分支的backout),并且仍然拥有所有的bug修复去master
而不是隐藏在我的function分支。
IMO git stash
和git 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_branch
, my_branch
在切换回my_branch
时导致不必要的合并冲突。
最后一个git stash pop
将基于原始my_branch
,所以不会导致任何合并冲突。 但是,如果你的存储包含你已经承诺掌握的未跟踪的文件,git会抱怨说“不能从存储中恢复未跟踪的文件”。 为了解决这个冲突,从你的工作树中删除这些文件,然后git stash pop
, git add .
,并git reset
。