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

How do I merge my local uncommitted changes into another Git branch?

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

我当前的分支是Branch1,我做了一些本地更改。然而,我现在意识到我实际上打算将这些更改应用到Branch2。有没有一种方法可以应用/合并这些更改,使它们成为Branch2上的本地更改而不在Branch1上提交它们?


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

1
2
3
git stash
git checkout branch2
git stash pop

1
2
3
4
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手册页):

To also stash currently untracked (newly added) files, add the argument -u, so:

1
git stash -u


藏匿、临时承诺和重新平衡可能都是多余的。如果您还没有将更改后的文件添加到索引中,那么您可以只签出另一个分支。

1
git checkout branch2

只要您正在编辑的文件在Branch1和Branch2之间不存在差异,这将起作用。它将使您留在Branch2上,并保留工作更改。如果它们不同,则可以指定要将本地更改与通过将分支与-m选项切换到签出而引入的更改合并。

1
git checkout -m branch2

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

1
git reset


与先前提到的库存方法相比,较短的替代方法是:

Temporarily move the changes to a stash.

  • git stash
  • Create and switch to a new branch and then pop the stash to it in just one step.

  • git stash branch new_branch_name
  • 然后,只有addcommit对这个新分支进行了更改。


    (P)警告:不是为了吉特·纽斯(p)(P)This comes up enough in my worklow that I've almost tried to write a new git command for it.通常的EDOCX1音标0-音符是通往去的路,但它是一个小Awkward。I usually make a new commit since I have been looking at the changes,all the information i s fresh in my mind and it's better to just start EDOCX1 individual 1-ing what i found(usually a bugfix belonging on master that I discover while working on a feature branch)right away.(p)布尔奇1(P)So how I achieve this goes like this:(p)

  • EDOCX1:The changes right away with a good commit message.
  • EDOCX1 3 Ondo the commit from Current Branch.
  • (optional)continue working on the feature.
  • (P)有时晚期(Asynchronously),或当下在另一个终点窗:(p)

  • 是另一首诗
  • EDOCX1 6 to find the bugfix I've just made.
  • EDOCX1:承诺书7
  • (P)Optimonally(still asynchronous)You can they redase(or merge)your feature branch to get the bugfix,usually when you are about to submit a PR and have cleaned your feature branch and WD already:(p)

  • EDOCX1 8,which is the main WD I'm working on.
  • EDOCX1 9极致的找到猫头鹰
  • (P)This way I can keep working on the feature unienterprupted and not have to worry about EDOCX1 universal 0-ing anything or having to clean my WD before a EDOCX1 original 11(and then having the check the feature branch back again)and still have all my bugfixes goes to EDOCX1 12-instead of hidden in my feature branch.(p)(P)IMO EDOCX1的英文字母0和EDOCX1是一个真正的PIA,当你在工作的中间关于一些大的Feature。(p)


    如果是关于承诺的变更,您应该看看Git-Rebase,但是正如VONC在评论中指出的,当您谈论本地变更时,Git-Stash无疑是实现这一点的好方法。


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

    如何提交到Git中的其他分支

    您在my_branch上有未提交的更改,您希望提交给master,而不提交来自my_branch的所有更改。

    例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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合并到您的分支中,因为您最终必须这样做,现在是解决任何冲突的最佳时机。

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

    git checkout master之后,重要的是你不能在git stash pop之后,因为你以后需要这个藏身处。如果你打开在my_branch中创建的藏匿,然后在master中执行git stash,当你以后在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