2012-11-01 28 views
6

Tôi đã nhân bản một số kho lưu trữ git, và đã làm "git branch abcd", whcih đã chuyển tôi sang một chi nhánh bắt nguồn từ origin/abcd. abcd không phải là nhánh gốc mặc định. Sau đó, tôi đã tạo một chi nhánh tính năng "my_feature" ra khỏi abcd. Tôi muốn "git merge origin/abcd" vào my_feature trong tập lệnh có thể áp dụng bất kể tên nhánh gốc được sử dụng (hoặc ít nhất là áp dụng cho trường hợp dễ dàng khi không có cấu trúc nhánh phức tạp được mô tả trong một số câu trả lời khác về git).Lấy tên của nhánh gốc gốc trong git?

Làm cách nào để tìm nhánh gốc "gần nhất"/"cha mẹ" mà chi nhánh hiện tại được tạo ra?

+0

có thể trùng lặp của [Tìm nhánh gốc của nhánh] (http: // stackoverflow.com/questions/3161204/find-the-parent-branch-of-a-branch) – pisaruk

Trả lời

3

Điều này khó làm tốt. Trong git, một nhánh chỉ là một con trỏ tự động tiến tới một cam kết, và một cam kết có thể có bất kỳ số lượng tên chi nhánh nào trên nó. Hãy xem xét trường hợp này:

your master:  y1---y2---y3 
       /
master: a---b---c---d---e 
       \ 
feature:   f1---f2---f3---f4 

Bạn đã đăng ký ra chi nhánh "master" tại c, và cam kết y1, y2y3. Do đó, lịch sử của bạn trông giống như a b c y1 y2 y3. Trong khi đó chính đã nâng cấp lên de, nhưng ai đó đã tạo chi nhánh tính năng và cam kết f1 thông qua f4 dựa trên c. Git không có cách nào để xác định rằng chi nhánh của bạn đến từ master thay vì feature, vì vậy tốt nhất bạn sẽ có một sự lựa chọn của các chi nhánh để hợp nhất.

Bạn có tự động thực hiện điều này không, bạn phải áp dụng phương pháp heuristic về việc chọn nhánh ngắn nhất, hoặc nhánh dài nhất, hoặc nhánh có số tiền ít nhất/ít nhất, hoặc cái khác như thế. Đương nhiên, vì có rất nhiều lựa chọn, nó không thực sự là một lựa chọn tốt cho một hàm dựng sẵn git. Tuy nhiên, sử dụng các chức năng "đường ống dẫn nước" của git, bạn có thể viết các chức năng của riêng mình:

#!/bin/bash 

# Tries to determine a good merge base from among all local branches. 
# Here used, a "good" merge base is the one sharing the most recent commit 
# on this branch. This function will exit 1 if no branch is found, 
# or exit 2 in a tie. 
# 
# Untested - use at your own risk. 

MAX_SEARCH=20 # only search the last 20 commits on this branch 
FOUND=0 
LAST_BRANCH= 

# iterate through the commits, most recent first 
for COMMIT in $(git rev-list --max-count=$MAX_SEARCH HEAD); do 
    # check every local branch 
    for BRANCH in $(git for-each-ref --format="%(refname)" refs/heads); do 
    # look for the commit in that branch's history 
    if (git rev-list $BRANCH | fgrep -q COMMIT); then 
     echo $BRANCH 
     FOUND=$((FOUND + 1)) 
     LAST_BRANCH="$BRANCH" 
    fi 
    done 
    if [ $FOUND -gt 1 ]; then 
    # more than one choice; exit 
    exit 2 
    elif [ $FOUND -eq 1 ]; then 
    git merge $LAST_BRANCH 
    exit 0 
    fi 
done 
exit 1 # could not find a parent 
2

Với DVCS, không có thứ gì như "nhánh gốc".

Chi nhánh là:

  • một tên
  • một khởi đầu cam kết, và cam kết có thể:
    • phần của nhiều ngành, cả hai từ repo địa phương và repo ngược dòng như 'origin '.
    • thay đổi sau một rebase của chi nhánh của bạn

Xem để biết thêm:

Cách duy nhất cho kịch bản của bạn để làm việc là ghi lại tên của origin/branch, tốt nhất là git notes (vì nó không thay đổi lịch sử và SHA1, nhưng thêm siêu dữ liệu).

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