2012-02-15 14 views
18

をコミットしていない見つける:我々は、安定したからマスターへのすべての変更をチェリーピックにポリシーを持っているgitの安定版ブランチ:桜選んだが、私は以下のGitの歴史を持っている

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

を。 D 'とE'は安定した枝からチェリーピックされたコミット、Fはチェリーピックされていない(忘れられている)。

どのようにしてdiffを得ることができますか?(チェリーピッキングされていませんでした)F私たちが使用したくない


があるためマージ:マージせずに

  • クリーナー歴史
  • まれであり、安定に
  • コミットをコミットし、我々は異なる安定支店

答えて

13
がたくさんあります

これはまさにgit cherryコマンドの目的です。

ピッキングされていない変更は間違いありませんが、ピックアップにコンフリクトの解決が含まれていると思われる変更が表示されることがあります。

+0

です。 – angularsen

+1

@anjdreasチェリーはgit 2.13.2でマージコミットを表示していないようです。 – fossilet

-2

Gitコマンドでこれを解決できません。 私はこのスクリプトを書いて、それは助けることができます。

Script 1stは、branch1とbranch2の両方のマージベースを計算します。 次に、マージベースからbranch1とbranch2の頭部までの2つのリストを作成します。 次に、コミットメッセージのmd5sumとともにbranch2にコミットのハッシュテーブルを作成します。次に、branch1のコミットリストを調べ、branch2ハッシュテーブルに存在するかどうかをチェックしますか?私はgitのログを持っていることをマージ--no-それはオプションを持っていたいような場合の支社で

は安定しており、BRANCH2はマスター

#!/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 
+1

あなたは* how *と* why *がOPの問題を解決する方法を詳しく教えてください。それは技術的に質問に答えるかもしれませんが、いくつかのコードを貼り付けるだけで良い答えではありません。 –

+0

Script 1stは、branch1とbranch2の両方のマージベースを計算します。次に、マージベースからbranch1とbranch2の頭部までの2つのリストを作成します。次に、メッセージ2のmd5sumを使ってbranch2にコミットのハッシュテーブルを作成します。次に、branch1のコミットリストを調べ、branch2ハッシュテーブルに存在するかどうかを確認します。 –

+0

上記の場合、branch1は安定しており、branch2はmasterです。 –

関連する問題