例如,我有一个dev
分支和一个stable
分支。
如果我从dev
到stable
提交了几个提交。
有没有办法让Git知道樱桃挑选的提交,并避免加倍合并它,如果我后来合并,重新绑定或挑选重叠范围,从dev
返回{{1} }? (这是SVN中的基本合并跟踪功能)
答案 0 :(得分:14)
另外值得注意的是-x
的{{1}}标志将原始提交的SHA添加到提交消息的末尾。
我也希望将缩写的SHA添加到提交摘要的末尾,以便在查看日志时更容易将挑选的提交与原始提交相关联。通过cherry-pick
签收标志,指示谁做樱桃选择也很有帮助。
示例:
-s
> git cherry-pick -sex 27d4985
答案 1 :(得分:11)
git cherry-pick
是git 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将不会意识到提交已被挑选出来。