Как вы толкаете только одну ветку Git (и никаких других веток)?

247

Я работаю над локальным хранилищем git. Есть две ветви, masterи feature_x.

Я хочу нажать feature_xна удаленное репо, но я не хочу публиковать изменения в masterветке.

Будет ли работать git push origin feature_xиз моей feature_xветки ( feature_xветка уже существует на удаленной)?

Я не хочу проверять это на своем боксе, потому что я не могу сейчас перейти к мастеру.

Рафаэль Мюллер
источник
Посмотрите здесь: удаленный и здесь: нажмите на ветку в github Звучит так, как будто это будет работать.
ал.

Ответы:

376

да просто сделай следующее

git checkout feature_x
git push origin feature_x
cpjolicoeur
источник
54
С современным git вы можете просто «git push origin HEAD» или даже «git push HEAD», чтобы пушить только проверенную ветку.
Якуб Наребски
2
Нужно ли оформлять заказ на feature_x?
HD
5
да, потому что если вы работаете с мастером, он попытается переместить локальную ветку master в удаленную ветку feature_x. для того, чтобы сначала не
оформлять
1
@cpjolicoeur Я видел в других вопросах (например, здесь ), что они делают git push -u origin <branch-name>. Однако вы не упомянули об этом. Это необходимо ?
Riroo
3
@miss_R -uопция в git-pushкоманде установит восходящую ссылку для отслеживания только что нажатой ветви. Это заставит вещи, подобные git-pullэтой ветке, в будущем уже знать, из какой ветви тянуть, не указывая ее. Это не обязательный параметр для передачи одной ветви, но он широко используется, потому что многие люди хотят, чтобы локальная ветка отслеживала удаленную ветку, которую они нажимают.
cpjolicoeur
74

По умолчанию git pushобновляет все удаленные филиалы. Но вы можете настроить git так, чтобы он обновлял только текущую ветку.

git config push.default upstream

Это означает, что git обновит только текущую (извлеченную) ветку, когда вы выполните git push.

Другие допустимые параметры:

  • nothing: Ничего не выдвигать (ошибка), если явно не указан refspec . Это в первую очередь предназначено для людей, которые хотят избежать ошибок, всегда будучи явными.
  • matching: Нажмите на все ветви с одинаковыми именами на обоих концах. (опция по умолчанию до версии 1.7.11)
  • upstream: Нажмите текущую ветвь в ее восходящую ветвь. Этот режим имеет смысл, только если вы отправляете в тот же репозиторий, из которого вы обычно извлекаете (то есть центральный рабочий процесс ). Не нужно иметь одинаковое имя для локальной и удаленной ветки.
  • tracking: Устарел, используйте upstreamвместо этого.
  • current: Нажмите текущую ветку на удаленную ветку с тем же именем на принимающей стороне. Работает как в центральном, так и не центральном рабочих процессах.
  • simple: [доступно начиная с версии 1.7.11] в централизованном рабочем процессе, работает как upstreamс дополнительной безопасностью, чтобы отказаться от push, если имя вышестоящей ветви отличается от локального. При нажатии на пульт, отличный от того, с которого вы обычно тянете, работайте как current. Это самый безопасный вариант и подходит для начинающих. Этот режим стал режимом по умолчанию в Git 2.0.
Картик Бозе
источник
2
Спасибо, currentбыло то , что я искал, по умолчанию git pushв fooветке будет толкать его в origin/fooветку.
Дориан
@ Дориан спасибо, я согласен, что currentпо умолчанию имеет больше смысла.
Золтан
@Dorian, @ Zoltán - я чувствую, simpleчто по умолчанию имеет больше смысла. Я обновил ответ «когда использовать что». Просьба посмотреть.
Картик Бозе
1
Примечание: начиная с git версии 2, значение по умолчанию изменилось на simple.
Даниэль
8

Незначительное обновление поверх ответа Karthik Bose - вы можете настроить git глобально, чтобы все ваши рабочие пространства работали таким образом:

git config --global push.default upstream
Bhaskar
источник
upstream не был признан допустимым параметром для меня, вместо этого пришлось поставить 'current'
кузнечик
-2

Допустим, у вас есть локальная ветка foo, удаленный узел с именем origin и удаленная ветка origin / master.

Чтобы передать содержимое foo в origin / master, вам сначала нужно установить его апстрим:

git checkout foo
git branch -u origin/master

Затем вы можете нажать на эту ветку, используя:

git push origin HEAD:master

В последней команде вы можете добавить --force, чтобы заменить всю историю происхождения / мастера на историю foo.

CodeKid
источник