Câu hỏi Hành vi mặc định của "git push" mà không có một nhánh cụ thể


Tôi sử dụng lệnh sau để đẩy đến nhánh từ xa của mình:

git push origin sandbox

Nếu tôi nói

git push origin

điều đó cũng làm thay đổi các nhánh khác của tôi hay chỉ cập nhật nhánh hiện tại của tôi? Tôi có ba chi nhánh: master, production và sandbox.

Các git push tài liệu không rõ ràng về điều này, vì vậy tôi muốn làm rõ điều này cho tốt.

Những nhánh và điều khiển từ xa nào làm như sau git push lệnh cập nhật chính xác?

git push 
git push origin

origin ở trên là một điều khiển từ xa.

tôi hiểu điều đó git push [remote] [branch] sẽ chỉ đẩy chi nhánh đó vào điều khiển từ xa.


1214
2018-06-04 02:45


gốc


Về cấu hình của các công cụ khác nhau nói chung, và kịch bản mới git difftool, tôi đã thêm một câu trả lời mới trong câu hỏi SO khác: stackoverflow.com/questions/255202/… - VonC
Tôi đã làm một bài viết trên blog về hành vi đáng ngạc nhiên của git push, có thể quan tâm - Mark Longair
@Mark: trong công việc khác, chỉ đẩy chi nhánh hiện tại vào tuyến thượng nguồn được theo dõi của nó. Tốt đẹp. - VonC
stackoverflow.com/q/13148066/2157640 - Palec
help.github.com/articles/pushing-to-a-remote đặt liên kết này ở đây để được trợ giúp ngay lập tức cho những người mới như tôi - MycrofD


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


Bạn có thể kiểm soát hành vi mặc định bằng cách đặt push.default trong cấu hình git của bạn. Từ tài liệu git-config (1):

push.default

Xác định hành động git push nên dùng nếu không có refspec được đưa ra trên dòng lệnh, không có refspec được cấu hình trong điều khiển từ xa, và không có refspec được ngụ ý bởi bất kỳ tùy chọn nào được đưa ra trên dòng lệnh. Các giá trị có thể là:

  • nothing: không đẩy bất cứ điều gì

  • matching: đẩy tất cả các nhánh phù hợp

    Tất cả các nhánh có cùng tên ở cả hai đầu đều được coi là phù hợp.

    Đây là mặc định trong Git 1.x.

  • upstream: đẩy nhánh hiện tại vào nhánh ngược dòng của nó (tracking là một từ đồng nghĩa không dùng nữa cho thượng nguồn)

  • current: đẩy chi nhánh hiện tại vào chi nhánh cùng tên

  • simple: (mới trong Git 1.7.11) như ngược dòng, nhưng từ chối đẩy nếu tên của nhánh thượng nguồn khác với tên của địa phương

    Đây là lựa chọn an toàn nhất và rất phù hợp cho người mới bắt đầu.

    Điều này sẽ trở thành mặc định trong Git 2.0.

Các chế độ đơn giản, hiện tại và ngược dòng dành cho những người muốn đẩy ra một nhánh đơn lẻ sau khi hoàn thành công việc, ngay cả khi các nhánh khác chưa sẵn sàng để được đẩy ra

Ví dụ dòng lệnh:

Để xem cấu hình hiện tại:

git config --global push.default

Để đặt cấu hình mới:

git config --global push.default current

1424
2018-06-04 03:16



Có thể đáng lưu ý rằng đây là tính năng mới trong v1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt - CB Bailey
Điều này "push.default" là điều lớn nhất từng làm việc với nhiều repos. Đặt nó thành "theo dõi" và tất cả các bạn đều tốt. Kết hợp với nhánh - set-upstream làm cho việc đẩy và kéo thuận tiện hơn. - jpswain
"theo dõi" là từ đồng nghĩa không dùng nữa cho "ngược dòng": kernel.org/pub/software/scm/git/docs/git-config.html - MartinVonMartinsgrün
Điều đáng chú ý là kể từ Git 1.7.11, có một simple chế độ. Chế độ này được dự định trở thành mặc định trong tương lai. simple hoạt động như upstream, nhưng tôi thích current yêu cầu tên nhánh giống nhau ở cả hai đầu. - Kai
Điều đáng chú ý là Git 2.0 simple hành vi bây giờ là mặc định. - do0g


git push origin sẽ đẩy tất cả các thay đổi trên các nhánh địa phương có các nhánh từ xa khớp nhau tại origin Như cho git push 

Hoạt động như git push <remote>, Ở đâu <remote> là từ xa của nhánh hiện tại (hoặc nguồn gốc, nếu không có cấu hình từ xa nào cho nhánh hiện tại).

Từ phần Ví dụ của git-push trang người đàn ông


197
2017-10-06 10:45



Đúng, điều đó làm cho nó rõ ràng. Tôi có thể chạy một phiên bản cũ của git (1.6.1.1 Mac OS X) mà không có những ví dụ này trong trang người đàn ông. - PlagueHammer
Có lẽ tôi đang chạy 1.6.3.1. Tôi đã tìm thấy nó trên trang web tôi liên kết tuy nhiên. - baudtack
Vì vậy, trong trường hợp của tôi, nơi tất cả các nhánh địa phương có cùng "nguồn gốc" từ xa, "git push" sẽ chính xác giống như "git push origin", chỉ đẩy các nhánh cục bộ có nhánh tương ứng trong điều khiển từ xa. - PlagueHammer
@ Debajit Ngay trên! Câu hỏi tuyệt vời bằng cách này. Tôi đã luôn luôn giả định rằng git push sẽ chỉ đẩy nhánh hiện tại. Rõ ràng là không! Rất tốt để biết. - baudtack
Câu hỏi này là cũ nhưng đối với bất kỳ ai mới, @docgnome là đúng. Chỉ cần chạy 'git push origin' sẽ đẩy tất cả các nhánh thay vì chỉ nhánh hiện tại. Sử dụng 'git push -f -v -n origin development' để đẩy một nhánh có tên phát triển. Sử dụng cờ -n để mô phỏng kết quả đẩy git để bạn có thể thấy trước chi nhánh nào sẽ bị ảnh hưởng. Nếu nó có vẻ tốt thì hãy chạy 'git push -f -v origin development'. Điều này có thể hữu ích stackoverflow.com/questions/3741136/git-push-f-vs - Dylan Valade


Bạn có thể thiết lập hành vi mặc định cho git của bạn với push.default

git config push.default current

hoặc nếu bạn có nhiều kho lưu trữ và muốn như vậy cho tất cả thì

git config --global push.default current

Các hiện hành trong thiết lập này có nghĩa là theo mặc định, bạn sẽ chỉ đẩy nhánh hiện tại khi bạn làm git push

Các tùy chọn khác là:

  • không có gì: Đừng đẩy bất cứ điều gì
  • khớp: Đẩy tất cả các nhánh phù hợp (mặc định)
  • theo dõi: Đẩy nhánh hiện tại vào bất kỳ nhánh nào đang theo dõi
  • hiện tại: Đẩy nhánh hiện tại

CẬP NHẬT - CÁCH MỚI LÀM VIỆC NÀY

Kể từ Git 1.7.11, hãy làm như sau:

git config --global push.default simple

Đây là một cài đặt mới được giới thiệu hoạt động giống như hiện tại và sẽ được đặt mặc định thành git từ v 2.0 theo tin đồn


194
2017-11-06 10:05



Có, tôi đã đọc câu trả lời mà bạn đang đề cập đến, nhưng câu trả lời đó chỉ cho biết phải làm gì và không phải cách thực hiện. Vì vậy, tôi đã thêm câu trả lời của mình để tất cả thông tin cần thiết để thiết lập trên cùng một trang. - Christoffer
ĐƯỢC; tốt hơn là đề xuất chỉnh sửa cho bài đăng đã nói, bởi vì không ai sẽ nhìn thấy câu trả lời của bạn vì nó không có khả năng nhận được nhiều phiếu bầu - CharlesB
làm thế nào sẽ đi về kéo đến chi nhánh hiện tại? git pull origin? - Francois


Tôi chỉ cam kết mã của tôi cho một chi nhánh và đẩy nó vào github, như thế này:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

55
2017-08-09 08:02



Bạn có thể ngưng cam kết thành `git commit -am" ... "` - James Harrington
Câu trả lời này có liên quan gì đến câu hỏi này không ?? :? - Asim K T


Đây là một thông tin hữu ích và hữu ích về Git Push: Git Push: Chỉ cần Mẹo

Việc sử dụng git push phổ biến nhất là đẩy các thay đổi cục bộ của bạn vào kho lưu trữ ngược dòng công khai của bạn. Giả sử rằng ngược dòng là một remote tên là "origin" (tên mặc định từ xa nếu kho lưu trữ của bạn là một bản sao) và nhánh được cập nhật tới / từ được đặt tên là "master" (tên nhánh mặc định), điều này được thực hiện với: git push origin master

git push origin sẽ đẩy các thay đổi từ tất cả các nhánh địa phương để phù hợp với các nhánh gốc từ xa.

git push origin master sẽ đẩy các thay đổi từ nhánh chính cục bộ đến nhánh chủ từ xa.

git push origin master:staging sẽ đẩy các thay đổi từ nhánh chính cục bộ đến nhánh dàn từ xa nếu nó tồn tại.


22
2018-03-17 11:13



git push origin branch_name vì một số lý do không chỉ đẩy branch_name chi nhánh, mà còn các chi nhánh địa phương khác của tôi (git phiên bản 1.9.1). - mrgloom
git push origin master:staging là một viên ngọc ẩn tuyệt vời! - Shakeel


(Tháng 3 năm 2012)
Hãy coi chừng: mặc định "matching"chính sách có thể sớm thay đổi
(đôi khi sau git1.7.10 +)
:

Xem "Hãy thảo luận: những gì "git push" nên làm gì khi bạn không nói những gì để đẩy?"

Trong cài đặt hiện tại (I E. push.default=matching), git push không có đối số sẽ đẩy tất cả các nhánh tồn tại cục bộ và từ xa có cùng tên.
  Điều này thường thích hợp khi một nhà phát triển đẩy đến kho lưu trữ công cộng của riêng mình, nhưng có thể gây nhầm lẫn nếu không nguy hiểm khi sử dụng kho lưu trữ được chia sẻ.

Đề xuất này là thay đổi mặc định thành 'upstream', tức là chỉ đẩy nhánh hiện tại và đẩy nó vào nhánh git pull sẽ kéo.
  Một ứng viên khác là 'current'; điều này chỉ đẩy nhánh hiện tại đến nhánh từ xa cùng tên.

Những gì đã được thảo luận cho đến nay có thể được nhìn thấy trong chủ đề này:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Các cuộc thảo luận liên quan trước đây bao gồm:

Để tham gia thảo luận, hãy gửi tin nhắn của bạn tới: git@vger.kernel.org


19
2018-03-15 00:50





Tôi chỉ cần đặt điều này trong phần bí danh .gitconfig của tôi và yêu thích cách nó hoạt động:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Sẽ đẩy chi nhánh hiện tại xuất phát git pub hoặc một repo khác với git pub repo-name. Ngon.


17
2018-06-04 02:49



Đó là tốt đẹp, nhưng nó không may giả định rằng chi nhánh có cùng tên trên kho lưu trữ khác. Thử git push -u --repo="origin" $1; thay thế. Nó hoạt động khá tốt, trừ khi bạn đẩy đến một kho lưu trữ khác, tên chi nhánh sẽ là tên được sử dụng bởi kho lưu trữ khác, không phải tên bạn đang đẩy từ - Casebash
Này cảm ơn nhé! Làm cho tôi muốn làm một phiên bản hoàn chỉnh hơn để kiểm tra tình trạng theo dõi trước khi đẩy. Nhưng tôi sẽ gắn bó với tôi từ bây giờ vì tôi hiếm khi có tên chi nhánh khác nhau giữa repos. - Mat Schaffer