У меня более 4 удаленных веток в моем репозитории git. Моя цель — отправить один код во все эти ветки с помощью команды git.
Итак, я хочу следующее:
git add .
git commit -m "Do all with one command"
git push origin -all
Конечно, приведенная выше команда может работать некорректно.
Могу ли я выполнить такое действие только с 3 командами, как указано выше?
Там уже есть git push --all
(обратите внимание на двойной дефис), но это, вероятно, или, по крайней мере, возможно, не то, что вам нужно. Настоящая проблема здесь в том, что вы не определили должным образом, чего вы хотите, или, по крайней мере, я не совсем уверен, чего вы хотите здесь достичь. Особенно запутанная часть для меня заключается в том, что это:
git add . git commit -m "Do all with one command"
делает только один новый коммит в текущей ветке. Если вы затем используете git push
, чтобы отправить этот новый коммит, но хотите отправить его в «четыре ветки», это, вероятно, не сделает то, что вы хотели.
Если бы вы использовали, скажите:
for branch in br1 br2 br3 br4; do
git checkout $branch
[do some editing and/or cherry-picking and so on here]
git commit
done
так что у вас были обновления в ваших локальных ветках с именами br1
, br2
, br3
и br4
, и теперь вы хотите отправить четыре (или более) коммита в четыре соответствующие ветки на origin
, теперь все это имеет смысл.
Если на то пошло, здесь:
git push --all origin
может сделать именно то, что вы хотели. Однако это может сделать больше, чем вы хотите, поскольку это означает то же самое, что и:
git push origin "refs/heads/*:refs/heads/*"
т. е. используйте все имена ваших локальных веток для отправки запросов в другой Git для того же имени. Если бы у вас также были ветки br5
и br6
, это привело бы к отправке любых новых коммитов в эти ветки и запросу origin
обновить имена веток, которые пишутся так же, как ваши.
Если это действительно то, что вы хотите сделать, рассмотрите возможность использования --all
или явного refspec, как в приведенном выше git push
. Вы также можете изменить настройку push.default
на matching
. Большинству пользователей, вероятно, не следует использовать настройку matching
. Это было по умолчанию в Git 1 и было изменено на simple
в Git 2, потому что это было неправильно для большинства пользователей, но никто никогда не является «большинством пользователей».
Что я просто хочу здесь, так это использовать только одну локальную ветку «main», чтобы я мог использовать одну команду «commit». И я хочу нажать с этой «основной» ветки на все удаленные ветки. Вы, наверное, чувствуете себя странно из-за моей необычной цели, но я просто хочу этого сейчас. Вы можете помочь мне?
Если вы успешно отправляете один коммит в четыре ветки, вы обычно отбрасываете коммиты из трех из этих веток. Это не очень хорошая идея (именно поэтому потребуется --force
). Не делай этого.
Единственное исключение из этого правила — если вы хотите объединить все четыре ветки (что вы обычно делаете с тремя git merge
командами или одной git merge
с помощью слияния осьминога). В результате окончательное слияние будет ускоренной перемоткой вперед для всех четырех ветвей. Вы можете нажать это в одной команде, используя явные refspecs (и без опции --force
). Но это не то, что вы показали выше.
Если ваш удаленный origin
, вы находитесь в ветке master
, удаленные ветки first
, second
, third
и fourth
:
git add .
git commit -m "Do all with one command"
git push origin master:first master:second master:third master:fourth
Что ж, вы можете просто нажать каждую по отдельности, но поместить логику git push в один скрипт, а затем выполнить этот скрипт.