Chính xác thì những gì mà những người khác làm được? Mẹ git đẩy -u nguồn gốc Master vs vs git đẩy nguồn gốc master


333

Tôi rõ ràng là khủng khiếp khi sử dụng git, mặc dù tôi đã cố gắng để hiểu nó.

Từ kernel.org cho git push:

-u

--set-thượng nguồn

Đối với mỗi nhánh được cập nhật hoặc được đẩy thành công, hãy thêm tham chiếu ngược dòng (theo dõi), được sử dụng bởi git-pull (1) không có đối số (1) và các lệnh khác. Để biết thêm thông tin, xem branch.<name>.mergetrong git-config (1).

Dưới đây là branch.<name>.mergetừ git config:

branch.<name>.merge

Xác định, cùng với branch.<name>.remote, nhánh ngược dòng cho nhánh đã cho. Nó báo cho git fetch / git kéo nhánh nào để hợp nhất và cũng có thể ảnh hưởng đến git đẩy (xem push.default). Khi ở nhánh <name>, nó báo cho git tìm nạp refspec mặc định được đánh dấu để hợp nhất trong FETCH_HEAD. Giá trị được xử lý như phần từ xa của một refspec và phải khớp với một ref được lấy từ xa được cung cấp bởi "branch.<name>.remote". Thông tin hợp nhất được sử dụng bởi git pull (lúc đầu gọi git fetch) để tra cứu nhánh mặc định để hợp nhất. Không có tùy chọn này, git pull mặc định để hợp nhất refspec đầu tiên được tìm nạp. Chỉ định nhiều giá trị để có được một kết hợp bạch tuộc. Nếu bạn muốn thiết lập git pull để nó hợp nhất <name>từ một nhánh khác trong kho lưu trữ cục bộ, bạn có thể trỏbranch.<name>.mergeđến nhánh mong muốn và sử dụng cài đặt đặc biệt. (giai đoạn) cho branch.<name>.remote.

Tôi thành công thiết lập một kho lưu trữ từ xa với github, và tôi đẩy thành công đầu tiên của tôi cam kết nó với:

git push -u origin master

Sau đó, tôi vô tình đẩy thành công lần thứ hai vào kho lưu trữ từ xa bằng cách sử dụng:

git commit -m '[...]'

Tuy nhiên, nghĩ không chính xác tôi sẽ phải đẩy lại origintừ đó master, tôi chạy:

# note: no -u
git push origin master

Chuyện đó làm gì? Nó dường như không có bất kỳ ảnh hưởng nào cả. Tôi đã "hoàn tác" git push -u origin master?


43
I'm apparently terrible at using git, despite my best attempts to understand it.- Tôi chưa bao giờ có ai đó tái tạo tôi tốt như vậy.
dgo

Câu trả lời:


335

Chìa khóa là "git-pull-argument". Khi bạn thực hiện git pulltừ một nhánh, mà không chỉ định từ xa nguồn hoặc nhánh, git nhìn vào branch.<name>.mergecài đặt để biết nơi cần kéo. git push -uthiết lập thông tin này cho chi nhánh bạn đang đẩy.

Để thấy sự khác biệt, hãy sử dụng một nhánh trống mới:

$ git checkout -b test

Đầu tiên, chúng tôi đẩy mà không -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

Bây giờ nếu chúng ta thêm -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Lưu ý rằng thông tin theo dõi đã được thiết lập để git pullhoạt động như mong đợi mà không chỉ định điều khiển từ xa hoặc chi nhánh.

Cập nhật: Tiền thưởng:

  • Như Mark đề cập trong một bình luận, ngoài git pullcài đặt này cũng ảnh hưởng đến hành vi mặc định của git push. Nếu bạn có thói quen sử dụng -uđể chụp nhánh từ xa mà bạn định theo dõi, tôi khuyên bạn nên đặt push.defaultgiá trị cấu hình của mình thành upstream.
  • git push -u <remote> HEADsẽ đẩy chi nhánh hiện tại đến một chi nhánh cùng tên trên <remote>(và cũng thiết lập theo dõi để bạn có thể thực hiện git pushsau đó).

4
git push <remote> <branch>làm cho mọi thứ rõ ràng . Nếu bạn rời khỏi điều khiển từ xa hoặc chi nhánh, bạn sẽ quay lại cài đặt cấu hình nhánh, được đặt cho bạn git push -u.
dahlbyk

2
@dahlbyk Tôi đã đi trước và đánh dấu bạn là câu trả lời, nhưng nhận xét đó phần nào làm tôi bối rối. Trong câu trả lời của bạn, bạn đã chứng minh rằng git đã bị nhầm lẫn sau git push origin test(điều này không có -u). Sau đó, bạn đã cho thấy rằng git push -u origin test loại bỏ sự mơ hồ. Có một lỗi đánh máy, hoặc tôi chỉ là dày đặc một lần nữa?
ClosCowboy

1
Tôi nghĩ chúng ta đang nói chuyện với nhau. :) Khi tôi nói git push <remote> <branch>là không rõ ràng, tôi có nghĩa là liên quan đến git pushcấu hình nhánh. Tương tự, git pull <remote> <branch>không rõ ràng và git pulldựa vào cấu hình nhánh. Khi bạn đã cố gắng -u, cả hai git pushgit pullsẽ hoạt động như mong đợi.
dahlbyk

10
@dahlbyk: Câu trả lời của bạn là tốt, nhưng trong các nhận xét của bạn ở trên, bạn lặp lại một quan niệm sai lầm phổ biến về git push- trừ khi bạn push.defaulttự đặt ra , git pushchỉ sử dụng cấu hình nhánh ngược dòng để quyết định nên cập nhật từ xa nào, không phải chi nhánh từ xa để cập nhật.
Mark Longair

1
Cách thực hành tốt nhất cho git là git push origin mastervà tương tự với IE bên kia. git pull origin master.. Vì vậy, nếu giả sử chi nhánh thay đổi thì bạn có thể git push origin branch_namevà tương tự với IE bên kia. git pull origin branch_name
Arpit Vaishnav

87
git push -u origin master

Sầu giống như:

git push origin master ; git branch --set-upstream master origin/master

Làm tuyên bố cuối cùng, nếu bạn quên -u!

Hoặc bạn có thể buộc nó:

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

Nếu bạn để lệnh thực hiện nó cho bạn, nó sẽ chọn các lỗi của bạn như nếu bạn gõ một nhánh không tồn tại hoặc bạn đã không làm git remote add; mặc dù đó có thể là những gì bạn muốn :)


1
BTW masterchỉ là một ví dụ :)
sabgenton

Ok, bit thứ hai hiện đã được khấu hao trong các phiên bản mới hơn cho: git branch master -u origin/masterchi tiết @ stackoverflow.com/a/2286030/790359
sabgenton

2
Nếu bạn quên sử dụng -utùy chọn, gõ git push -ungay lập tức sẽ ổn.
zeekvfu

1
Các phiên bản mới hơn của git chỉ ra rằng --setup-upstreamsẽ không được chấp nhận: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag

--set-upflow bị phản đối, bây giờ nó hoạt động:git branch --set-upstream-to=origin/master master
Alberto Perez

43

Nói một cách đơn giản hơn:

Về mặt kỹ thuật, -ucờ thêm một tham chiếu theo dõi đến máy chủ ngược dòng mà bạn đang đẩy tới.

Điều quan trọng ở đây là điều này cho phép bạn thực hiện git pullmà không cần cung cấp thêm bất kỳ đối số nào. Ví dụ, một khi bạn làm a git push -u origin master, sau này bạn có thể gọi git pullvà git sẽ biết rằng bạn thực sự có ý gì git pull origin master.

Nếu không, bạn phải gõ toàn bộ lệnh.


1
Vì vậy, nếu tôi đặt -ucờ cho orgin mastermỗi lần kéo tiếp theo sẽ đề cập đến nó. Và nếu tôi muốn thay đổi git pullhành vi tôi nên chạy git push -u origin some_other_branchgit pullbây giờ sẽ đề cập đến some_other_branch? Cảm ơn bạn!
Toma Tomov

1
chúng ta cũng có thể sử dụng "git đẩy" thay vì sử dụng "git push origin master" không?
cegprakash

Có, bạn có thể @cegprakash. Tuy nhiên, ban đầu bạn đã thực hiện mộtgit push -u origin master
Adépòjù Olúwáségun

-11

Tất cả các lệnh git bash cần thiết để đẩy và kéo vào Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Nếu bạn muốn chỉnh sửa một tập tin thì:

edit filename.* 

Để xem tất cả các chi nhánh và cam kết của họ:

git show-branch

4
Tôi nghĩ rằng bạn đã trả lời ra khỏi phạm vi của câu hỏi.
Adépòjù Olúwáségun
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.