合并跟踪Git樱桃采摘?

时间:2010-09-21 03:19:39

标签: git cherry-pick

例如,我有一个dev分支和一个stable分支。

如果我从devstable提交了几个提交。

有没有办法让Git知道樱桃挑选的提交,并避免加倍合并它,如果我后来合并,重新绑定或挑选重叠范围,从dev返回{{1} }? (这是SVN中的基本合并跟踪功能)

3 个答案:

答案 0 :(得分:14)

另外值得注意的是-x的{​​{1}}标志将原始提交的SHA添加到提交消息的末尾。

我也希望将缩写的SHA添加到提交摘要的末尾,以便在查看日志时更容易将挑选的提交与原始提交相关联。通过cherry-pick签收标志,指示谁做樱桃选择也很有帮助。

示例:

-s

> git cherry-pick -sex 27d4985

答案 1 :(得分:11)

git cherry-pickgit rebase而不是git merge的有趣案例,因此它实际上重写了您挑选的提交,因此它会将相同的更改应用到您的分支顶部樱桃采摘。由于git的提交ID基于提交的内容,因此新提交具有不同的id,因此被git认为是完全不同的提交。

另一方面,

git merge创建合并提交;这是git实现合并跟踪的手段。合并提交标记了两个(或更多)发散历史收敛的点。调用git merge [commit-id]而不是git cherry-pick [commit-id]来显式创建合并提交是可以接受的,但这不仅会带来单个樱桃选择提交的效果,还会带来该分支的不同历史记录中的整个更改集。

尽管如此,“双合并”通常不是git中的问题。如果您尝试与包含已经存在的变更集的历史记录合并,那么当历史记录粘在一起时,它将变为无操作; git只关心每次提交中树的状态,而不关心那些进入该状态的更改。

答案 2 :(得分:5)

实际上有一个名为git cherry的命令可以打印两个分支之间未合并的每个提交。

对于每个打印的提交,“+”符号表示您可以合并它,“ - ”符号表示您已经选择了该提交。

输出远非漂亮。

对于那些来自SVN并习惯svnmerge.py的人,我为git创建了一个“svnmerge avail -l”等效的bash脚本,我称之为gitavail:

#!/bin/bash

# get current branch
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

# get tracked branch (1st argument), if no arg or arguments are only options, assume master
if test -z $1 || grep -q '^-' <<< $1;
then TRACKED_BRANCH=master
else TRACKED_BRANCH=$1; shift
fi

# Log commits available for merge from tracked branch
LOG_OPTIONS=$*
for i in $(git cherry $CURRENT_BRANCH $TRACKED_BRANCH | egrep '^\+' | awk '{print $2}'); do git --no-pager log -n1 $i ${LOG_OPTIONS}; echo; done

假设您在一个分支上,并且想要列出哪些资格可以从主分支合并,只需运行:

gitavail --name-status

你的输出非常类似于“svnmerge avail -l”。

我认为不能手动修改cherry-pick提交(冲突怎么办?),如果patch id发生变化,git cherry将不会意识到提交已被挑选出来。

相关问题