локальная мастерская ветка git перестала отслеживать удаленные / исходные / главные, не может нажать - PullRequest
7 голосов
/ 09 марта 2011

Как раз тогда, когда я подумал, что смог овладеть git checkout -b newbranch - commit / commit / commit - git checkout master - git merge newbranch - git rebase -i master - git push рабочий процессв мерзавце что-то взорвалось, и я не вижу причин для этого.

Вот общий рабочий процесс, который работал для меня в прошлом:

# 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 коммит. ", и git pull показывает эту странность:

$ git pull
From .                                        # unexpected
 * branch            master     -> FETCH_HEAD # unexpected
Already up-to-date.                           # expected

А git branch -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 ясно показывает, что master (local) имеет значение 3eaf059, в то время как remotes / origin / HEAD -> remotes / origin / master застрялобратно на развилку.

В идеале я хотел бы знать семантику того, как я мог в это разобраться, но я бы предпочел, чтобы моя рабочая копия снова отслеживала удаленный мастер и получалавернуться в синхронизацию без потери истории.Спасибо!

( Примечание. Я повторно клонировал репозиторий в новом каталоге и заново применил изменения вручную, и все работало нормально, но я не хочу, чтобы это был стандартный обходной путь.)

Приложение : в заголовке написано «не могу нажать», но сообщения об ошибке нет.Я просто получаю ответ «уже в курсе», хотя git branch -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  git@git.company.com:proj.git (fetch)
origin  git@git.company.com:proj.git (push)

Добавление 2 : выглядит так, как будто мой локальныймастер настроен на push на пульт, но не на его извлечение.После выполнения for remote in 'git branch -r | grep -v master '; do git checkout --track $remote ; done вот что у меня есть.Кажется, мне просто нужно получить мастер , извлекая из пульта / источника / мастера снова, нет?

$ git remote show origin
* remote origin
  Fetch URL: git@git.company.com:proj.git
  Push  URL: git@git.company.com: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)

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

Когда вы делаете 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

После этого локальный мастер снова отслеживал пульты / источник / мастер. Спасибо Питеру Фармеру за подсказку, которая привела меня сюда!

1 голос
/ 10 марта 2011

Проведение некоторого расследования в соответствии с комментариями Питера и Ника привело к:

# 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) правильную последовательность действий для полученияобратно в синхронизации (учитывая, что удаленный руководитель мог продвинуться за это время), я хотел бы отметить это как принятый ответ, так как я думаю, что он был бы наиболее полезным для других в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...