git ,,local push'' от ветки функций к мастеру, без проверки

Я хотел бы объединиться из FeatureBranch в master, не делая сначала мастер проверки. Я пробовал (находясь в FeatureBranch)

git push . master

но я получил (к степени удивления):

Everything up-to-date

Несмотря на наличие коммитов в FeatureBranch, которых (пока) нет в master.

Причины, по которым я хочу иметь возможность выполнять одноэтапное локальное нажатие, следующие:

  1. Я хочу внести изменения своим коллегам, которые остаются в главной ветке
  2. без дополнительного шага «мастер оформления заказа»
  3. таким образом, имея возможность оставаться в FeatureBranch
  4. и избегать быстрого изменения многих файлов, что сбивает с толку/предупреждает многие инструменты, которые имеют какое-то отношение к каталогам/файлам в репозитории.

Я знаю, что могу сделать это за большее количество шагов разными способами. Но мне интересно, есть ли одношаговое решение для этого (я думаю, должно быть).

Я думаю/осознаю, что если возникнут конфликты, мне все равно придется переключиться на мастера. Но в большинстве случаев у меня нет конфликтов, и поэтому было бы полезно одношаговое решение.

Моя версия git:

git --version
git version 1.6.5.1.1367.gcd48

(Windows)

TIA
karolrvn


person KarolDepka    schedule 19.02.2010    source источник
comment
Интересный вопрос: что делает ,,git push . master'' делать и почему он сообщает ,,Все самое последнее'' ?   -  person KarolDepka    schedule 19.02.2010
comment
Я бы, может быть, за исключением того, чтобы сообщить об ошибке, например, локальный толчок не поддерживается - вы должны сначала проверить целевую ветку, а затем объединиться с вашей текущей веткой '' - но нет, она просто работает ''отлично'' и сообщает 'Все вверх' -на сегодняшний день», смысл которого мне в данном случае не ясен.   -  person KarolDepka    schedule 19.02.2010


Ответы (5)


На вопрос «Объединение веток без проверки" можно найти отличные ответы, объясняющие, зачем нужна проверка.
Сохранение отдельного репо (с извлеченной целевой веткой) — еще один способ.

Но главное остается: push/pull об удаленных репозиториях.
Checkout — о локальных репозиториях.

Команды передачи данных Git

Если вы имеете в виду эту схему, вы понимаете, что не нажимаете на master.

person VonC    schedule 27.09.2012

Что касается вашего вопроса о том, почему команда push действует именно так...

Push используется для распространения коммитов из одного репозитория в другой, а не между ветвями внутри репозитория. В вашем случае вы нажимаете из одного репозитория в тот же репозиторий, поэтому ответ «Все в актуальном состоянии», как и должно быть. Тот факт, что вы называете две разные ветки, в данном случае не имеет значения.

person Jakob Borg    schedule 20.02.2010

Вы не можете зафиксировать ветку, отличную от текущей; или, другими словами, новый узел, созданный git commit, всегда является дочерним элементом текущего HEAD.

Я иногда использовал отдельное «промежуточное» репо, чтобы избежать накладных расходов на переключение ветвей в моей живой среде разработки:

# Currently working on branch 'foo' in $SOME_DIR/main-repo
# main-repo is a local clone of shared-repo

# Create the staging repo alongside the existing main-repo
cd $SOME_DIR
git clone shared-repo staging-repo
cd staging-repo
git remote add local ../main-repo

# Switch back to main-repo and continue working
cd main-repo
# (Make changes and commit to branch foo ...)

# Switch to the staging repo
cd $SOME_DIR/staging-repo

# Make sure we are up to date with shared repo (*)
git pull

# Merge changes from main-repo
git fetch local
git merge local/foo

# Push changes up to the shared repo
git push

Потенциальная проблема с этим подходом заключается в том, что он не позволяет вам протестировать результат слияния изменений, сделанных в ветке 'foo', с любыми изменениями, которые тем временем были сделаны в shared-repo/master (*). В зависимости от характера изменений, это может быть нормально, но в большинстве случаев вы захотите, по крайней мере, выполнить быструю проверку работоспособности (например, убедиться, что код все еще компилируется, возможно, запустить дымовые тесты) перед отправкой в ​​общий репозиторий.

Для этого вам нужно либо:

  1. build staging-repo — но в этом случае слияние можно было сделать прямо в main-repo
  2. иметь staging-repo в отдельной среде сборки от main-repo, т. е. $SOME_OTHER_DIR/staging-repo. Это позволит создавать и/или тестировать staging-repo, не загрязняя среду main-repo.
person Gareth Stockwell    schedule 19.02.2010
comment
Спасибо за ответ. Обратите внимание, что я не говорю о создании новых коммитов: только о добавлении существующих коммитов в ветку. А может вы обобщили мысль? - person KarolDepka; 19.02.2010
comment
Обратите внимание на мой вопрос (в комментарии) о том, что такое git push . master'' делает выше. - person KarolDepka; 19.02.2010
comment
Было бы неплохо/вероятно, что такая операция, о которой я спрашиваю, когда-нибудь будет реализована в git? Это ,,еще не еще реализовано'' или ,,не возможно - по дизайну'' или ,,возможно, но не ,,путем git'' '' или, может быть, всем плевать; или какой-то другой сценарий? - person KarolDepka; 19.02.2010
comment
Кстати, в нашем репозитории процесс клонирования занимает несколько минут. - person KarolDepka; 19.02.2010
comment
@karolrvn Что касается вашего первого вопроса: добавление существующих коммитов (в моем примере из main-repo/foo) в ветку (staging-repo/foo) выполняется на шаге git merge local/foo. - person Gareth Stockwell; 22.03.2010
comment
@karolrvn Что касается того, можно ли изменить git, чтобы git push можно было использовать для распространения коммитов между ветвями в одном и том же репозитории: я бы сказал, что нет, по причине, объясненной в ответе спокойствия. - person Gareth Stockwell; 22.03.2010

Кажется, что вы на самом деле хотите сделать слияние, а не толчок? К сожалению, я не думаю, что это возможно, не находясь в ветке, которая является целью слияния, поэтому последовательность команд будет такой:

git checkout master
git merge FeatureBranch
git checkout FeatureBranch

Вся эта операция должна занять менее секунды, поэтому я не совсем понимаю, почему вы категорически возражаете против перехода на основную ветку для этого...

person Jakob Borg    schedule 19.02.2010
comment
Спасибо за ответ. Я не «решительно возражаю», я просто хочу пропустить шаг, который не является необходимым с точки зрения пользователя (но может быть необходим с точки зрения git по «техническим причинам»). Были ли у вас когда-нибудь ситуации после оформления заказа, когда многие инструменты (например, текстовые редакторы) начинают спрашивать вас об отсутствующих файлах, открытых файлах, которые были изменены/удалены каким-то другим процессом? Кроме того: (с «субъективной» точки зрения пользователя) почему я должен хотеть/должен переходить в состояние, которое больше не нужно (состояние «оставленное позади» основной ветки) и с которым я не хочу больше ничего делать. - person KarolDepka; 19.02.2010
comment
Исключение, возможно, будет, когда произойдет конфликт слияния. Но в моем случае в большинстве случаев это маловероятно (у нас редко бывают конфликты, потому что мы обычно работаем над отдельными частями). - person KarolDepka; 19.02.2010
comment
Я понимаю, о чем вы говорите, и пункт о том, что редакторы не любят, когда файлы меняются под ними, очень важен. Технические причины в случае git могут заключаться в том, что он хочет, чтобы вы находились на ветке, которая будет изменена, в данном случае master. Это делается для того, чтобы вы не изменяли вещи, состояние которых вы не видите. - person Jakob Borg; 20.02.2010
comment
Но я просто психоанализирую мерзавца, я не знаю настоящих причин. :) - person Jakob Borg; 20.02.2010
comment
Конечно, вы также можете сделать это из отдельного клона репозитория, чтобы не связываться с тем, в котором вы занимаетесь разработкой. В этом репозитории оставайтесь на ветке master и многократно извлекайте из репозитория разработки FeatureBranch, что приведет к слияние, которое в вашем случае, вероятно, будет быстрой перемоткой вперед. Затем нажмите или что-то еще. - person Jakob Borg; 20.02.2010

У меня была такая же проблема, и, основываясь на вашей идее, я нашел решение довольно простым:

git push . HEAD:master

это работает до тех пор, пока мастер может быть перенаправлен на вашу текущую голову, т.е. вы начали свою текущую ветку на мастере и с тех пор не имеете новых коммитов на мастере.

person Raoul Steffen    schedule 07.09.2015