Tìm chi nhánh Git không hợp nhất?


276

Tôi có một kho lưu trữ Git với nhiều chi nhánh, một số trong số chúng đã được hợp nhất và một số thì không. Vì số lượng chi nhánh khá lớn, làm thế nào tôi có thể xác định được chi nhánh nào chưa được sáp nhập? Tôi muốn tránh phải thực hiện hợp nhất "bạch tuộc" và sáp nhập lại các nhánh đã được hợp nhất.


1
Đầu tiên tôi đã cười về thuật ngữ "hợp nhất bạch tuộc". Nhưng trong trường hợp bạn không biết, như tôi: Đó là tên chính thức của chiến lược hợp nhất :-) Xem git-scm.com/docs/git-merge hoặc atlassian.com/de/git/tutorials/USE-branches/ chiến lược hợp nhất
người quan sát

Câu trả lời:


462

Thử cái này:

git branch --merged master

Nó thực hiện những gì nó nói trên hộp thiếc (liệt kê các nhánh đã được sáp nhập vào master). Bạn cũng có thể kéo ngược lại với:

git branch --no-merged master

Nếu bạn không chỉ định master, ví dụ ..

git branch --merged

sau đó nó sẽ hiển thị cho bạn các nhánh đã được hợp nhất vào hiện tại HEAD(vì vậy nếu bạn bật master, nó tương đương với lệnh đầu tiên; nếu bạn bật foo, nó tương đương với git branch --merged foo).

Bạn cũng có thể so sánh các nhánh ngược dòng bằng cách chỉ định -rcờ và tham chiếu để kiểm tra, có thể là cục bộ hoặc từ xa:

git branch -r --no-merged origin/master

5
Nếu bạn hợp nhất foovào master, nó sẽ xuất hiện trong git branch --merged masterdanh sách. Nhưng điều gì xảy ra nếu bạn cam kết một lần nữa foo? Liệu nó không còn xuất hiện trong danh sách đó nữa, hay mặc dù nó có các cam kết mới, nhưng tại một thời điểm nó đã được hợp nhất vào master?
Craig Otis

11
@CraigOtis Nó sẽ không còn xuất hiện trong danh sách. --mergedchỉ liệt kê các nhánh được sáp nhập hoàn toàn vào nhánh đã cho.
Amber

gitk --remotes --not origin/mastersẽ cho bạn thấy các cam kết trên mỗi nhánh chưa được hợp nhất thành chủ.
yoyo

5
Hãy tưởng tượng điều này ... một câu trả lời git thật dễ hiểu và dễ sử dụng!
jleach

1
Có cách nào để có được danh sách mà không cần kiểm tra chi nhánh không? Giống như chỉ vào máy chủ và sau đó nhận được danh sách?
xbmono

57

Bạn cũng có thể sử dụng tham số -r để hiển thị các nhánh từ xa chưa được hợp nhất thành chủ:

git branch -r --merged master

git branch -r --no-merged

19
hoặc -ađể xem cả từ xa và cục bộ cùng một lúc
Simon Forsberg

1
Cái cuối cùng có nên là chi nhánh git -r - không hợp nhất không?
MortimerCat

28

Nếu một chi nhánh đã được hợp nhất, việc sáp nhập lại sẽ không làm gì cả. Vì vậy, bạn không phải lo lắng về các chi nhánh "sáp nhập lại" đã được hợp nhất.

Để trả lời câu hỏi của bạn, bạn chỉ cần đưa ra

 git branch --merged

để xem các chi nhánh hợp nhất hoặc

 git branch --no-merged

để xem các chi nhánh không được trộn lẫn. Chi nhánh hiện tại của bạn được ngụ ý nhưng bạn có thể chỉ định các chi nhánh khác nếu bạn muốn.

 git branch --no-merged integration

sẽ cho bạn thấy các nhánh chưa được sáp nhập vào integrationchi nhánh.


1

Kịch bản dưới đây sẽ tìm thấy tất cả các origin/*nhánh đi trước nhánh hiện tại

#!/bin/bash

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

echo -e "Current branch: \e[94m$CURRENT_BRANCH\e[0m"
echo ''

git branch -a | grep remotes/origin/ | while read LINE
do
    CMD="git diff --shortstat remotes/origin/${CURRENT_BRANCH}...${LINE}"

    if $CMD | grep ' file' > /dev/null; then
        echo -e "\e[93m$LINE\e[0m" | sed 's/remotes\/origin\///'
        $CMD
        echo ''
    fi
done

Phiên bản cập nhật của tập lệnh


0
Below script will fetch you unmerged branches and write results in .xls file 
#!/usr/bin/env bash
echo "getting list of unmerged_branches from the remote"
file_name=unmerged_branches.xls`enter code here`
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
for branch in `git branch -r --no-merged | grep -v HEAD`;
do echo -e `git show --format="%cd  \\t%cr  \\t%ae" $branch | head -n 1` \\t$branch; 
done | sort -r >> $current_time.$file_name
echo "result is writtein in ";
echo $current_time.$file_name;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.