Làm thế nào tôi có thể đẩy một nhánh Git cục bộ đến một điều khiển từ xa với một tên khác một cách dễ dàng?


175

Tôi đã tự hỏi liệu có một cách dễ dàng để đẩy và kéo một nhánh địa phương bằng một nhánh từ xa có một tên khác mà không phải luôn luôn chỉ định cả hai tên.

Ví dụ:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Bây giờ nếu ai đó cập nhật remote_branch_name, tôi có thể:

$ git pull

Và mọi thứ được hợp nhất / chuyển tiếp nhanh. Tuy nhiên, nếu tôi thực hiện thay đổi trong "newb" cục bộ của mình, tôi không thể:

$ git push

Thay vào đó, tôi phải:

% git push origin newb:remote_branch_name

Có vẻ hơi ngớ ngẩn. Nếu git-pullsử dụng git-config branch.newb.mergeđể xác định nơi lấy từ đâu, tại sao không thể git-pushcó tùy chọn cấu hình tương tự? Có một lối tắt đẹp cho việc này hay tôi chỉ nên tiếp tục chặng đường dài?

Câu trả lời:


93

Chắc chắn rồi. Chỉ cần đặt của bạn push.defaultđể upstreamđẩy các nhánh lên phía thượng nguồn của chúng (tương tự pullsẽ kéo từ, được xác định bởi branch.newb.merge), thay vì đẩy các nhánh đến các nhánh khớp với tên (là cài đặt mặc định cho push.default, matching).

git config push.default upstream

Lưu ý rằng điều này từng được gọi trackingkhông phải upstreamtrước Git 1.7.4.2, vì vậy nếu bạn đang sử dụng phiên bản Git cũ hơn, hãy sử dụng trackingthay thế. Các push.defaulttùy chọn được thêm vào trong Git 1.6.4, vì vậy nếu bạn đang ở trên một phiên bản cũ hơn, bạn sẽ không có tùy chọn này ở tất cả và sẽ cần phải xác định một cách rõ ràng các chi nhánh để push to.


Điều đó là vậy đó! Điều này áp dụng cho tất cả các chi nhánh đang theo dõi, nhưng điều đó tốt. Cảm ơn!
jmacdonagh

Tôi muốn biết liệu có một tốc ký cho tên chi nhánh mà tôi đã kiểm tra hay không. Tôi có thể chỉ muốn git push buildserver .:test_thisnơi tên .sẽ là chi nhánh địa phương mà tôi không nhất thiết phải biết. Tôi có thể nhìn lên, chắc chắn, nhưng nếu có một bàn tay ngắn, như dấu chấm, thì điều đó thật tuyệt.
Frederick Nord

2
@FrederickNord HEADlà cách viết tắt mà bạn đang tìm kiếm. HEADlà những gì trỏ đến chi nhánh hiện đang được kiểm tra hoặc trực tiếp đến một cam kết cụ thể nếu bạn có một đầu tách ra.
Brian Campbell

Cảm ơn! Điều này đã sửa Updates were rejected because a pushed branch tip is behind its remotelỗi cho tôi. Repo địa phương của tôi đã được cập nhật, nhưng tên chỉ khác nhau.
canhazbits

171

Khi bạn thực hiện thao tác đẩy ban đầu, hãy thêm tham số -u :

git push -u origin my_branch:remote_branch

Đẩy sau đó sẽ đi đến nơi bạn muốn.

BIÊN TẬP:

Theo nhận xét, chỉ thiết lập kéo.

git branch --set-upstream

Hãy làm nó.


7
-uchỉ cần đặt ngược dòng, mà theo câu hỏi, đã được đặt. Anh ta cần phải thiết lập push.defaultđể upstremcó được pushsự tôn trọng cài đặt ngược dòng, vì theo mặc định chỉ pullcó.
Brian Campbell

2
Điều này dường như không hoạt động - ít nhất là không phải trên các phiên bản không bao giờ của git
Thomas Watson

nhánh git - tập hợp ngược dòng chỉ thực hiện cài đặt kéo "pushRemote" sau này.
wheredidthatnamecome

Tôi không nghĩ git branch --set-upstreamlà cần thiết. Lưu ý: của tôi git --versionlà 2.17.1.
Gabriel Staples

15

Lệnh của Adam hiện không được chấp nhận. Bạn có thể dùng:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

để thiết lập các chi nhánh thượng nguồn my_local_branchđến origin/my_remote_branch.


6
Bạn có thể cung cấp một liên kết hỗ trợ thông tin bạn chia sẻ về -u bị phản đối không? Tài liệu cho phiên bản mới nhất liên quan đến việc đẩy tại git-scm.com dường như đề xuất nó hiện tại. Cảm ơn trước - nó có thể rất hữu ích cho độc giả để theo dõi để biết thêm thông tin.
Kay V

Đồng ý với @KayV, đặc biệt là tôi đã nhận được thông báo này khi cố gắng tạo một chi nhánh từ xa mới có tên khác với chi nhánh địa phương của tôi: 'Nếu bạn dự định đẩy ra một chi nhánh địa phương mới sẽ theo dõi đối tác từ xa của nó, bạn có thể muốn để sử dụng "git push -u" để đặt cấu hình ngược dòng khi bạn đẩy. '
FBB

0

Đây là quá trình đã làm việc cho tôi.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Bây giờ repo mới của bạn sẽ là 'nguồn gốc' và repo ban đầu là 'ngược dòng'. Xác nhận nó bằng cách chạy git remote -v. (Lưu ý bên lề: Thượng nguồn được sử dụng để tìm nạp từ repo ban đầu - để giữ bản sao cục bộ của bạn đồng bộ với dự án bạn muốn đóng góp - và nguồn gốc được sử dụng để kéo và đẩy vì bạn có thể đóng góp cho repo của riêng mình).

git push origin master

Bây giờ, chủ nhân từ xa mới của bạn (trên Github) sẽ đồng bộ với chủ gốc, nhưng nó sẽ không có bất kỳ nhánh tính năng nào.

git rebase upstream/branch-name
git push origin master

Rebase là một sự hợp nhất thông minh. Sau đó nhấn để làm chủ một lần nữa và bạn sẽ thấy nhánh tính năng được chọn là chủ trên repo mới.

Không bắt buộc:

git remote rm upstream
git remote add upstream new-repo-url

0

Bây giờ tôi đã gặp phải vấn đề tương tự. Cuối cùng tôi cũng có một bộ các tuyên bố vì vậy tôi không phải làm git push origin local:remotemỗi lần. Tôi đã làm theo:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Sau khi thiết lập ngược dòng đến một nhánh từ xa có tên khác (dòng thứ 1) và sau đó đặt dòng ngược đó làm mặc định (dòng thứ 2), dòng thứ 3 bây giờ sẽ tuân theo các quy tắc này và đẩy lên dòng được thiết lập.

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.