"Просто" проти "поточного" push.default в git для децентралізованого робочого процесу


121

Функціонально кажучи, в децентралізованому робочому процесі, я не бачу різниці між simpleі currentопцій для push.defaultнастройки конфігурації.

currentпідштовхне поточну гілку до ідентично названої гілки на вказаному пульті. simpleбуде ефективно робити те ж саме, що і для відстежуваних, і для будь-яких відслідковуваних віддалених файлів для поточної гілки (вона застосовує однакові назви гілок в обох випадках).

Чи може хтось пояснити будь-які важливі відмінності між ними для децентралізованих робочих процесів, які мені відсутні?



2
@Trevor - це зовсім не пов'язане з моїм запитанням.
void.pointer

Відповіді:


184

Різниця полягає в тому, що з simple, git push(без проходження refspec) зазнає невдачі , якщо поточна гілка не відслідковує віддалене вгору по течії гілки (навіть якщо гілка з тим же ім'ям існує на пульті дистанційного керування):

$ 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

З іншого боку, currentневажливо, чи відслідковує поточна гілка вгору за течією, вона просто хоче перейти до будь-якої гілки з такою ж назвою:

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

Документація

З документації по налаштуванню Git :

  • upstream - натисніть поточну гілку на її гілку за течією ...

  • simple - як і вище, але відмовляється натиснути, якщо назва гілки вище за течією відрізняється від локальної ...

  • current - натисніть поточну гілку до однойменної гілки.


4
Я здогадуюсь, єдине "бонусне" питання - "чому". Я припускаю, що примушування гілки відстеження за течією усуває помилки (випадково перезаписавши цю гілку на неправильному пульті).
void.pointer

7
Простий, здається, більш безпечний варіант "ременів безпеки".
Джонатан

2
Переглядаючи власне питання через довгий час :-) Як currentдізнався, який дистанційний вибрати? Якщо у вас немає гілки відстеження, куди вона рухається?
void.pointer

2
Він натискає на віддалений за замовчуванням -> це означає походження. Від man git-push: Коли в командному рядку не вказано, куди потрібно натиснути аргумент <repository>, branch. *. Для визначення місця, куди потрібно натиснути, слід отримати конфігурацію віддаленої конфігурації для поточної гілки. Якщо конфігурація відсутня, вона за замовчуванням походить.
reegnz

2
Я завжди використовував "поточний" протягом багатьох років, абсолютно не маючи проблем. У більшості випадків це працює: підтягування / натискання на один репо, створення нових гілок або перевірка існуючих гілок, де конфлікти з іменами малоймовірні. Просто працює, ніяких питань. Не можу сказати, що це повинно бути за замовчуванням (оскільки це небезпечно), але дякувати добру, що він існує.
trisweb

10

Різниця полягає в тому, що він simpleнатискає на свою гілку відстеження, якщо вона має те саме ім’я, тоді як currentбуде натискати на гілку з тим же ім'ям незалежно від будь-якої гілки відстеження:

$ 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` 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.