Я хочу иметь возможность сделать следующее:
Создайте локальную ветвь на основе какой-либо другой (удаленной или локальной) ветки (через git branch
или git checkout -b
)
Нажмите локальную ветвь
в удаленный репозиторий (публикация), но сделайте это
поэтому git pull
и git push
будут работать немедленно.
Как это сделать?
Я знаю о --set-upstream
в Git 1.7, но это действие после создания. Я хочу найти способ сделать аналогичные изменения при нажатии ветки на удаленный репозиторий.
В Git 1.7.0 и более поздних версиях вы можете проверить новую ветку:
git checkout -b <branch>
Редактирование файлов, добавление и фиксация. Затем нажмите с опцией -u
(сокращение от --set-upstream
):
git push -u origin <branch>
Git будет настраивать информацию отслеживания во время нажатия.
push.default
, и push.default
настроен на upstream
push.default
, это не будет делать то, что вы думаете, так и будет. Он попытается вытолкнуть существующую ветку отслеживания. Используйте: git push -u origin mynewfeature:mynewfeature
или git push -u origin mynewfeature:mynewfeature
выполните git branch --unset-upstream
.
Если вы не делитесь своим репо с другими пользователями, это полезно для того, чтобы выталкивать все ваши ветки на удаленный, и --set-upstream
правильно для вас:
git push --all -u
(Не совсем то, о чем просил OP, но этот однострочный интерфейс довольно популярен)
Если вы делитесь своим репо с другими, это не очень хорошая форма, так как вы будете забивать репо всеми вашими изворотливыми экспериментальными ветвями.
git pull --all
все это тянет в другом месте? Kewl
До введения git push -u
не было опции git push
для получения желаемого. Вы должны были добавить новые инструкции конфигурации.
Если вы создаете новую ветку, используя:
$ git checkout -b branchB
$ git push origin branchB:branchB
Вы можете использовать команду git config
, чтобы избежать прямого редактирования файла .git/config
.
$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB
Или вы можете вручную отредактировать файл .git/config
, чтобы иметь информацию о отслеживании этой ветки.
[branch "branchB"]
remote = origin
merge = refs/heads/branchB
git push origin -u local_branch:remote_branch
Проще говоря, чтобы создать новую ветвь локальная, выполните:
git branch <branch-name>
Чтобы переместить его в репозиторий удаленный, выполните следующие действия:
git push -u origin <branch-name>
git branch <branch-name>
и git checkout -b <branch-name>
оба создают ветку, но checkout переключаются на новую ветку
Небольшая вариация уже предложенных решений:
Создайте локальную ветвь на основе какой-либо другой (удаленной или локальной) ветки:
git checkout -b branchname
Нажмите локальную ветвь в удаленный репозиторий (опубликуйте), но сделайте ее отслеживаемой, так что git pull
и git push
будут работать немедленно
git push -u origin HEAD
Использование HEAD
- это "удобный способ перевести текущую ветку на одно и то же имя на пульте дистанционного управления". Источник: https://git-scm.com/docs/git-push В терминах Git HEAD (в верхнем регистре) является ссылкой на верхнюю часть текущей ветки (дерева).
Опция -u
является лишь короткой для --set-setupstream
. Это добавит ссылку отслеживания восходящего потока для текущей ветки. вы можете проверить это, посмотрев в файле.git/config:
git push -u origin <branch-name>
не работал для меня, но использование HEAD
вместо <branch-name>
работало отлично :)
Я предполагаю, что вы уже клонировали проект, например:
git clone http://github.com/myproject.git
Затем в вашей локальной копии создайте новую ветку и проверьте ее:
git checkout -b <newbranch>
Предположим, что вы создали "git bare -init" на своем сервере и создали myapp.git, вы должны:
git remote add origin ssh://example.com/var/git/myapp.git
git push origin master
После этого пользователи должны иметь возможность
git clone http://example.com/var/git/myapp.git
ПРИМЕЧАНИЕ.. Я предполагаю, что у вас работает ваш сервер. Если это не так, это не сработает. Хорошее практическое руководство здесь.
Добавить удаленную ветку:
git push origin master:new_feature_name
Проверьте, все ли хорошо (выберите начало и список удаленных ветвей):
git fetch origin
git branch -r
Создайте локальную ветвь и отследите удаленную ветку:
git checkout -tb new_feature_name origin/new_feature_name
Обновить все:
git pull
Я просто делаю
git push -u origin localBranch:remoteBranchToBeCreated
над уже клонированным проектом.
Git создает новую ветку с именем remoteBranchToBeCreated
под моими remoteBranchToBeCreated
я сделал в localBranch
.
редактировать устаревшие, просто использовать git push -u origin $BRANCHNAME
Используйте git publish-branch
из Уильяма разных инструментов Git (gitorious repo и clone).
Хорошо, нет Ruby, поэтому - игнорируя меры предосторожности! - возьмите последние три строки скрипта и создайте скрипт bash, git-publish-branch
:
#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}
Затем запустите git-publish-branch REMOTENAME BRANCHNAME
, где REMOTENAME обычно является источником (вы можете изменить сценарий, чтобы взять начало по умолчанию и т.д.)
git push
и git config
. Я использовал код скрипта для редактирования своего ответа. Вы могли бы использовать эту информацию для создания небольшого сценария оболочки, который выполняет ваши задачи.
Чтобы создать новую ветвь, отделив ее от существующей ветки
git checkout -b <new_branch>
а затем нажмите эту новую ветку в хранилище, используя
git push -u origin <new_branch>
Это создает и толкает все локальные коммиты к вновь созданной удаленной ветке origin/<new_branch>
Я сделал псевдоним, так что всякий раз, когда я создаю новую ветку, она будет соответствующим образом удалять и отслеживать удаленный ветвь. Я помещаю следующий фрагмент в файл .bash_profile
:
# Create a new branch, push to origin and track that remote branch
publishBranch() {
git checkout -b $1
git push -u origin $1
}
alias gcb=publishBranch
Использование: просто введите gcb thuy/do-sth-kool
с помощью thuy/do-sth-kool
- это мое новое имя ветки.
Для версии GitLab до версии 1.7 используйте:
git checkout -b name_branch
(name_branch, ex: master)
Чтобы отправить его в удаленный репозиторий, выполните следующие действия:
git push -u origin name_new_branch
(name_new_branch, пример: функция)
Немного опираясь на ответы здесь, я завернул этот процесс как простой скрипт Bash, который, конечно же, можно было использовать как псевдоним Git.
Важным дополнением для меня является то, что это побуждает меня запускать модульные тесты перед фиксацией и передает по текущему имени ветки по умолчанию.
$ git_push_new_branch.sh
Have you run your unit tests yet? If so, pass OK or a branch name, and try again
usage: git_push_new_branch {OK|BRANCH_NAME}
e.g.
git_push_new_branch -> Displays prompt reminding you to run unit tests
git_push_new_branch OK -> Pushes the current branch as a new branch to the origin
git_push_new_branch MYBRANCH -> Pushes branch MYBRANCH as a new branch to the origin
function show_help()
{
IT=$(CAT <<EOF
Have you run your unit tests yet? If so, pass OK or a branch name, and try again
usage: git_push_new_branch {OK|BRANCH_NAME}
e.g.
git_push_new_branch.sh -> Displays prompt reminding you to run unit tests
git_push_new_branch.sh OK -> Pushes the current branch as a new branch to the origin
git_push_new_branch.sh MYBRANCH -> Pushes branch MYBRANCH as a new branch to the origin
)
echo "$IT"
exit
}
if [ -z "$1" ]
then
show_help
fi
CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
BRANCH=$CURR_BRANCH
else
BRANCH=${1:-$CURR_BRANCH}
fi
git push -u origin $BRANCH
Чтобы загрузить локальную ветвь общедоступного репозитория, вам нужно cd
открыть общий репозиторий, а затем использовать следующий код:
git push -u origin branchname