2012-02-15 30 views
18

tôi có lịch sử git sau:git branch ổn định: tìm không cherry-nhặt cam

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

Chúng tôi có một chính sách để đào-chọn tất cả thay đổi từ ổn định để làm chủ; D 'và E' là cam kết được hái bằng anh đào từ nhánh ổn định, F không phải là loại anh đào hái (đã bị lãng quên).

Làm thế nào tôi có thể nhận được một sự khác biệt mà bings lên F (mà không phải là anh đào chọn vào chủ)?


Chúng tôi không muốn sử dụng hợp nhất vì:

  • sạch lịch sử mà không hợp nhất cam kết
  • cam kết ổn định là rất hiếm
  • chúng tôi có nhiều chi nhánh ổn định khác nhau

Trả lời

13

Đó chính là điều mà lệnh git cherry dành cho.

Không bao giờ nên bỏ lỡ thay đổi chưa được sửa đổi, nhưng đôi khi nó có thể liệt kê thay đổi bạn cân nhắc chọn nếu lựa chọn có liên quan đến giải quyết xung đột.

+0

Tôi muốn nó có tùy chọn --no-sáp nhập mà git log có. – angularsen

+1

@anjdreas Có vẻ như anh đào không liệt kê các cam kết hợp nhất, với git 2.13.2. – fossilet

-2

Lệnh Git không thể giải quyết vấn đề này. Tôi đã viết kịch bản này, nó có thể giúp.

Tập lệnh đầu tiên tính cơ sở hợp nhất của cả hai nhánh branch1 và branch2. Sau đó, nó làm cho hai danh sách từ cơ sở hợp nhất thành phần đầu của nhánh1 và nhánh2 tương ứng. Sau đó, nó tạo ra một bảng băm của cam kết trên branch2 với md5sum của thư cam kết. Sau đó, nó đi qua danh sách cam kết của branch1 và kiểm tra xem có tồn tại trong branch2 hashtable hay không?

Trong trường hợp trên branch1 là ổn định và branch2 là bậc thầy

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

Bạn có thể vui lòng xây dựng * cách * và * tại sao * điều này giải quyết vấn đề OPs không? Chỉ cần dán một số mã không phải là một câu trả lời hay, trong khi nó có thể trả lời một cách kỹ thuật câu hỏi. –

+0

Tập lệnh 1 tính cơ sở hợp nhất của cả hai nhánh branch1 và branch2. Sau đó, nó làm cho hai danh sách từ cơ sở hợp nhất thành phần đầu của nhánh1 và nhánh2 tương ứng. Sau đó, nó tạo ra một bảng băm của cam kết trên branch2 với md5sum của tin nhắn. Sau đó, nó đi qua danh sách cam kết của branch1 và kiểm tra xem có tồn tại trong bảng băm branch2 hay không. –

+0

Trong trường hợp trên, branch1 là ổn định và branch2 là master. –

Các vấn đề liên quan