例如,我有一个dev
分支和一个stable
分支.
如果我有樱桃采摘几个从承诺dev
到stable
.
有没有什么办法让Git的认识樱桃采摘提交的,并避免双合并,如果我以后合并,重订或摘樱桃的重叠范围,从dev
回stable
?(这是SVN中的基本合并跟踪功能)
Ara*_*xia 14
另外值得注意的是,该-x
标志用于cherry-pick
将原始提交的SHA添加到提交消息的末尾.
我也想将缩写的SHA添加到提交摘要的末尾,以便在查看日志时更容易将挑选的提交与原始提交相关联.通过-s
签收标志指示谁做了樱桃选择也很有帮助.
例:
> git cherry-pick -sex 27d4985
#333: fixes all the things (27d4985)
- how it fixes all the things
(cherry picked from commit 27d49855238364d0184ad344884a366b5b16e)
Signed-off-by: Chuck Norris <chuck@example.com>
Run Code Online (Sandbox Code Playgroud)
Mar*_*ins 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只关心每次提交中树的状态,而不关心进入该状态的更改.
实际上有一个名为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
Run Code Online (Sandbox Code Playgroud)
假设您在一个分支上,并且想要列出哪些资格可以从主分支合并,只需运行:
gitavail --name-status
Run Code Online (Sandbox Code Playgroud)
并且你的输出非常类似于"svnmerge avail -l".
我想不能手动修改cherry-pick提交(冲突怎么办?),如果修补程序ID发生变化,git cherry将不会意识到提交已被挑选出来.
归档时间: |
|
查看次数: |
5728 次 |
最近记录: |