个人主人有两个分支: html
有没有办法将昨天的提交从wss复制到v2.1? git
您能够从要复制的提交中建立补丁 , 并将补丁应用于目标分支。 bash
你应该有一个工做流程,让你经过合并完成全部这些: spa
- x - x - x (v2) - x - x - x (v2.1) \ x - x - x (wss)
因此你要作的就是git checkout v2.1
和git merge wss
。 若是因为某种缘由你真的不能这样作,而且你不能使用git rebase将你的wss分支移动到正确的位置,从某个地方获取单个提交并将其应用到别处的命令就是git cherry-pick 。 只需查看要应用它的分支,而后运行git cherry-pick <SHA of commit to cherry-pick>
。 .net
rebase能够为您节省的一些方法: code
若是您的历史记录以下: htm
- 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: blog
- 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
注意:为了作到这一点须要额外工做的缘由是它在您的存储库中建立了重复的提交。 这不是一件好事 - 简单分支和合并的关键在于可以经过将提交放在一个地方并将它们合并到须要的任何地方来完成全部事情。 重复提交意味着永远不会合并这两个分支的意图(若是您决定之后再进行,则会产生冲突)。 get
使用
git cherry-pick <commit>
将<commit>
应用于当前分支 。
我本身可能会交叉检查我在gitk
选择的gitk
,而后经过右键单击提交条目来选择它们。
若是你想更自动化(带有全部危险)并假设自昨天以来全部提交都发生在wss上你可使用git log
生成提交列表( --pretty
由Jefromi建议的--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。
对于将最后一次提交从分支wss复制到v2.1的简单状况,你能够简单地获取提交id( git log --oneline | head -n 1
)并执行:
git checkout v2.1 git merge <commit>
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提交匹配。 樱桃选择是针对索引的开始状态完成的。