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

时间:2009-02-17 14:02:16

标签: git branch

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

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

7 个答案:

答案 0 :(得分:852)

由于您的文件尚未在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

As commented之后的{p> benjohn(请参阅git stash man page):

  

要隐藏当前未跟踪(新添加的)文件,请添加参数-u,以便:

git stash -u

答案 1 :(得分:83)

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

git checkout branch2

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

git checkout -m branch2

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

git reset

答案 2 :(得分:11)

前面提到的藏匿方法的一个较短的替代方案是:

  

暂时将更改移至存储区。

  1. git stash
  2.   

    创建并切换到新分支,然后只需一步即可将存储区弹出。

    1. git stash branch new_branch_name
    2. 然后只需addcommit对此新分支的更改。

答案 3 :(得分:8)

警告:不适用于git newbies。

这在我的工作流程中已经足够了,我几乎试图为它编写一个新的git命令。通常的git stash流是的方式,但有点尴尬。我通常先做一个新的提交,因为如果我一直在查看更改,所有信息都是我脑海中的新鲜事而且最好只是启动git commit - 我发现的(通常)

,我在处理功能分支时发现了一个属于主人的错误修正
  

如果你遇到这样的情况很有帮助,你可以another working directory与当前的{{3}}一起检查master分支。

所以我如何实现这一点:

  1. git commit立即通过良好的提交消息进行更改。
  2. git reset HEAD~1撤消当前分支的提交。
  3. (可选)继续处理该功能。
  4. 有时候稍后(异步),或者立即在另一个终端窗口中:

    1. cd my-project-master这是另一个WD共享相同的.git
    2. git reflog找到我刚刚制作的错误修补程序。
    3. git cherry-pick SHA1提交。
    4. (可选)(仍然是异步的)您可以重新设置(或合并)您的功能分支以获取错误修正,通常在您即将提交PR并清理了您的功能分支和WD时:

      1. cd my-project这是我正在研究的主要WD。
      2. git rebase master获取错误修正。
      3. 通过这种方式,我可以不间断地继续处理该功能,而不必担心git stash任何事情或者必须在git checkout之前清理我的WD(然后检查功能分支退出)再次。)并且仍然将我的所有错误修正都转到master而不是隐藏在我的功能分支中。

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

How to Commit to a Different Branch in git

您要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中的--include-untracked选项(又名git stash -u)可以防止您稍后在git clean -f -d内执行master时丢失未跟踪的文件。

git checkout master之后,重要的是你不要git stash pop,因为你以后需要这个藏匿处。如果您弹出在my_branch中创建的存储,然后在git stash中执行master,则稍后在my_branch中应用该存储时,您将导致不必要的合并冲突。

git reset取消了由git stash apply产生的所有内容。例如,已在存储中修改但master中不存在的文件被“暂停”为“我们删除”冲突。

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

最后git stash pop将基于原始my_branch,因此不会导致任何合并冲突。但是,如果您的存储包含您已提交掌握的未跟踪文件,git会抱怨它“无法从存储中恢复未跟踪的文件”。要解决此冲突,请从工作树中删除这些文件,然后git stash popgit add .git reset

答案 6 :(得分:0)

  • 首先,Create a new branch
  • 其次,add your changes
  • 最后,commit to your changes with a beautiful message
git checkout -b branch_name
git add file_one_name file_two_name file_three_name
git commit -m commit_message