协慌网

登录 贡献 社区

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

我的主人有两个分支:

  • v2.1 :(版本 2)我已经工作了几个月
  • wss :我昨天创建的,旨在向我的母版添加一个特定功能(正在生产中)

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

答案

git cherry-pick <commit>

<commit>应用于当前分支

我本人可能会交叉检查我在gitk选择的提交,并通过右键单击那里的提交条目来选择它们。


如果您想更加自动化(有其所有危险),并假设自昨天以来所有提交都发生在 wss 上,则可以使用git log生成提交列表( --pretty建议使用 --pretty)

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。

您实际上应该有一个工作流,可以通过合并来完成所有工作:

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

因此,您要做的就是git checkout v2.1git merge wss 。如果由于某种原因您确实无法执行此操作,并且无法使用git rebase将 wss 分支移至正确的位置,则从某个地方获取单个提交并将其应用于其他地方的命令是git cherry-pick 。只需签出您要应用它的分支,然后运行git cherry-pick <SHA of commit to cherry-pick>

重新设置基准的某些方法可以为您节省:

如果您的历史记录如下所示:

- 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)

然后,您可以合并!如果你真的,真的,真的不能去的地步,你可以合并,你仍然可以使用底垫中来一次切实做好几个樱桃挑选:

# 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

注意:之所以需要做一些额外的工作,是因为它正在您的存储库中创建重复的提交。这确实不是一件好事 - 轻松进行分支和合并的全部目的是能够通过将提交放在一个地方并将其合并到需要的地方来完成所有工作。重复提交意味着永远不要合并这两个分支(如果您决定以后再合并,则会产生冲突)。

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

工作流程示例:

在此处输入图片说明

我们可以在选项中cherry-pick

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

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

这是一篇有关cherry-pick的有趣文章。