Push.default "sederhana" vs "saat ini" di git untuk alur kerja terdesentralisasi

122

Secara fungsional, dalam alur kerja yang terdesentralisasi, saya tidak melihat perbedaan antara simpledan currentopsi untuk push.defaultpengaturan konfigurasi.

currentakan mendorong cabang saat ini ke cabang dengan nama yang sama pada remote yang ditentukan. simpleakan secara efektif melakukan hal yang sama juga untuk remote yang dilacak dan remote yang tidak terlacak untuk cabang saat ini (ini memberlakukan nama cabang yang identik dalam kedua kasus).

Dapatkah seseorang menjelaskan perbedaan penting antara keduanya untuk alur kerja terdesentralisasi yang saya lewatkan?

void.pointer
sumber
2
@Trevor - itu tidak ada hubungannya sama sekali dengan pertanyaan saya.
void.pointer

Jawaban:

185

Perbedaannya adalah dengan simple, git push(tanpa meneruskan refspec) akan gagal jika cabang saat ini tidak melacak cabang hulu jarak jauh (bahkan jika cabang dengan nama yang sama ada di jarak jauh):

$ 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

Di sisi lain, currenttidak peduli apakah cabang saat ini melacak upstream atau tidak, ia hanya ingin mendorong ke cabang mana pun yang memiliki nama yang sama:

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

Dokumentasi

Dari dokumentasi konfigurasi Git :

  • upstream - dorong cabang saat ini ke cabang hulu ...

  • simple - seperti upstream, tetapi menolak untuk mendorong jika nama cabang upstream berbeda dengan cabang lokal ...

  • current - dorong cabang saat ini ke cabang dengan nama yang sama.


sumber
4
Saya kira satu-satunya pertanyaan "bonus" adalah "mengapa". Saya kira memaksa cabang pelacakan hulu menghilangkan kesalahan (secara tidak sengaja menimpa cabang itu di remote yang salah).
void.pointer
7
Sederhana tampaknya pilihan "sabuk pengaman" yang lebih aman.
Jonathan
2
Meninjau kembali pertanyaan saya sendiri setelah sekian lama :-) Bagaimana cara currentmengetahui remote mana yang harus dipilih? Jika Anda tidak memiliki kumpulan cabang pelacakan, ke mana cabang itu didorong?
void.pointer
2
Ini mendorong ke remote default -> itu berarti asal. Dari man git-push: Jika baris perintah tidak menentukan tempat untuk mendorong dengan argumen <repository>, konfigurasi jarak jauh branch. * Untuk cabang saat ini dikonsultasikan untuk menentukan tempat untuk mendorong. Jika konfigurasi hilang, defaultnya ke origin.
reegnz
2
Saya selalu menggunakan 'saat ini' selama bertahun-tahun tanpa masalah sama sekali. Untuk sebagian besar kasus, ini berfungsi: menarik / mendorong ke satu repo, membuat cabang baru atau memeriksa cabang yang ada di mana konflik penamaan tidak mungkin terjadi. Hanya berfungsi, tidak ada masalah. Tidak bisa mengatakan itu harus default (karena tidak aman) tapi syukurlah itu ada.
trisweb
10

Perbedaannya adalah bahwa simplemendorong ke cabang pelacakan jika memiliki nama yang sama, sementara currentakan mendorong ke cabang dengan nama yang sama terlepas dari cabang pelacakan mana pun:

$ 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` 
jthill
sumber