bí danh git để hợp nhất chi nhánh hiện tại với chủ


6

Tôi đang cố gắng tạo một bí danh git hợp nhất nhánh hiện đang được kiểm tra vào nhánh chính. Cụ thể tôi muốn nhanh chóng giúp chi nhánh chính của mình tăng tốc với những gì tôi đang làm. Tôi đã có những điều sau đây:

[alias]
    co = checkout
    ff = !git co master && git merge work && git co work

Tuy nhiên tôi muốn bí danh để biết nó thuộc chi nhánh nào và quay lại với nó. Tôi đã thử thêm $1 nhưng thật không may, tôi gặp lỗi trong lần kiểm tra cuối cùng trong bí danh:

# with
[alias]
    co = checkout
    ff = !git co master && git merge $1 && git co $1

> git ff work
Switched to branch 'master'
Already up-to-date.
error: pathspec 'work' did not match any file(s) known to git.

Bất cứ ai cũng biết tại sao nó làm điều này? (Nhân tiện, tôi đang dùng Mac)


Chủ đề liên quan về stackoverflow mặc dù nó không trả lời vấn đề mà tôi có.
Spoike

Khác câu hỏi liên quan về SO.
sampablokuper

Câu trả lời:


7

Nếu bạn sẽ sử dụng tham số vị trí trong bí danh git, hãy nhớ chỉ định sh -c. Sau đây làm việc cho tôi tại địa phương:

ff = !sh -c 'git checkout master && git merge "$1" && git checkout "$1"' -

"Tại sao" liên quan đến cách git phân tích các lệnh bí danh và được tóm tắt trong chủ đề gmane này .

Các - ở cuối các tín hiệu lệnh sh quá trình xử lý tùy chọn đã kết thúc. Từ man sh:

A - báo hiệu kết thúc các tùy chọn và vô hiệu hóa xử lý tùy chọn tiếp theo. Bất kỳ đối số nào sau - được coi là tên tệp và đối số. Một đối số của - tương đương với -.

Nếu nó không xuất hiện, nó sẽ giới thiệu một lỗi trong bí danh, bằng cách xử lý $1 như một tùy chọn trên sh lệnh thay vì như là một đối số vị trí. Hãy xem xét ví dụ tầm thường này:

$ sh -c 'echo $1' foo          # equivalent to 'echo' without argument

$ sh -c 'echo $1' - foo        # will pass 'foo' to the string as $1
foo

Trong trường hợp đầu tiên, 'foo' đã bị tiêu thụ bởi sh Như là một lựa chọn. Trong lần thứ hai, nó được hiểu chính xác là $1 trên chuỗi.


P.S. Tại sao dấu gạch ngang ở cuối?
Hari Karam Singh

@HariKaramSingh: Đã chỉnh sửa câu trả lời với nhiều thông tin hơn.
Christopher

3

Đây là phiên bản mà bạn không cần chỉ định nhánh hiện tại và có thể chọn bất kỳ nhánh mục tiêu nào:

merge-into = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge $_CURRENT_BRANCH && git checkout $_CURRENT_BRANCH' -

Cách sử dụng (từ chi nhánh của tôi):

git merge-into master

0

Nhờ sự câu trả lời trong chủ đề này, tôi đã cập nhật một số bí danh tôi đã sử dụng:

  • git fold <target> [source] - hợp nhất <target> nhánh vào hiện tại (bảo tồn lịch sử), tùy chọn chỉ định một source chi nhánh khác hiện tại; mff là một tốc ký khác

    fold = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge --no-ff ${2-$_CURRB} -e' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/ + https://superuser.com/questions/435744/git-alias-for-merging-current-branch-with-master
        mff = "!git fold"
    
  • git foldback <target> [source] -- giống như fold, nhưng chuyển trở lại source (hiện tại) chi nhánh

    foldback = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 ${2-$_CURRB} && git checkout ${2-$_CURRB}' -
    
  • git fuse <target> [source] -- giống như fold, nhưng xóa nhánh nguồn (nghĩa là khi bạn hoàn thành công việc trên một tính năng)

    fuse = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 $2 && git branch -d ${2-$_CURRB}' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/
    

Tôi không biết đủ về công cụ vỏ để biết cách sử dụng tốt hơn _CURRB; bất kỳ đề xuất?

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.