Git - автоматическая перемотка вперед всех ветвей отслеживания при нажатии
Я установил ветки отслеживания с параметром --track
, и когда я делаю git pull
on master
, он извлекает все ветки в origin/branchname
, но не сливается с локальными ветвями отслеживания. Это лишнее раздражает, потому что, если я позже сделаю git push
на master
, он говорит, что в ветвях отслеживания были отклонены обновления без перемотки вперед, поскольку они не были быстро перенаправлены на начальном git pull
.
Мой вопрос: Как сделать так, чтобы git pull
извлекал все ветки и автоматически перематывал все ветки отслеживания?
Примечание. git pull
используется для быстрой пересылки всех моих ветвей отслеживания с моими репозиториями GitHub, но теперь, когда я настроил свои собственные репозитории, используя Gitolite, эта проблема возникает.
Ответы
Ответ 1
Но подождите:
Примечание. Я предполагаю, что вы отслеживали все ваши удаленные ветки, как в "Отслеживать все удаленные ветки git как локальные ветки."
Примечание: git 2.0 (Q2 2014) представит с commit b814da8 config push.ff:
pull.ff::
По умолчанию git не создает дополнительного коммита слияния при объединении фиксации, являющейся потомком текущей фиксации. Вместо этого кончик текущей ветки быстро перенаправляется.
- Если установлено значение
false
, эта переменная сообщает git создать дополнительное слияние в таком случае (что эквивалентно предоставлению опции --no-ff
из командной строки). - Если установлено значение
only
, допускаются только такие быстрые слияния (эквивалентно предоставлению опции --ff-only
из командной строки).
Ответ 2
Shell script, который быстро пересылает все ветки, у которых их восходящая ветвь установлена на соответствующий источник/ветвь, без каких-либо проверок
-
он не изменяет вашу текущую ветку в любое время, не нужно иметь дело с изменениями рабочих копий и временем, потерянным при проверке
-
он работает только вперед, ветки, которые не могут быть быстро переадресованы, покажут сообщение об ошибке и будут пропущены
Убедитесь, что все ветки ваших ветвей установлены правильно, запустив git branch -vv
. Установите ветвь восходящего потока с помощью git branch -u origin/yourbanchname
Скопировать-вставить в файл и chmod 755:
#!/bin/sh
curbranch=$(git rev-parse --abbrev-ref HEAD)
for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do
upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::');
if [ "$branch" = "$upbranch" ]; then
if [ "$branch" = "$curbranch" ]; then
echo Fast forwarding current branch $curbranch
git merge --ff-only origin/$upbranch
else
echo Fast forwarding $branch with origin/$upbranch
git fetch . origin/$upbranch:$branch
fi
fi
done;
Ответ 3
Если вы действительно хотите ускорить пересылку всех локальных ветвей, отслеживающих удаленные ветки, вы можете захотеть добавить это как псевдоним к вашему ~/.gitconfig
:
[alias]
pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done"
Затем вы можете запустить git pull-all
, он будет перебирать ваши локальные ветки и запускать git pull --ff-only
для каждого из них.
Ответ 4
Следующая однострочная строка ускоряет пересылку всех ветвей, которые имеют ветку восходящего потока, если это возможно, и печатает ошибку в противном случае:
git branch \
--format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
sh
Как это работает?
Он использует пользовательский формат с командой git branch
. Для каждой ветки с восходящей веткой она печатает строку со следующим шаблоном:
git push . <remote-ref>:<branch>
Это может быть передано непосредственно в sh
(при условии, что имена ветвей правильно сформированы). Опустить | sh
| sh
чтобы увидеть, что он делает.
Предостережение
В настоящее время извлеченная ветвь не будет обновлена с сообщением как
! [remote rejected] origin/master -> master (branch is currently checked out)
Для этого вы можете прибегнуть к обычному git pull --ff-only
.
кличка
Добавьте следующее в ваш .gitconfig
чтобы git fft
выполняла эту команду:
[alias]
fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -
Псевдоним - это сокращение от "ускоренного отслеживания (ветки)".
Ответ 5
SmartGit, например, имеет возможность автоматически объединять изменения с отслеживаемой веткой, если вы переключаетесь на ветку. Это должно делать то, что вы хотите достичь.