Git локальная ведущая ветвь перестала отслеживать пульты/начало/мастер, не может нажать
Просто, когда я подумал, что у меня есть проверка git -b newbranch - commit/commit/commit - git мастер проверки - git merge newbranch - git rebase -i master - git push workflow в git, что-то взорвалось, и я не вижу никаких причин для этого.
Вот общий рабочий процесс, который работал у меня в прошлом:
# make sure I'm up to date on master:
$ git checkout master
$ git pull # k, no conflicts
# start my new feature
$ git checkout -b FEATURE9 # master @ 2f93e34
Switched to a new branch 'FEATURE9'
... работать, совершать, работать, совершать, работать, совершать...
$ git commit -a
$ git checkout master
$ git merge FEATURE9
$ git rebase -i master # squash some of the FEATURE9 ugliness
Хорошо до сих пор; теперь то, что я ожидаю увидеть - и обычно вижу - это:
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
Но вместо этого я вижу только " ничего не зафиксировать (рабочий каталог чист)", нет " Ваша ветка впереди" origin/master "на 1 commit.", и git pull показывает эту странность:
$ git pull
From . # unexpected
* branch master -> FETCH_HEAD # unexpected
Already up-to-date. # expected
И ветвь git -a -v показывает это:
$ git branch -a -v
FEATURE9 3eaf059 started feature 9
* master 3eaf059 started feature 9
remotes/origin/HEAD -> origin/master
remotes/origin/master 2f93e34 some boring previous commit # should=3eaf059
Флаг
git ясно показывает, что я нахожусь сейчас на * master, а журнал git ясно показывает, что главный (локальный) находится в 3eaf059, тогда как пульт дистанционного управления/начало/HEAD → remotes/origin/master застряли на вилке.
В идеале я хотел бы знать семантику того, как я мог бы это понять, но я бы решил, чтобы моя рабочая копия снова отслеживала удаленный мастер и вернула их обратно, не теряя истории. Спасибо!
(Примечание: я повторно клонировал репо в новом каталоге и вручную повторно применил изменения, и все сработало нормально, но я не хочу, чтобы это было стандартным обходным решением.)
Добавление. Название гласит, что "невозможно нажать", но нет сообщения об ошибке. Я просто получаю "уже обновленный" ответ, хотя ветвь git -a -v показывает, что локальный мастер впереди /remotes/origin/master. Здесь вывод из git pull и git remote -v, соответственно:
$ git pull
From .
* branch master -> FETCH_HEAD
Already up-to-date.
$ git remote -v
origin [email protected]:proj.git (fetch)
origin [email protected]:proj.git (push)
Добавление 2: похоже, что мой локальный мастер настроен на то, чтобы нажать на удаленный компьютер, но не вытащить его. После выполнения for remote in 'git branch -r | grep -v master '; do git checkout --track $remote ; done
, вот что у меня есть. Кажется, мне просто нужно снова вытащить мастер из пультов/оригинала/мастера, нет?
$ git remote show origin
* remote origin
Fetch URL: [email protected]:proj.git
Push URL: [email protected]:proj.git
HEAD branch: master
Remote branches:
experiment_f tracked
master tracked
Local branches configured for 'git pull':
experiment_f merges with remote experiment_f
Local refs configured for 'git push':
experiment_f pushes to experiment_f (up to date)
master pushes to master (local out of date)
Ответы
Ответ 1
Когда вы делаете git pull
, вы действительно хотите сделать git push
?
По какой-то причине git pull
является "вытягиванием" из вашего текущего каталога, я подозреваю, что вы хотите вытащить его из remotes/origin/HEAD
.
Какой результат производит git push origin
?
[Добавление Павла]: Это привело меня к правильному ответу, поэтому я принимаю. Дополнительные шаги, которые необходимо предпринять, чтобы выяснить, что происходит, были:
# see details of the current config:
$ git config -l
branch.master.remote=. # uh oh, this should point to origin
# to see what it should be ,make a clean clone of the same project
# in a different directory, checkout the master branch and run the
# same command. That showed "branch.master.remote=origin", so...
# then to fix:
$ git config branch.master.remote origin
После этого локальный мастер снова отслеживал удаленные/исходные/мастерские. Спасибо Питеру Фармеру за подсказку, которая привела меня сюда!
Ответ 2
Выполнение какого-либо расследования, следующего за комментариями Питера и Ника, привело к:
# botched local clone:
$ git config -l
branch.master.remote=.
branch.master.merge=refs/heads/master
[...]
# new / clean local clone:
$ git config -l
branch.master.remote=origin
branch.master.merge=refs/heads/master
[...]
Надеюсь, я смогу опубликовать это как ответ, не приняв его (если нет, мне придется удалить и поместить его в комментарий или исходный вопрос). Ведение...
$ git config branch.master.remote origin
... снова получил branch.master.remote
до =origin
, но он не объясняет, как он получил "невоспроизведенный" в первую очередь.
Если кто-то может объяснить чисто:
a) как мой локальный "неудачный" репо мог попасть в такое состояние, учитывая рабочий процесс в моем вопросе, и
b) правильная последовательность действий для безопасной синхронизации (учитывая, что удаленная головка могла продвинуться в то же время), я хотел бы отметить это как принятый ответ, так как я думаю, что это было бы очень полезно другим в этой ситуации.