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

我有两个分支从我的主人:

  • v2.1 :(版本2)我已经工作了好几个月了
  • wss :我昨天创build了一个特定的function添加到我的主人(在生产中)

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

你应该真的有一个工作stream程,可以让你通过合并来完成这一切:

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

一些rebase的方式可能会为您节省:

如果您的历史logging如下所示:

 - 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来有效地做好几个select:

 # 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 

注意:为了做到这一点需要额外的工作,是因为它在你的仓库中创build了重复的提交。 这不是一件好事 – 容易分支和合并的关键就是能够通过提交一个地方并将它们合并到任何需要的位置来完成所有工作。 重复的提交意味着一个意图永远不会合并这两个分支(如果你决定以后,你会得到冲突)。

使用

 git cherry-pick <commit> 

<commit>到您当前的分支

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


如果你想更自动化( --pretty ),并假设自从昨天发生所有提交发生在wss上,你可以使用git log ( – --prettybuild议的–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所build议的那样使用rebase。

您可以从要复制的提交中创build一个修补程序 ,并将该修补程序应用于目标分支。

或者,如果你在传道者身边less一点你可以做一个有点难看的方式,我正在使用。 在deploy_template中有我想作为分支部署在我的主人复制的提交

 git branch deploy deploy_template git checkout deploy git rebase master 

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