Push.default "đơn giản" so với "hiện tại" trong git cho quy trình làm việc phi tập trung


122

Nói về mặt chức năng, trong quy trình làm việc phi tập trung, tôi không thấy sự khác biệt giữa simplecurrentcác tùy chọn để push.defaultthiết lập cấu hình.

currentsẽ đẩy nhánh hiện tại đến một nhánh có tên giống hệt nhau trên điều khiển từ xa được chỉ định. simplesẽ thực hiện hiệu quả điều tương tự đối với cả điều khiển từ xa được theo dõi và chưa được theo dõi cho nhánh hiện tại (nó thực thi các tên nhánh giống hệt nhau trong cả hai trường hợp).

Ai đó có thể giải thích bất kỳ sự khác biệt quan trọng nào giữa hai quy trình làm việc phi tập trung mà tôi đang thiếu không?



2
@Trevor - điều đó hoàn toàn không liên quan đến câu hỏi của tôi.
void.pointer

Câu trả lời:


185

Sự khác biệt là với simple, git push(không chuyển refspec) sẽ không thành công nếu nhánh hiện tại không theo dõi một nhánh ngược dòng từ xa (ngay cả khi một nhánh có cùng tên tồn tại trên điều khiển từ xa):

$ git checkout -b foo
Switched to a new branch 'foo'

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

    git push --set-upstream origin foo

Mặt khác, currentkhông quan tâm đến việc nhánh hiện tại có theo dõi ngược dòng hay không, nó chỉ muốn đẩy đến bất kỳ nhánh nào có cùng tên:

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo

Tài liệu

Từ tài liệu cấu hình Git :

  • upstream - đẩy nhánh hiện tại lên nhánh ngược dòng của nó ...

  • simple - giống như thượng nguồn, nhưng từ chối đẩy nếu tên của nhánh ngược dòng khác với tên địa phương ...

  • current - Đẩy nhánh hiện tại sang nhánh cùng tên.


4
Tôi đoán câu hỏi "tiền thưởng" duy nhất là "tại sao". Tôi đoán việc buộc một nhánh theo dõi ngược dòng sẽ loại bỏ những sai lầm (vô tình ghi đè nhánh đó trên điều khiển từ xa sai).
void.pointer

7
Đơn giản có vẻ như tùy chọn "dây an toàn" an toàn hơn.
Jonathan

2
Xem lại câu hỏi của chính tôi sau một thời gian dài :-) Làm thế nào currenttôi biết được điều khiển từ xa để chọn? Nếu bạn không có bộ nhánh theo dõi, nó sẽ đẩy đến đâu?
void.pointer

2
Nó đẩy đến điều khiển từ xa mặc định -> có nghĩa là nguồn gốc. Từ man git-push: Khi dòng lệnh không chỉ định nơi cần đẩy với đối số <repository>, cấu hình nhánh. *. Từ xa cho nhánh hiện tại sẽ được tham khảo để xác định vị trí cần đẩy. Nếu cấu hình bị thiếu, nó mặc định là nguồn gốc.
reegnz 19/09/17

2
Tôi đã luôn sử dụng 'hiện tại' trong nhiều năm mà hoàn toàn không có vấn đề gì. Đối với hầu hết các trường hợp, nó hoạt động: kéo / đẩy đến một repo, tạo các nhánh mới hoặc kiểm tra các nhánh hiện có mà xung đột đặt tên khó xảy ra. Chỉ hoạt động, không có vấn đề. Không thể nói nó phải là mặc định (vì nó không an toàn) nhưng ơn trời là nó tồn tại.
trisweb

10

Sự khác biệt là simplesẽ đẩy đến nhánh theo dõi của nó nếu nó có cùng tên, trong khi currentsẽ đẩy đến một nhánh cùng tên bất kể bất kỳ nhánh theo dõi nào:

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
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.