Làm thế nào bạn có thể git chỉ kéo nhánh hiện tại?


81

Có cách nào cấu hình để thiết lập điều này mà không cần phải chỉ định nhánh nào không?

Câu trả lời:


82

Git đã chỉ kéo nhánh hiện tại. Nếu bạn đã thiết lập nhánh làm nhánh theo dõi, bạn không cần chỉ định nhánh từ xa. git branch --set-upstream localbranch reponame/remotebranchsẽ thiết lập mối quan hệ theo dõi. Sau đó bạn phát hành git pull [--rebase]và chỉ nhánh đó mới được cập nhật.

Tất nhiên, tất cả các nhánh theo dõi từ xa và tất cả các giới thiệu cho điều khiển từ xa sẽ được cập nhật, nhưng chỉ nhánh theo dõi cục bộ của bạn mới được sửa đổi.

Bí danh Bash hữu ích để cắt giảm việc nhập hoạt động phổ biến này:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

Hàm Powershell hoạt động tương tự:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}

đúng vậy, và có thể hơi lạ vì "git push" (như mặc định) cố gắng đẩy tất cả các nhánh (có cùng tên từ xa).
Alessandro De Simone

2
@AlessandroDs Vâng, tôi đặt push.default thành ngược dòng chỉ vì lý do đó. Mặc định mới cho push.default là "đơn giản" một lần nữa chỉ cập nhật nhánh hiện tại, do đó song song hơn với những gì pull thực hiện.
Seth Robertson

1
@Danjah: Tất cả các thay đổi được lấy từ kho lưu trữ từ xa (vào các nhánh theo dõi từ xa, ví dụ: origin / master origin / foo, v.v.). Nếu bạn được đăng xuất vào một chi nhánh cục bộ có xác định ngược dòng, thì chỉ chi nhánh cục bộ đó mới được cập nhật. Nếu bạn được đăng xuất vào một chi nhánh cục bộ mà không có phần ngược dòng, thì bạn phải chỉ định thêm thông tin hoặc đặt phần ngược dòng. Đừng cố gắng sửa đổi thanh toán không thuộc địa phương, hãy tạo một chi nhánh địa phương và tiếp tục. Nếu bạn muốn giảm những gì bạn chuyển, bạn có thể cập nhật refspec của điều khiển từ xa trong cấu hình git cục bộ của bạn.
Seth Robertson

1
Có cách nào được tích hợp sẵn để không cập nhật tất cả các ref chỉ tìm nạp nhánh hiện tại không?
Aditya MP

1
@aditya menon: Không dễ đâu. Bạn sẽ cần cập nhật refspec (ví dụ: git config remote.origin.fetch) để chỉ tìm nạp các ref cụ thể (các nhánh, thẻ, v.v.) mà bạn muốn. Xem stackoverflow.com/questions/15507264/… để biết thêm các ví dụ cụ thể.
Seth Robertson

61

Tôi chỉ làm theo cách này:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

hoặc là

git pull origin $(git rev-parse --abbrev-ref HEAD)

Thao tác này sẽ trích xuất nhánh hiện tại git branchvà kéo nhánh đó từ nguồn gốc từ xa.

Lưu ý, giống như Seth Robertson đã nói, khi không có đối số nào được đưa ra, chỉ nhánh hiện tại được sửa đổi nhưng tất cả các nhánh từ xa đều được tìm nạp. Tôi không muốn tìm nạp tất cả các chi nhánh ở xa, vì vậy tôi đã làm theo cách này.


3
git branchkhông thực sự nên được phân tích cú pháp cho thông tin chi nhánh. Thông tin đó có sẵn khi git rev-parsethực hiện lệnh:git pull origin $(git rev-parse --abbrev-ref HEAD)
Paul DelRe

@ayke tôi thêm Paul DelRe câu trả lời vào bạn vì nó cũng làm việc, tôi hy vọng bạn cả hai không quan tâm
Timo Huovinen

1
Chỉ tò mò: Sự khác biệt giữa "git pull" đơn giản (đã kiểm tra chi nhánh tôi muốn kéo) và đề xuất của bạn là gì? Kết quả thay thế lệnh của bạn git pull origin <current-branch>vẫn là mặc định, phải không? Bạn có ngụ ý rằng các nhánh từ xa khác (ví dụ: origin / other-branch, v.v.) không được cập nhật, do đó lưu lượng truy cập bị giảm không?
Peter - Phục hồi Monica,

Tôi đã trả lời câu này từ lâu rồi, tôi thực sự không biết nữa. Bạn có thể nên đi với câu trả lời được chấp nhận ...
ayke 29/09/17

@ PeterA.Schneider Nếu bạn chỉ cần nhập, git pullbạn có thể nhận được một thông báo như thế nào There is no tracking information for the current branch. Please specify which branch you want to merge with.. Sau đó, bạn luôn luôn kết thúc nhập git pull origin my-feature-branch. Tôi thực sự muốn biết tình huống này xảy ra như thế nào mà không có thông tin theo dõi.
Alfe

18

CẬP NHẬT

Câu trả lời cũ mà tôi đã thêm không hoạt động nữa: /. Nhưng sau khi nhận được một số phiếu tán thành về phiên bản PUSH mà tôi đã đặt, đối với tôi có nghĩa là câu trả lời này thực sự giúp ích cho ai đó rằng kết thúc đến đây từ các công cụ tìm kiếm, vì vậy tôi sẽ giữ câu trả lời này.

Hãy thử điều này cho phiên bản git mới:

$ git config --global push.default current

9
Tôi không tin rằng pull.default tồn tại. Xem git-scm hoặc kernel.org .
Mort

2
Đúng. git 2.3.4 trên linux tìm nạp tất cả các nhánh ngay cả với các nhánh ở trên pull.default=current. Tôi thấy rằng của tôi git clonetheo mặc định cũng được thêm vào remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*nhưng điều đó khá tiêu chuẩn.
Mort

6
Không có pull.defaultbiến cấu hình. Đưa nó vào cấu hình git của bạn sẽ không làm được gì cả.
David Sanders

5
Câu hỏi là về git pull và câu trả lời chứa git push với nhiều lượt ủng hộ. Điều này gây hiểu lầm @BrunoCasali Tại sao bạn lại chỉnh sửa câu trả lời của mình và xóa nó nếu nó phù hợp với bạn? Nếu bạn nhận ra câu trả lời là sai, vui lòng xóa nó thay vì giữ nó với những thông tin không liên quan để giữ được sự ủng hộ.
TJ

5

Có, có một cấu hình có thể được thay đổi .gitconfig, ví dụ:

[push]
  default = current

sẽ đẩy nhánh hiện tại cập nhật nhánh có cùng tên ở đầu nhận.

Kiểm tra bởi:

git config --global --get push.default

Xem: git-config .


3

Các --set-upstreamlá cờ là lỗi thời và sẽ bị xóa. Do đó, sử dụng--track hoặc--set-upstream-to

Ví dụ: Nếu bạn muốn đặt thông tin theo dõi cho chi nhánh này, bạn có thể làm như vậy với:

git branch --set-upstream-to=<remote>/<branch> develop

Nó có thể không được dùng nữa (nguồn?) Nhưng --set-upstream-to=vẫn được git nhắc đến khi nó không biết về thông tin theo dõi của bạn. Không đề cập đến việc không dùng nữa.
Adrien

@AdrienGiboire Đây là một số thông tin về việc ngừng sử dụng: jira.atlassian.com/browse/SRCTREEWIN-588
biniam

0

Đây là bí danh git không giả sử điều khiển từ xa originvà xử lý nếu chi nhánh không theo dõi điều khiển từ xa.

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(Tuyên bố từ chối trách nhiệm: Tôi rất là một người mới làm quen và những điều trên có thể được đơn giản hóa rất nhiều.)

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.