Câu hỏi Tại sao tôi cần phải làm `--set-upstream` mọi lúc?


Tôi tạo một nhánh mới trong Git:

git branch my_branch

Đẩy nó:

git push origin my_branch

Bây giờ nói ai đó đã thực hiện một số thay đổi trên máy chủ và tôi muốn kéo origin/my_branch. Tôi làm:

git pull

Nhưng tôi nhận được:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Tôi đã học được rằng tôi có thể làm cho nó hoạt động với:

git branch --set-upstream my_branch origin/my_branch

Nhưng tại sao tôi cần phải làm điều này cho mỗi nhánh tôi tạo ra? Không rõ ràng là nếu tôi đẩy my_branch vào origin/my_branch, sau đó tôi muốn kéo origin/my_branch vào my_branch? Làm cách nào để tôi có thể thực hiện hành vi mặc định này?


1060
2018-05-22 16:39


gốc


Giá trị mặc định cho branch.autosetupmerge có nghĩa là cấu hình ngược dòng cho chi nhánh mới chỉ được đặt tự động khi tạo chi nhánh từ một nhánh theo dõi từ xa (ví dụ: <remote-name>/<branch-name>) (xem git-config (1)). Có thể bạn đang tạo các chi nhánh của mình từ các chi nhánh địa phương hiện có. Nếu bạn đang phân nhánh một cách hiệu quả trực tiếp từ đầu của một nhánh từ xa (mặc dù đang ở trên nhánh địa phương), thì bạn có thể sử dụng git branch my_branch <remote-name>/<branch-name> để tự động thiết lập cấu hình ngược dòng. - Chris Johnsen
FYI, --set-upstream tùy chọn không được chấp nhận. Bạn nên sử dụng --track hoặc là --set-upstream-to thay thế. - Sean the Bean
nếu --set-upstream không được chấp nhận, sau đó có lẽ git devs sẽ xóa nó khỏi tin nhắn trợ giúp được hiển thị khi bạn chạy git push không có tùy chọn và không có thượng nguồn được thiết lập? - Christopher Hunter
@ChristopherHunter Đã hơn một năm kể từ khi nhận xét của bạn và nó vẫn nói rằng. Nó chỉ là một phản hồi cẩu thả hoặc có lẽ là có một lý do kỹ thuật khôn ngoan để giữ nó xung quanh mà chúng ta không biết gì về? - Konrad Viltersten
Đối với những người khác tìm kiếm một lớp lót mới hơn (post git 2.0): BRANCH=$(git symbolic-ref --short HEAD) && git branch --set-upstream-to=origin/$BRANCH $BRANCH - jrhorn424


Các câu trả lời:


Một phím tắt, không phụ thuộc vào việc nhớ cú pháp cho git branch --set-upstream  1 là để làm:

git push -u origin my_branch

... lần đầu tiên bạn đẩy nhánh đó. Bạn chỉ cần làm điều đó một lần và thiết lập mối liên hệ giữa chi nhánh của bạn và chi nhánh tại origin cùng một cách git branch --set-upstream làm.

Cá nhân, tôi nghĩ rằng đó là một điều tốt để có để thiết lập mối liên hệ giữa chi nhánh của bạn và một trên điều khiển từ xa một cách rõ ràng. Nó chỉ là một sự xấu hổ rằng các quy tắc là khác nhau cho git push và git pull.


1 Nó có thể âm thanh ngớ ngẩn, nhưng tôi rất thường xuyên quên chỉ định nhánh hiện tại, giả sử đó là mặc định - nó không phải, và kết quả là khó hiểu nhất :)

Cập nhật 2012-10-11: Rõ ràng tôi không phải là người duy nhất thấy dễ mắc sai lầm! Nhờ vào VonC để chỉ ra rằng git 1.8.0 giới thiệu rõ ràng hơn git branch --set-upstream-to, có thể được sử dụng như sau, nếu bạn đang ở trên chi nhánh my_branch:

git branch --set-upstream-to origin/my_branch

... hoặc với tùy chọn ngắn:

git branch -u origin/my_branch

Sự thay đổi này và lý do của nó, được mô tả trong các ghi chú phát hành cho git 1.8.0, phát hành ứng cử viên 1:

Thật là hấp dẫn khi nói git branch --set-upstream origin/master, nhưng điều đó bảo Git phải sắp xếp chi nhánh địa phương origin/master để tích hợp với chi nhánh hiện đã đượ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; sử dụng mới --set-upstream-to (với một cái ngắn và ngọt -u) để thay thế.


1201
2018-05-22 16:58



Cũng lưu ý rằng ngay cả khi bạn quên -u lần đầu tiên bạn đẩy, bạn có thể chạy lại lần nữa với cờ đó và nó sẽ bắt đầu theo dõi. - Henrik N
Không ai trong số này đáp ứng trường hợp sử dụng của việc sử dụng git push mà không có đối số. Tôi vẫn phải nhớ 'git push -u xuất phát nhánh của tôi' khi di chuyển chi nhánh mới của tôi sang điều khiển từ xa lần đầu tiên. - Karl the Pagan
Lưu ý về bản thân: một lời giải thích đầy đủ hơn cho lần đầu tiên git push -u origin master: stackoverflow.com/a/17096880/6309 - VonC
Tôi ghét nhớ cú pháp đó, vì vậy tôi đã tạo bí danh sau: alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')" - lillialexis
Điều này là tốt, nhưng tôi vẫn nghĩ rằng khiếu nại của OP là hợp lệ. Bạn bắt đầu một chi nhánh địa phương, làm việc trên nó, đẩy nó vào nguồn gốc để chia sẻ (không có args); tại sao không nên thiết lập thượng nguồn? Có thực sự mong muốn vì một lý do nào đó KHÔNG được thiết lập ngược dòng khi đẩy nhánh mới vào điều khiển từ xa không? - GaryO


Bạn có thể làm điều này xảy ra với ít đánh máy hơn. Đầu tiên, thay đổi cách hoạt động của bạn:

git config --global push.default current

Điều này sẽ suy ra origin my_branch một phần, do đó bạn có thể làm:

git push -u

Cả hai sẽ tạo ra chi nhánh từ xa có cùng tên và theo dõi nó.


968
2018-04-08 10:14



Làm thế nào đến có thể git suy ra origin khi chạy git push -u cho chi nhánh mới được tạo trong kho lưu trữ mới được tạo ra? Giả định rằng kho lưu trữ đã được nhân bản sao cho nhánh hiện tại có bộ từ xa của nó để origin? - Piotr Dobrogost
Đây phải là mặc định. Vì vậy, nhiều thứ trong git có thể thân thiện với người dùng hơn nếu nó chỉ được vận chuyển với các giá trị mặc định tốt hơn. - phreakhead
Hãy nhận biết rằng 'hiện tại' hơi không an toàn hơn bằng cách sử dụng 'đơn giản' để làm điều tương tự, hãy xem stackoverflow.com/questions/23918062/… - Air
Điều này cũng hoạt động mà không cần -u. - pstryk
Nó có, nhưng sau đó khi bạn cố gắng pull bạn sẽ phải chỉ định từ đâu. Các -u thiết lập theo dõi chi nhánh giữa nguồn gốc và repo địa phương của bạn. - Zamith


Bạn có thể đơn giản

git checkout -b my-branch origin/whatever

ngay từ đầu. Nếu bạn đặt branch.autosetupmerge hoặc là branch.autosetuprebase (yêu thích của tôi) đến always (mặc định là true), my-branch sẽ tự động theo dõi origin/whatever.

Xem git help config.


70
2018-03-17 20:04



Điều này tạo ra "tử vong: Không thể cập nhật đường dẫn và chuyển sang nhánh 'nhánh của tôi' cùng một lúc." - Karl the Pagan
@ Karl, lỗi hiếm gặp đó được giải thích đây. - cdunn2001
Nhân tiện, tôi thường chỉ git checkout -t origin/whatever, cũng chọn whatever làm tên chi nhánh mới. Rât thuận tiện! - cdunn2001
@cdunn Đây là một trong những lý tưởng, nhưng hầu như không phù hợp. Lá cờ nên được gọi là -u/--set-upstream. - Tobu
git checkout -t origin/whatever không hoạt động cho tôi khi cố gắng tạo chi nhánh mới: fatal: Cannot update paths and switch to branch 'whatever' at the same time. - wisbucky


Bạn có thể thiết lập đơn giản hơn theo hai cách. Đầu tiên khi bạn tạo chi nhánh:

git branch -u origin/my-branch

hoặc sau khi bạn đã tạo một chi nhánh, bạn có thể sử dụng lệnh này.

git push -u origin/my-branch

Bạn cũng có thể chi nhánh, kiểm tra và thiết lập luồng trong một lệnh duy nhất:

git checkout -b my-branch -t origin/my-branch

Sở thích cá nhân của tôi là làm điều này trong một lệnh hai bước:

git checkout -b my-branch
git push -u origin/my-branch

45
2018-03-17 13:28



Câu trả lời chính xác! Địa chỉ cả hai trường hợp sử dụng phổ biến. Sau khi chạy git branch -u origin/my-branch tôi có thể chạy git pull để kéo các thay đổi của tôi xuống. - Ben Atkin
Điều này cần phải là câu trả lời được chấp nhận - Etienne Marais
"git checkout -b my-branch -t origin / my-branch" này không hoạt động nếu 'origin / my-branch' chưa tồn tại. - Spongman
Bạn thực sự chỉ có thể làm git checkout -t origin/my-branch không có -b my-branch, nó sẽ tự động suy ra my-branch cho tên chi nhánh địa phương. Tuy nhiên, như @Spongman đã đề cập, lệnh này không hoạt động nếu origin/my-branch không tồn tại trước. - wisbucky
Có, sẽ làm việc @ wisbucky, -t hoạt động tốt. Cá nhân mặc dù, thậm chí hai năm sau khi tôi đã viết câu trả lời đó mặc dù, tôi vẫn thích chia tách trong hai dòng với checkout -b và đẩy -u. Nó rõ ràng hơn và không có lỗi khi kiểm tra -b khi tôi không có điều khiển từ xa - điều này xảy ra khá thường xuyên khi thử nghiệm :) - Tzen


Bạn có thể dùng:

git config --global branch.autosetupmerge luôn

sẽ liên kết nhánh ngược dòng mỗi khi bạn tạo hoặc thanh toán chi nhánh mới.

Xem https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Điều này cũng làm việc với autosetuprebase, nếu bạn làm theo quy trình làm việc tập trung nhiều hơn, nhưng không sử dụng nó trừ khi bạn biết mình đang làm gì, vì nó sẽ mặc định hành vi kéo của bạn để rebase, điều này có thể gây ra kết quả lạ.


36
2018-04-28 20:05



Không hiệu quả, tôi vẫn nhận được --set-upstream thông điệp - Dorian
@Dorian, Bạn phải thiết lập điều này trước khi bạn tạo chi nhánh. Xem stackoverflow.com/a/9753268/263998 - cdunn2001
Tôi nhận được: tử vong: Chi nhánh ngược dòng của chi nhánh hiện tại của bạn không khớp với tên chi nhánh hiện tại của bạn ... - Riscie
nhưng điều này không đặt nhánh theo dõi làm điều khiển từ xa với cùng một chi nhánh, nhưng với nhánh địa phương hiện tại .. vì vậy khi bạn đẩy nó sẽ cố gắng đẩy đến nhánh LOCAL mà bạn đã tạo trước khi tạo nhánh mới. - Arnold Roa
Điều này thậm chí còn có hành vi weirder hơn mặc định. Nếu bạn căn cứ vào một nhánh, nó hoạt động rất kỳ lạ. - Beefster


Nhân tiện, phím tắt để đẩy chi nhánh hiện tại sang điều khiển từ xa có cùng tên:

$ git push -u origin HEAD

29
2017-09-15 14:20





Đây là cách sử dụng phổ biến nhất của tôi cho The Fuck.

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Ngoài ra, thật thú vị khi gõ các từ chửi thề trong thiết bị đầu cuối của bạn.


27
2017-11-15 17:22





git branch --set-upstream-to=origin/master<branch_name>

11
2018-06-30 04:39