Как мне найти местоположение источника / мастера в git и как его изменить? - PullRequest
224 голосов
/ 10 ноября 2008

Я новичок в Git. Недавно я переместил проект Rails из Subversion в Git. Я следовал за учебником здесь: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Я также использую unfuddle.com для хранения своего кода. Я делаю изменения на своем ноутбуке Mac в поезде на работу и обратно, а затем подталкиваю их в режим ожидания при наличии сетевого подключения с помощью следующей команды:

git push unfuddle master

Я использую Capistrano для развертываний и извлекаю код из репозитория unuddle, используя главную ветвь.

В последнее время я заметил следующее сообщение при запуске «git status» на моем ноутбуке:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

И я не понимаю, почему. Я думал, что мой ноутбук был источником ... но не знаю, является ли тот факт, что я первоначально вытащил из Subversion или подтолкнуть к Unuddle, является причиной того, что сообщение появляется Как я могу:

  1. Узнайте, где Git думает, что 'origin / master' находится?
  2. Если это где-то еще, как мне превратить мой ноутбук в «origin / master»?
  3. Получить это сообщение, чтобы уйти. Это заставляет меня думать, что Git чем-то недоволен.

Мой Mac работает под управлением Git версии 1.6.0.1.


Когда я запускаю git remote show origin, как предлагает dbr, я получаю следующее:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Когда я запускаю git remote -v, как предложил Аристотель Пагальцис, я получаю следующее:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Что интересно, я работаю над своим проектом в каталоге geekfor, но там написано, что мой источник - моя локальная машина в каталоге gf. Я полагаю, что gf был временным каталогом, который я использовал при преобразовании моего проекта из Subversion в Git и, вероятно, из того места, где я пытался развернуться. Тогда я считаю, что я извлек свежую копию с сайта unuddle в каталог geekfor.

Похоже, я должен последовать совету dbr и сделать:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

Ответы [ 13 ]

285 голосов
/ 06 апреля 2010

Я пришел к этому вопросу в поисках объяснения того, что означает сообщение "ваша ветвь впереди ..." в общей схеме git. Здесь не было никакого ответа, но так как этот вопрос в настоящее время появляется в верхней части Google, когда вы ищете фразу «Ваша ветвь впереди« origin / master »», и с тех пор я выяснил, что на самом деле означает сообщение Я думал, что выложу информацию здесь.

Итак, будучи мерзавцем-новичком, я вижу, что ответ, который мне нужен, был отчетливо новичком. В частности, фраза «ваша ветвь впереди…» означает, что есть файлы, которые вы добавили и добавили в свой локальный репозиторий, но никогда не выдвигали к источнику. Намерение этого сообщения далее скрыто тем фактом, что «git diff», по крайней мере для меня, не показал никаких различий. Только когда я запустил «git diff origin / master», мне сказали, что между моим локальным хранилищем и удаленным мастером есть различия.

Итак, чтобы быть ясным:


"ваша ветвь впереди ..." => Вам необходимо нажать на удаленный мастер. Запустите «git diff origin / master» , чтобы увидеть разницу между вашим локальным хранилищем и удаленным главным хранилищем.


Надеюсь, это поможет другим новичкам.

(Кроме того, я признаю, что есть тонкости конфигурации, которые могут частично лишить законной силы это решение, например, тот факт, что мастер может фактически не быть «удаленным», и что «происхождение» является реконфигурируемым именем, используемым соглашением, и т. Д. Но новичкам плевать на такие вещи. Мы хотим простых, простых ответов. Мы можем прочитать о тонкостях позже, когда решим насущную проблему.)

Earl

191 голосов
/ 10 ноября 2008

1. Узнайте, где Git думает, что 'origin / master' использует git-remote

git remote show origin

.. который вернет что-то вроде ..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Удаленный - это, по сути, ссылка на удаленный репозиторий. Когда вы делаете ..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

.. git отправит изменения на тот адрес, который вы добавили. Это как закладка для удаленных репозиториев.

Когда вы запускаете git status, он проверяет, нет ли на удаленном коммитах (по сравнению с вашим локальным репозиторием), и если да, то на сколько коммитов. Если вы отправите все свои изменения в «origin», оба будут синхронизированы, поэтому вы не получите это сообщение.

2. Если это где-то еще, как мне превратить мой ноутбук в «origin / master»?

Нет смысла делать это. Скажем, «происхождение» переименовано в «ноутбук» - вы никогда не захотите делать git push laptop со своего ноутбука.

Если вы хотите удалить исходный пульт, вы делаете ..

git remote rm origin

Это ничего не удалит (с точки зрения файла-содержимого / истории изменений). Это остановит сообщение «Ваша ветвь впереди…», так как оно больше не будет сравнивать ваш репозиторий с удаленным (потому что он пропал!)

Следует помнить, что в origin нет ничего особенного, это просто имя по умолчанию, используемое git.

Git по умолчанию использует origin, когда вы делаете такие вещи, как git push или git pull. Так что, если у вас есть пульт, которым вы часто пользуетесь (в вашем случае - Unuddle), я бы рекомендовал добавить Unuddle в качестве «origin»:

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

или выполните вышеуказанное в одной команде, используя set-url:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Тогда вы можете просто сделать git push или git pull для обновления вместо git push unfuddle master

38 голосов
/ 30 марта 2011

У меня была проблема, похожая на эту, где мой рабочий каталог был ahead of origin by X commits, но git pull приводил к Everything up-to-date. Мне удалось это исправить, следуя этому совету . Я публикую это здесь на случай, если это поможет кому-то еще с подобной проблемой.

Основное исправление выглядит следующим образом:

$ git push {remote} {localbranch}:{remotebranch}

Где слова в скобках должны быть заменены на ваше удаленное имя, имя вашего локального филиала и имя вашего удаленного филиала. например,

$ git push origin master:master
24 голосов
/ 08 июня 2012

иногда существует разница между локальной кэшированной версией мастера происхождения (origin / master) и истинного мастера происхождения.

Если вы запустите git remote update, это будет повторно синхронизировать мастер источника с источником / мастер

см. Принятый ответ на этот вопрос

Различия между оригиналом git pull и оригиналом git pull / master

9 голосов
/ 10 ноября 2008

Я думал, что мой ноутбук был источником ...

Это бессмысленно: origin относится к удаленному репозиторию по умолчанию - тому, из которого вы обычно извлекаете / извлекаете изменения других людей.

Как я могу:

  1. git remote -v покажет вам, что такое origin; origin/master - это ваша «закладка» для последнего известного состояния master ветви репозитория origin, а ваш собственный master является отслеживающей ветвью для origin/master. Это все как и должно быть .

  2. Вы не. По крайней мере, не имеет смысла, чтобы хранилище было удаленным хранилищем по умолчанию для себя.

  3. Это не так. Это просто говорит вам, что вы сделали столько-то коммитов локально, которых нет в удаленном хранилище (в соответствии с последним известным состоянием этого хранилища).

3 голосов
/ 01 июня 2011

[Решение]

$ git push origin

^ это решило это для меня. Что он сделал, он синхронизировал моего мастера (на ноутбуке) с «origin», который находится на удаленном сервере.

1 голос
/ 04 января 2012

Я тоже новичок в мерзавцах. У меня была такая же проблема с сообщениями "ваша ветвь опережает источник / мастер по N коммитам". Выполнение предложенного «git diff origin / master» показало некоторые различия, которые я не хотел хранить. Итак ...

Так как мой git clone был для хостинга, и я хотел получить точную копию основного репо, и не хотел сохранять какие-либо локальные изменения, я решил сохранить весь репо и создать новый:

(на хостинге)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Для удобства я обычно вносил изменения в клон на моем хост-компьютере. Больше не надо. Я внесу эти изменения в мастер, сделаю git commit и сделаю git pull. Надеюсь, это должно обеспечить полную синхронизацию моего клона git на хост-машине.

/ Нара

1 голос
/ 26 июля 2011

У меня недавно была эта проблема, и я подумал, что это потому, что я удалил некоторые файлы, которые мне больше не нужны. Проблема в том, что git не знает, что файлы были удалены, и видит, что он все еще есть на сервере. (сервер = источник)

Итак, я побежал

git rm $(git ls-files --deleted)

А затем запустил коммит и пуш.

Это решило проблему.

1 голос
/ 20 апреля 2011

Это ждет вас, чтобы "подтолкнуть". Попробуйте:

$ git push

1 голос
/ 29 июля 2010

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

Я создаю новый репозиторий (rep1), помещаю в него один файл и фиксирую его.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Я создаю клон rep1 и называю его rep2. Я смотрю внутрь rep2 и вижу, что файл правильный.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

В rep1 я делаю одно изменение в файле и фиксирую его. Затем в rep1 я создаю пульт, указывающий на rep2 и отправляю изменения.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Теперь, когда я захожу в rep2 и делаю 'git status', мне говорят, что я опережаю происхождение.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README в rep2 такой же, как и до второго коммита. Единственные изменения, которые я сделал, - это rep1, и все, что я хотел сделать, это подтолкнуть их к rep2. Что это я не понимаю?

...