У чому різниця між git push.default = current та push.default = upstream?


89

Сторінка користувача для git-config перелічує ці параметри для push.default:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

У більшості випадків я вважаю, що натискання на гілку вище за течією буде таким самим, як натискання на гілку з тим самим іменем, оскільки гілка вище за течією, як правило, буде мати те саме ім'я, а оскільки гілка з тією ж назвою ("поточна" ) зазвичай (або завжди, за визначенням?) знаходиться вище за течією. То яка різниця?

ОНОВЛЕННЯ : Сторінка користувача для git-config була оновлена ​​(як і слід було очікувати), тому розмежування, зроблені там, можуть бути набагато зрозумілішими зараз.


2
для розробників справді дратує їх відрізнятись, тому введено "простий" і буде типовою поведінкою для git-push. насправді він з'явився в git 1.7.11
xhlwill

14
Детальніше про останнє попередження git push.default is unset; its implicit value is changing in Git 2.0та про matchingvs simpleдив. Stackoverflow.com/questions/13148066/…
Нейт

iconoclaust: Я не думаю, що моє редагування взагалі змінило цілісність питання, і застарілу інформацію просто потрібно виправити. Навіщо змушувати користувача робити додаткову роботу, натискаючи посилання?
Flimm

Відповіді:


72

Ви підсумували різницю у своєму питанні. upstreamнатискає на налаштовану гілку вгору за течією, тоді як currentприпускає, що гілка вгору за течією має те саме ім'я, що і поточна локальна гілка, і штовхає до цієї конкретної назви. Насправді немає жодної причини вважати, що гілка відстеження локальної гілки має таку ж назву, як і сама локальна гілка.

Наприклад, якщо ви працюєте в декількох сховищах або в багатьох спільних віддалених розробницьких пультах, ви часто в кінцевому підсумку відстежуєте різні форки однієї гілки, такі як allen-masterабо susan-master, обидва з яких відстежують masterгілку в репозиторіях Аллена та Сьюзен відповідно. У цьому випадку це currentбуло б неправильним налаштуванням, оскільки ці імена гілок не існують на їхніх пультах. upstream, однак, це спрацювало б чудово.

Більш практичним прикладом може бути відстеження як a, так developmentі productionсховища. Ваш робочий процес може використовувати іншу гілку основної лінії для кожного, але це може заплутати. Припустимо, ви були інтегратором коду і хотіли відстежувати masterгілки обох сховищ окремо.

git checkout -b production --track production/master
git checkout -b development --track development/master

Тепер у вас є дві гілки, які відстежують відповідні сховища, жодна з яких masterвзагалі не використовує правила іменування. Немає плутанини в назвах філій: вони чітко описують те, що вони відстежують. Тим не менше, push.default = currentце не мало б сенсу, оскільки жоден пульт не містить developmentані productionгілки.


6
Ви наводите два приклади того, коли upstreamвіддають перевагу над current. Я думаю, що це досить очевидно, тож вам краще навести приклад для протилежного випадку.
AndreKR

1
@AndreKR AFAIK currentкращий у тому випадку, якщо ви новий розробник, тому що вам не потрібно git configбагато, особливо якщо ви десь клонували. currentнатискає на або створює - а потім - штовхає - до омонімічних гілок віддаленого репо для вас, якщо вони ще не існують, тоді як simpleвідмовиться робити це прямо, коли однойменна гілка вже не існує. upstreamмає таку ж поведінку в цьому випадку, якщо гілка вище не була явно встановлена ​​або іншим чином встановлена, як зазначено у відповіді Yawar .
Рідко "Де Моніка" Потребність

6

current підштовхне поточну гілку до гілки з такою ж назвою на віддаленому репо.

upstream буде підштовхувати поточну гілку до гілки вище за течією.

Вища гілка - це гілка, яка була явно або неявно визначена як така, що знаходиться вище від поточної гілки. Це означає, що push and pull за замовчуванням синхронізується з цією гілкою. Вихідна гілка може бути в тому ж репо, що і сама поточна гілка. Ви можете робити цікаві речі, наприклад, налаштувати свою локальну гілку головного пристрою, розташовану вище від гілки локальної функції (теми), і натискати та тягнути між ними.

Явне налаштування вгору за течією здійснюється через branch.autosetupmergeзначення конфігурації. Документацію ви можете знайти на git configсторінці довідки. Явне налаштування вгору за течією виконується за допомогою -uопції git branchкоманди. Детальніше див. На довідковій сторінці.


Я не думаю branch.autoSetupMerge, що думає так само, як -u/ --set-upstream. Принаймні, я не бачу нічого в документації , що вказує на те, що це змушує git push поводитись так, ніби він був викликаний -uза замовчуванням, що, як мені здається, ви говорите. Чи можете ви пояснити, що ви мали на увазі?
розгульний

@waldyrious впевнений; коли ви перевіряєте віддалену гілку відстеження, branch.autoSetupMergeконфігурація за замовчуванням створює нову локальну гілку і встановлює її вище за течією як віддалену гілку відстеження. Цю неявну дію можна явно виконати, використовуючи або -t( --track) або -u ...( --set-upstream-to=...) прапори, які роблять те саме з дещо різними синтаксисами.
Явар,

1
Я бачу, що тут сталося - оскільки це питання git push, я (помилково) припустив, що ви говорили про -uваріант git push, а не про -uваріант git branch. Вибачте за плутанину :)
нетерплячий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.