【问题标题】:git stable branch: find not cherry-picked commitsgit stable 分支:找到不精选的提交
【发布时间】:2012-03-06 13:53:56
【问题描述】:

我有以下 git 历史记录:

A --- B --- C --- D' --- E' [master]
 \
  \ --- D --- E --- F [stable]

我们有一个政策来挑选从稳定到大师的所有变化; D' 和 E' 是来自稳定分支的精选提交,F 不是精选提交(已被遗忘)。

我怎样才能得到一个与 F 相匹配的差异(不是精选到 master 中的)?


我们不想使用合并,因为:

  • 没有合并提交的更清晰的历史记录
  • 很少有稳定的承诺
  • 我们有很多不同的稳定分支

【问题讨论】:

    标签: git diff cherry-pick git-diff


    【解决方案1】:

    这正是git cherry 命令的用途。

    它不应该错过未选择的更改,但如果选择涉及冲突解决,它可能偶尔会列出您认为已选择的更改。

    【讨论】:

    • 我希望它有选项 --no-merges git log 有。
    • @anjdreas 似乎cherry没有列出合并提交,带有git 2.13.2。
    【解决方案2】:

    Git 命令无法解决这个问题。 我已经写了这个脚本,它可以提供帮助。

    脚本 1st 计算分支 branch1 和 branch2 的合并基数。 然后它分别从合并基到branch1和branch2的头部制作两个列表。 然后它使用提交消息的 md5sum 在 branch2 上创建一个提交哈希表。然后它通过branch1的提交列表并检查它是否存在于branch2哈希表中?

    在上述情况下,branch1 是稳定的,branch2 是 master

    #!/bin/bash
    
    ## Usage: ./missing_cherrypicks.sh branch1 branch2
    ## This script will find commits in branch1 missing in branch2
    ## Final list of missing commit will be in file missing_commits_branch1_branch2.csv
    
    branch1=$1
    branch2=$2
    
    # Calculate mergebase of branch1 and branch2
    mb=`git merge-base origin/$1 origin/$2`
    rm -rf missing_commits_${branch1}_${branch2}.csv
    echo "COMMIT,AUTHOR,MESSAGE,FILESLIST" >> missing_commits_${branch1}_${branch2}.csv
    
    # Get commit list on both branches from merge-base
    declare -a commitlist1=`git rev-list $mb..origin/$1`
    declare -a commitlist2=`git rev-list $mb..origin/$2`
    
    ## Make HashKey for branch2
    declare -A CommitHash
    for com2 in ${commitlist2[@]}
    do
      message2=`git log --pretty=oneline $com2 | head -1| sed "s/${com2} //" | sed 's/ *$//' | cut -c1-35`
      hashkey=`echo $message2 |md5sum |xargs | awk '{print $1}'`
      CommitHash[${hashkey}]=$com2
    done
    
    # Find commits of commitlist1 and check if they are in commitlist2
    for com1 in ${commitlist1[@]}
    do
       message1=`git log --pretty=oneline $com1 | head -1| sed "s/${com1} //"| sed 's/ *$//'| cut -c1-35`
       hashkey1=`echo $message1 |md5sum |xargs | awk '{print $1}'`
       if [[ -z ${CommitHash[${hashkey1}]} ]]
       then
          echo "------$com1-----------"
          author=$(git show $com1 |grep ^Author:|awk -F":" '{print $2}')
          fileslist=`git diff-tree --no-commit-id --name-only -r $com1`
          fl=""
          for file in ${fileslist[@]}
          do
              fl=${fl}":"$file
          done
    
          echo "------$author-------"
          echo "$com1,$author,$message1,$fl" >> missing_commits_${branch1}_${branch2}.csv
       fi
    done
    

    【讨论】:

    • 您能否详细说明一下如何为什么这解决了OPs问题?仅仅粘贴一些代码并不是一个好的答案,虽然它可能在技术上回答了这个问题。
    • 脚本 1st 计算分支 branch1 和 branch2 的合并基数。然后它分别从合并基到branch1和branch2的头部制作两个列表。然后它使用消息的 md5sum 在 branch2 上创建提交的哈希表。然后它通过branch1的提交列表并检查它是否存在于branch2哈希表中。
    • 在上述情况下,branch1 是稳定的,branch2 是 master。
    • 请相应地编辑您的答案,不要将详细信息添加为 cmets。
    • 添加了脚本细节。
    猜你喜欢
    • 2021-07-05
    • 2016-01-04
    • 2021-06-28
    • 2014-02-22
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2014-05-24
    • 2015-02-22
    相关资源
    最近更新 更多