如何将提交从一个分支复制到另一个分支?

时间:2010-03-19 00:51:39

标签: git branching-and-merging

我的主人有两个分支:

  • v2.1 :(第2版)我已经工作了几个月
  • wss :我昨天创建的是为我的主人添加一个特定功能(在制作中)

有没有办法将昨天的提交从wss复制到v2.1?

11 个答案:

答案 0 :(得分:791)

使用

git cherry-pick <commit>

<commit>应用于当前分支

我自己可能会交叉检查我在gitk中选择的提交,然后通过右键单击提交条目来挑选它们。


如果你想更加自动化(包括所有危险)并且假设自昨天以来所有提交都发生在wss上,你可以使用git log生成提交列表(Je {--pretty建议<) / p>

git log --reverse --since=yesterday --pretty=%H

所以假设你使用bash

,一切都在一起
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

如果这里出现问题(有很多潜力)你会遇到麻烦,因为这会影响实时结账,所以要么手动挑选,要么像Jefromi建议的那样使用rebase。

答案 1 :(得分:494)

你应该有一个工作流程,让你通过合并来完成所有这些:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

所以你需要做的就是git checkout v2.1git merge wss。如果由于某种原因你真的不能这样做,并且你不能使用git rebase将你的wss分支移动到正确的位置,从某个地方获取单个提交并将其应用到其他地方的命令是{{3 }}。只需查看要应用它的分支,然后运行git cherry-pick <SHA of commit to cherry-pick>

rebase可以拯救你的一些方法:

如果您的历史记录如下:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

您可以使用git rebase --onto v2 v2-only wss将wss直接移至v2:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

然后你可以合并!如果你真的,真的,真的无法达到你可以合并的程度,你仍然可以使用rebase一次有效地做几个樱桃选择:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

注意:为了做到这一点需要额外工作的原因是它在您的存储库中创建了重复的提交。这不是一件好事 - 简单分支和合并的关键在于能够通过将提交放在一个地方并将它们合并到需要的任何地方来完成所有事情。重复提交意味着永远不会合并这两个分支的意图(如果您决定以后再进行,则会产生冲突)。

答案 2 :(得分:37)

git cherry-pick:应用一些现有提交所引入的更改

假设我们有分支( A ),该分支具有(X,Y,Z)个提交。我们需要将这些提交添加到分支 B 中。我们将使用cherry-pick操作。

使用cherry-pick时,应按与提交出现在分支 A 中的时间顺序相同的顺序,在分支 B 中添加提交。

cherry-pick确实支持一系列提交,但是如果您在该范围内进行合并提交,它将变得非常复杂

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

工作流程示例:

enter image description here

我们可以将cherry-pickoptions一起使用

-e或--edit :使用此选项,git cherry-pick将允许您在提交之前编辑提交消息。

-n或--no-commit :通常,该命令自动创建一系列提交。该标志将必要的更改应用到选择每个命名提交的工作树和索引中,而不进行任何提交。此外,使用此选项时,索引不必与HEAD提交匹配。对索引的起始状态进行了选择。

这里有一个有趣的article ,涉及cherry-pick

答案 3 :(得分:15)

您可以create a patch从要复制的提交apply the patch到目标分支。

答案 4 :(得分:9)

或者如果你在福音传道者身上少一点你可以做一些我正在使用的丑陋方式。在deploy_template中,我想要在我的主服务器上作为分支部署

进行复制
git branch deploy deploy_template
git checkout deploy
git rebase master

这将在deploy_template上创建新的分支部署(我使用-f来覆盖现有的部署分支),然后将这个新分支重新绑定到master上,而不会改变deploy_template。

答案 5 :(得分:7)

假设我已将更改提交到master分支。现在我必须去需要推送其提交的分支才能获得提交的提交id(xyz)。

单次提交ID xyx

git checkout branch-name
git cherry-pick xyz
git push origin branch-name

多个提交ID的xyz abc qwe

git checkout branch-name
git cherry-pick xyz abc qwe
git push origin branch-name

答案 6 :(得分:6)

已经提到的答案涵盖了大部分内容,但似乎缺少的一件事是 --no-commiting 的 cherry-pick 功能。

假设您在功能分支上有多个提交,并且您想将所有提交“合并”为一个提交并将它们放在您的主分支上。在这种情况下,您需要做的是:

git checkout <branch-on-which-to-add-features>
git cherry-pick --no-commit <commit-hash>
git cherry-pick --no-commit <commit-hash>
.
.
.

最后,一旦您cherry-pick完成了所有必需的功能,您就可以进行最终提交:

git commit -m "Some message for the merge commit"

理想情况下,如 @Cascabel 所述,您应该使用 mergerebase。但是,如果您觉得别无选择,则可以使用 cherry-picking。

答案 7 :(得分:1)

cherry-pick命令可以从标准输入中读取提交列表。

下面的命令cherry-picks提交由用户John创作的命令,这些命令存在于“ develop”分支中,但不存在于“ release”分支中,并按时间顺序排列。

git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin

答案 8 :(得分:1)

这是另一种方法。

git checkout {SOURCE_BRANCH}               # switch to Source branch.
git checkout {COMMIT_HASH}                 # go back to the desired commit.
git checkout -b {temp_branch}              # create a new temporary branch from {COMMIT_HASH} snapshot.
git checkout {TARGET_BRANCH}               # switch to Target branch.
git merge {temp_branch}                    # merge code to your Target branch.
git branch -d {temp_branch}                # delete the temp branch.

答案 9 :(得分:0)

对于仅将分支wss的最后一次提交复制到v2.1的简单情况,您只需获取提交ID(git log --oneline | head -n 1)并执行:

git checkout v2.1
git merge <commit>

答案 10 :(得分:0)

将提交从 wss 分支复制到 v2.1 分支

  1. git checkout wss

  2. git merge v2.1

它对我有用。