Tạo một nhánh Git hiện có theo dõi một nhánh từ xa?


3535

Tôi biết cách tạo một nhánh mới theo dõi các nhánh từ xa, nhưng làm cách nào để tạo một nhánh hiện có theo dõi một nhánh từ xa?

Tôi biết tôi chỉ có thể chỉnh sửa .git/configtập tin, nhưng có vẻ như có một cách dễ dàng hơn.


26
Như đã lưu ý dưới đây, đối với một chi nhánh hiện có, bạn có thể sử dụng git push -u origin branch-name.
Zags

3
Nếu chi nhánh địa phương là chi nhánh hiện tại và chi nhánh địa phương chưa theo dõi từ xa, git pullthường sẽ cung cấp các thông báo hữu ích về lệnh thích hợp để đặt thông tin theo dõi
billrichards 7/8/2015

57
Thật khó chịu khi một người đang học git để được hiển thị một liên kết đến tài liệu git. Tài liệu đó dường như được viết cho những người đã biết họ đang làm gì với git.
Felipe Alvarez

9
kể từ Git 2.10, trước tiên bạn nên kiểm tra chi nhánh địa phương dự định và sau đó thực hiện việc nàygit branch --set-upstream-to origin/<branch>
Mahdi Javaheri

2
--set-upstreamtạo ra một lỗi: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.nên git branch --set-upstream-to origin/<branch name>là lệnh hiện tại mà làm việc.
Super Jade

Câu trả lời:


4270

Cho một nhánh foovà một điều khiển từ xa upstream:

Kể từ Git 1.8.0:

git branch -u upstream/foo

Hoặc, nếu chi nhánh địa phương fookhông phải là chi nhánh hiện tại:

git branch -u upstream/foo foo

Hoặc, nếu bạn muốn gõ các lệnh dài hơn, chúng tương đương với hai lệnh trên:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Kể từ Git 1.7.0:

git branch --set-upstream foo upstream/foo

Ghi chú:

  • Tất cả các lệnh trên sẽ khiến nhánh cục bộ footheo dõi nhánh footừ xa upstream.
  • Cú pháp cũ (1.7.x) không được dùng theo cú pháp (1.8+) mới. Cú pháp mới nhằm mục đích trực quan hơn và dễ nhớ hơn.
  • Việc xác định một nhánh ngược dòng sẽ thất bại khi chạy với các điều khiển từ xa mới được tạo mà chưa được tìm nạp. Trong trường hợp đó, chạy git fetch upstreamtrước.

Xem thêm: Tại sao tôi cần phải thực hiện `--set-upstream` mọi lúc?


124
Là "thượng nguồn" tên của điều khiển từ xa? tức là những gì hầu hết sẽ gọi "nguồn gốc" theo mặc định?
Andrew Vit

172
@Andrew: Vâng. git branch --set-upstream master origin/mastersẽ tương đương với những gì được thực hiện tự động khi ban đầu bạn sao chép một kho lưu trữ.
Dan Mould

62
Trên một lưu ý liên quan, việc thêm phần này vào gitconfig của bạn thật tuyệt vời: "[đẩy] mặc định = theo dõi" điều này sẽ khiến cho việc đẩy sẽ đi đến cùng một nơi kéo đến từ :)
jpswain

61
Tôi nhận được "fatal: Không phải là một tên đối tượng hợp lệ: 'origin / master'."
joachim

84
git push -u origin foo qua
Bông

236

Bạn có thể thực hiện các thao tác sau (giả sử bạn đã được kiểm tra trên bản gốc và muốn chuyển sang bản gốc chi nhánh từ xa):

Thiết lập 'điều khiển từ xa' nếu bạn chưa có

git remote add origin ssh://...

Bây giờ cấu hình chủ để biết để theo dõi:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Và đẩy:

git push origin master

nó thực sự cần thiết từ xa và chi nhánh trong đẩy? Ý tôi là, bạn chỉ cần nó nếu chi nhánh đã kiểm tra của bạn không phải là chi nhánh bạn muốn đẩy, phải không?
Doppelganger

5
Có - nhưng từ bộ nhớ, bạn có thể cần phải rõ ràng cho lần đẩy đầu tiên. Tất nhiên có thể dễ dàng được kiểm tra ... :)
Paul Hedderly

+1 Đây là câu trả lời cho người dùng Windows đang bị kẹt với "bản xem trước" msysgit có trước 1.8. Cảm ơn vì điều đó.
Giăng

3
Đây là câu trả lời duy nhất làm việc cho tôi. Khi tôi thử câu trả lời được chấp nhận, để đặt điều khiển từ xa ngược dòng cho một nhánh hiện có, tôi nhận được : error: the requested upstream branch 'upstream/master' does not exist.
Steve K

4
@SteveK đó rất có thể là do thượng nguồn của bạn được gọi originvà không upstream.
umläute

160

Tôi làm điều này như là một tác dụng phụ của việc đẩy với -utùy chọn như trong

$ git push -u origin branch-name

Tùy chọn dài tương đương là --set-upstream.

Các git-branchlệnh cũng hiểu --set-upstream, nhưng việc sử dụng nó có thể gây nhầm lẫn. Phiên bản 1.8.0 sửa đổi giao diện.

git branch --set-upstreamkhông được chấp nhận và có thể được loại bỏ trong một tương lai xa. git branch [-u|--set-upstream-to]đã được giới thiệu với một thứ tự saner của các đối số.

Giáo dục

Thật hấp dẫn để nói git branch --set-upstream origin/master, nhưng điều đó nói với Git để sắp xếp "nguồn gốc / chủ" địa phương để tích hợp với chi nhánh hiện đang được kiểm tra, điều này rất khó xảy ra với ý nghĩa của người dùng. Tùy chọn không được chấp nhận; thay vào đó, hãy sử dụng tùy chọn mới --set-upstream-to(với -utùy chọn ngắn và ngọt ).

Giả sử bạn có một foochi nhánh địa phương và muốn nó đối xử với chi nhánh đó cùng tên với thượng nguồn của nó. Làm cho điều này xảy ra với

$ git branch foo
$ git branch --set-upstream-to=origin/foo

hoặc chỉ

$ git branch --set-upstream-to=origin/foo foo

1
Đây là một giải pháp tốt hơn nhiều
Nils_e

--set-upstream-to=...chỉ là những gì tôi đang tìm kiếm.
Richard

54

Bạn có thể tìm thấy git_remote_branchcông cụ hữu ích. Nó cung cấp các lệnh đơn giản để tạo, xuất bản, xóa, theo dõi và đổi tên các chi nhánh từ xa. Một tính năng hay là bạn có thể yêu cầu một grblệnh giải thích những lệnh git nào nó sẽ thực thi.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb là một viên đá quý ruby ​​có thể được truy cập như được giải thích trên github của họ
mcabrams 18/03/13

6
OP đang đặt câu hỏi về chính Git. Vì vậy, không giới thiệu một công cụ mới có thể sẽ tốt hơn.
zeekvfu

grb là một bí danh cho git-rebase trên bản cài đặt macOS của tôi. Tôi đã không làm điều này :)
Ben Sinclair

53

Trên thực tế cho câu trả lời được chấp nhận để làm việc:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

Chi nhánh địa phương đã theo dõi một chi nhánh, vì vậy chúng tôi có thể giả sử repo từ xa đã được thêm vào.
Doppelganger

Dopplerganger: Xem bình luận của joachim cho câu trả lời được chấp nhận. Dù sao, các giả định dễ dàng khác nhau - điều khiến mọi thứ trở nên thú vị;)
Hedgekey

44

Tôi tin rằng ngay từ Git 1.5.x, bạn có thể tạo một nhánh cục bộ $BRANCHtheo dõi một nhánh từ xa origin/$BRANCH, như thế này.

Cho rằng $BRANCHorigin/$BRANCHtồn tại, và bạn hiện chưa kiểm tra $BRANCH(chuyển đi nếu bạn có), làm:

git branch -f --track $BRANCH origin/$BRANCH

Điều này tái tạo $BRANCHnhư một nhánh theo dõi. Các -flực lượng sáng tạo mặc dù $BRANCHđã tồn tại. --tracklà tùy chọn nếu mặc định thông thường được đặt đúng chỗ (nghĩa là tham số git-config branch.autosetupmergelà đúng).

Lưu ý, nếu origin/$BRANCHchưa tồn tại, bạn có thể tạo nó bằng cách đẩy cục bộ của mình $BRANCHvào kho lưu trữ từ xa bằng:

git push origin $BRANCH

Tiếp theo là lệnh trước để thúc đẩy chi nhánh địa phương thành một nhánh theo dõi.


1
git push origin $BRANCHlà những gì tôi đang tìm kiếm.
Người dùng

Sau khi thử tất cả các loại giải pháp, bao gồm thiết lập một dòng ngược như mô tả ở trên, không có gì hoạt động. Tất cả những gì tôi muốn làm là kéo 1 cam kết mới vào chi nhánh địa phương của mình từ một điều khiển từ xa và ban đầu tôi không thiết lập theo dõi. Lệnh git branch -f --track $BRANCH origin/$BRANCHthực hiện các mẹo.
Dân chủ

38

1- cập nhật dữ liệu meta cục bộ của bạn bằng cách sử dụng: git fetch --all

nhập mô tả hình ảnh ở đây

2- hiển thị các chi nhánh từ xa và cục bộ của bạn bằng cách sử dụng: git chi nhánh -a , xem Ảnh chụp màn hình sau

nhập mô tả hình ảnh ở đây

3- chuyển sang nhánh mục tiêu mà bạn muốn liên kết với điều khiển từ xa: sử dụng

chi nhánh kiểm tra git

thí dụ :

nhập mô tả hình ảnh ở đây

4- Liên kết chi nhánh địa phương của bạn với một chi nhánh từ xa bằng cách sử dụng:

nhánh git --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : để sao chép từ đầu ra của bước 2 "git Branch -r"

Ví dụ sử dụng:

nhập mô tả hình ảnh ở đây


1
Chủ yếu là câu trả lời dễ dàng và đơn giản.
vibs2006

25

Hãy chắc chắn rằng bạn chạy:

git config push.default tracking

để có thể đẩy rắc rối miễn phí


1
Điều này có thể thuận tiện. Tuy nhiên, chúng tôi có thể lưu ý rằng theo git-config(1)trang thủ công, trackingkhông đồng nghĩa với upstream.
FooF

23

Chỉnh sửa .git/configcó lẽ là cách dễ nhất và nhanh nhất. Dù sao đó cũng là những lệnh Git để xử lý các nhánh từ xa đang làm.

Nếu bạn không muốn làm quen với tệp bằng tay (và điều đó không khó thực hiện), bạn luôn có thể sử dụng git configđể làm điều đó ... nhưng một lần nữa .git/config, dù sao thì đó cũng chỉ là chỉnh sửa tệp.

Tất nhiên, có nhiều cách để tự động theo dõi một nhánh từ xa khi sử dụng git checkout( --trackví dụ bằng cách chuyển cờ), nhưng các lệnh này hoạt động với các nhánh mới , không phải các nhánh hiện có.


18

Rất ngắn

git branch --set-upstream yourLocalBranchName origin/develop

Điều này sẽ làm cho yourLocalBranchNametheo dõi của bạn các chi nhánh từ xa được gọi develop.


1
@Quincy Kiểm tra câu trả lời của greg - sử dụng git push -u origin branch(hoặc --set-upstream-to) thay vào đó
Tobias Kienzler

@MadNik, sự khác biệt giữa --set-upstreamvà là --trackgì? Tôi không hiểu tại sao tôi nên sử dụng cái này hơn cái kia.
Acumenus

15

Đối với 1.6.x, có thể được thực hiện bằng công cụ git_remote_branch :

grb track foo upstream

Điều đó sẽ khiến Git footheo dõi upstream/foo.


12

Tôi sử dụng lệnh sau (Giả sử tên chi nhánh địa phương của bạn là "tên chi nhánh-địa phương" và tên chi nhánh từ xa là "chi nhánh-tên-từ xa"):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Nếu cả hai nhánh cục bộ và từ xa có cùng tên, thì chỉ cần làm như sau:

$ git branch --set-upstream-to=origin/branch-name branch-name

Bạn đảo ngược "tên chi nhánh" và "nguồn gốc / tên chi nhánh" trên dòng lệnh. Thượng nguồn đến trước địa phương.
maharvey67

@ maharvey67 bạn nói đúng, cảm ơn. Chỉnh sửa câu trả lời.
yrazlik

Đây là vàng, cảm ơn bạn, cũng bởi vì không có lựa chọn nào trong câu trả lời được chấp nhận là ổn khi bạn có dấu gạch chéo trong tên chi nhánh
JBoy

8

Ở đây, sử dụng githubgit version 2.1.4, chỉ cần làm:

$ git clone git@github.com:user/repo.git

Và điều khiển từ xa đến bởi itelsef, ngay cả khi không được liên kết cục bộ:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Nhưng tất nhiên, vẫn không có chi nhánh địa phương:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Xem? Bây giờ nếu bạn chỉ cần kiểm tra develp, nó sẽ tự động thực hiện phép thuật:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Quá dễ!


Tóm lược. Chỉ cần chạy 2 lệnh này:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
Một ví dụ tuyệt vời về trường hợp sử dụng giống hệt của tôi. Mặc dù không có dấu hiệu của nhánh 'phát triển' cục bộ, khi tôi kiểm tra nhánh 'phát triển' mà nhánh đó xuất hiện và được thiết lập một cách kỳ diệu để theo dõi nhánh từ xa 'phát triển' từ nguồn gốc. Tôi đánh giá cao các ví dụ từng bước và giải thích!
ElliotPsyIT 27/03/18

8

Sử dụng tùy chọn '--track'

  • Sau một git pull:

    git checkout --track <remote-branch-name>

  • Hoặc là:

    git fetch && git checkout <branch-name>


7

Để tạo chi nhánh mới, chúng ta có thể sử dụng lệnh sau

 kiểm tra git --track -b ví dụ nguồn gốc / ví dụ 
Đối với nhánh đã được tạo để tạo liên kết giữa từ xa thì từ nhánh đó sử dụng lệnh bên dưới

 chi nhánh git -u nguồn gốc / tên chi nhánh từ xa


5

Đây không phải là câu trả lời trực tiếp cho câu hỏi này, nhưng tôi muốn để lại một ghi chú ở đây cho bất kỳ ai có thể gặp vấn đề tương tự như tôi khi cố gắng định cấu hình một nhánh ngược dòng.

Hãy cảnh giác với Push.default .

Với các phiên bản git cũ hơn, mặc định là khớp , điều này sẽ gây ra hành vi rất không mong muốn nếu bạn có, ví dụ:

Theo dõi "master" chi nhánh địa phương đến nguồn gốc / master

Theo dõi "ngược dòng" nhánh từ xa đến thượng nguồn / chính

Nếu bạn đã cố gắng "git đẩy" khi ở nhánh "ngược dòng", với git phù hợp với Push.default sẽ tự động cố gắng hợp nhất "master" của nhánh cục bộ thành "ngược dòng / master", gây ra rất nhiều hỗn loạn.

Điều này cho hành vi lành mạnh hơn:

git config --global Push.default ngược dòng


Bạn đã không để điều này vô ích. Cảm ơn.
stefgosselin

4

Theo một cách hơi liên quan, tôi đã cố gắng thêm một nhánh theo dõi từ xa vào một nhánh hiện có, nhưng không có quyền truy cập vào kho lưu trữ từ xa đó trên hệ thống mà tôi muốn thêm nhánh theo dõi từ xa đó (vì tôi thường xuất một bản sao của điều này repo qua sneakernet đến một hệ thống khác có quyền truy cập để đẩy đến điều khiển từ xa đó). Tôi thấy rằng không có cách nào để buộc thêm một chi nhánh từ xa vào địa phương chưa được tìm nạp (vì vậy địa phương không biết rằng chi nhánh tồn tại trên điều khiển từ xa và tôi sẽ gặp lỗi the requested upstream branch 'origin/remotebranchname' does not exist:).

Cuối cùng, tôi đã quản lý để thêm nhánh từ xa mới, chưa biết trước đó (không tìm nạp) bằng cách thêm một tệp đầu mới vào .git/refs/remotes/origin/remotebranchnamevà sau đó sao chép ref (nhãn cầu là nhanh nhất, khập khiễng ;-) từ hệ thống có quyền truy cập vào nguồn gốc repo vào máy trạm (với repo cục bộ nơi tôi đã thêm nhánh từ xa vào).

Khi đã xong, tôi có thể sử dụng git branch --set-upstream-to=origin/remotebranchname


3

hoặc đơn giản bằng cách:

chuyển sang chi nhánh nếu bạn chưa ở trong đó:

[za]$ git checkout branch_name

chạy

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

và bạn đã sẵn sàng:

 [za]$ git push origin branch_name

Bạn có thể xem các tập tin cấu hình để xem những gì đang theo dõi những gì bằng cách chạy:

 [za]$ git config -e

Thật tuyệt khi biết điều này, nó cho thấy nhánh nào được theo dõi và nhánh nào không. :

  [za]$ git remote show origin 

0

Đối với bất kỳ ai, giống như tôi, chỉ muốn đồng bộ hóa tên chi nhánh địa phương của bạn với tên chi nhánh từ xa, đây là một lệnh tiện dụng:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

Để tránh nhớ những gì bạn cần làm mỗi khi bạn nhận được tin nhắn:

Vui lòng chỉ định chi nhánh bạn muốn hợp nhất với. Xem git-pull (1)
để biết chi tiết.
.....

Bạn có thể sử dụng tập lệnh sau đây đặt nguồn gốc là ngược dòng cho nhánh hiện tại bạn đang ở.

Trong trường hợp của tôi, tôi gần như không bao giờ đặt thứ gì khác ngoài nguồn gốc làm dòng ngược mặc định . Ngoài ra tôi hầu như luôn giữ cùng tên chi nhánh cho chi nhánh địa phương và từ xa. Vì vậy, những điều sau đây phù hợp với tôi:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

Điều này cũng sẽ làm việc

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
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.