我从我主人那里得到了两个分支:

v2.1:(版本2)我已经做了几个月了 wss:我昨天创建了一个特定的功能添加到我的master(在生产中)

有没有办法将昨天的提交从wss复制到v2.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.

其他回答

对于从分支wss复制最后一次提交到v2.1的简单情况,你可以简单地获取提交id (git log——oneline | head -n 1),然后执行:

git checkout v2.1
git merge <commit>

或者如果你不太站在福音派这边你可以用我用的丑陋的方法。在deploy_template中,有一些提交需要作为分支部署复制到主节点上

git branch deploy deploy_template
git checkout deploy
git rebase master

这将在deploy_template上创建新的分支deploy(我使用-f来覆盖现有的deploy分支),然后将这个新分支重新基于master,不改变deploy_template。

Use

git cherry-pick <commit>

将<commit>应用到当前分支。

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


如果你想更加自动化(尽管有危险),并且假设所有的提交都发生在昨天的wss上,你可以使用git log生成提交列表(由Jefromi建议)

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.1和git merge wss。如果出于某种原因你真的不能这样做,你不能使用git rebase将你的wss分支移动到正确的位置,从某个地方获取一个提交并应用到其他地方的命令是git的精选。只需签出你想要应用它的分支,并运行git cherry-pick <SHA commit to cherry-pick>。

一些方法可能会拯救你:

如果你的历史是这样的:

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

你可以使用git rebase—to v2 v2-only 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

注意:之所以需要一些额外的工作,是因为它在存储库中创建了重复的提交。这并不是一件好事——简单的分支和合并的重点是能够通过在一个地方提交并将它们合并到任何需要的地方来完成所有事情。重复提交意味着永远不会合并这两个分支(如果稍后决定合并,就会发生冲突)。

上面已经提到的答案涵盖了大部分内容,但有一件事似乎被遗漏了,那就是选择的——no-commit特性。

假设,您在特性分支上有多个提交,您希望将它们“合并”为一个提交,并将它们放在您的主分支上。在这种情况下,你需要做的是:

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

最后,一旦你选择了所有需要的特性,你可以做最后的提交:

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

理想情况下,就像@Cascabel提到的,你应该使用merge或rebase。但如果你觉得没有其他选择,你可以使用樱桃选择。