2012-02-15 10 views
18

Mam następującą historię git:git stable: znaleźć nie wiśnia zbierane zobowiązuje

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

Mamy politykę Cherry-pick wszystkie zmiany ze stabilnej do opanowania; D 'i E' są wyselekcjonowanymi przyjaciółmi ze stabilnej gałęzi, F nie jest zbieraniną wiśni (zapomniano).

Jak mogę uzyskać różnicę, która wywołuje F (która nie została wybrana przez mistrza)?


Nie chcemy używanie seryjnej, ponieważ:

  • czystsze historia bez scalania zobowiązuje
  • zobowiązuje się stabilne są rzadkie
  • mamy wiele różnych stabilnych gałęzi

Odpowiedz

13

To jest dokładnie to, do czego służy polecenie git cherry.

Nigdy nie powinno zabraknąć odkrytej zmiany, ale może czasami wymienić listę, którą uważasz za wybraną, jeśli wybór dotyczył rozwiązywania konfliktów.

+0

życzę miał opcję --no-scala że dziennik git ma. – angularsen

+1

@anjdreas Wygląda na to, że cherry nie zawiera listingu commity z git 2.13.2. – fossilet

-2

Polecenie Git nie może rozwiązać tego problemu. Napisałem ten skrypt, może pomóc.

Skrypt 1 oblicza scalenie podstawy obu gałęzi branch1 i branch2. Następnie tworzy dwie listy od scalenia podstawy do nagłówka odpowiednio branch1 i branch2. Następnie tworzy tablicę skrótów zatwierdzeń na gałęzi 2 z md5sum wiadomości commit. Następnie przechodzi przez listę zatwierdzeń branch1 i sprawdza, czy istnieją w hashtable branch2, czy nie?

W powyższym przypadku branch1 jest stabilny i Branch2 jest panem

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

Proszę wyjaśnić, * jak * i * dlaczego * rozwiązuje problem PO? Wklejenie jakiegoś kodu nie jest dobrą odpowiedzią, a może technicznie odpowiedzieć na pytanie. –

+0

Skrypt 1 oblicza połączenie podstawy obu gałęzi branch1 i branch2. Następnie tworzy dwie listy od scalania podstawy do głowy odpowiednio gałęzi 1 i gałęzi 2. Następnie tworzy tablicę skrótów zatwierdzeń na gałęzi 2 z wiadomością md5sum. Następnie przechodzi przez listę zatwierdzeń branch1 i sprawdza, czy istnieją one w tabeli mieszania branch2, czy też nie. –

+0

W powyższym przykładzie gałąź 1 jest stabilna, a gałąź2 jest wzorcem. –

Powiązane problemy