Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

git push ошибка или как пушить origin/local_branch_name на сервер

#git #git_branch


сделал

git branch local_branch_name origin/branch_name


после изменения пишу

git push origin/local_branch_name


ошибка



в чем ошибка? Как можно решить?
    


Ответы

Ответ 1



Беда-а. git branch не переключает активную ветку! Вы сделали ветку, но не переключились на неё, и коммит сделали не в неё. В "ежедневном git-обиходе" вы почти не будете пользоваться git branch напрямую, скорее вы будете использовать checkout с опцией -b (от branch): git checkout -b новая-ветка ...что сделает ветку там же, где вы (HEAD) сейчас, а также переключится на неё. Если вы хотите ветку в каком-то другом месте, то его и укажите: git checkout -b новая-ветка место-новой-ветки Не трогайте remote-ветки (каковыми являются origin/*)! Единственное, для чего они нужны, это для индикации вам, где находятся ветки сервера. Даже при взаимодействии с сервером вы эти ветки указывать не будете, поскольку для сервера их не существует. И коммитить в них не принято. Общий вид git-push такой: git push <сервер> <откуда-локально>:<куда-на-сервере> Плюс сокращённые формы: git push <сервер> <откуда-локально> # зальётся в ветку "за которой следит" git push # как выше, но текущая ветка Что делать? Я полагаю, события развивались следующим образом: git checkout origin/DIMA # это уже крайне подозрительное действие git branch DIMA origin/DIMA # создали ветку, но не переключились git commit ... # что-то закоммитили: ой, вы же были в detached HEAD вне веток! git commit ... # ещё что-то закоммитили! ...и если я приблизительно прав, то проблема решится просто мёрджем "коммитов-потеряшек" (англ. dangling commits) в ветку, куда они предназначались изначально; если ветка сейчас точно позади них (и не ушла с тех пор вперёд), то произойдёт fast-forward. Поэтому добавим в мердж флаг --ff-only, чтобы если я неправ (и вы сломали репозиторий сильнее, чем я думал), мерджа не произошло. Сначала зафиксируем "потеряшек", обозначив им стабильное место в истории. "В любой непонятной ситуации делай ветку" git checkout -b marker Теперь надо идти туда, куда эти коммиты предназначались. git checkout DIMA А теперь попробуем перемотать DIMA вперёд, включив в него бывших "потеряшек": git merge --ff-only marker ...и если мердж произошёл, то, похоже, я угадал ваш сценарий, и выглядит он, с моими манипуляциями (после первой команды => после третьей), примерно так: И теперь, по идее, можно сделать просто git push (без всего) и ветка уйдёт на сервер. Что за "потеряшки"? Это коммиты, до которых нельзя добраться от "зафиксированных точек", следуя "назад" (по ссылкам на родительские коммиты). Такими "зафиксированными точками" являются ветки (branch) и метки (tag). Все коммиты, до которых Git не может дойти от таких точек, являются мусором и подлежат удалению когда-нибудь, гарантировать их сохранность уже нельзя, их в любой момент может съесть git gc. Отсюда и "потеряшки", для истории эти коммиты потеряны, если кто-то (например, git reflog) не записал их хэш. Такие коммиты порождает, например, git commit --amend, или любой содержательный (не fast-forward) git rebase.

Комментариев нет:

Отправить комментарий