Как мне найти местоположение источника / мастера в git и как его изменить?


227

Я новичок в 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 считает «происхождение / мастер»?
  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 и, возможно, туда, откуда я столкнулся. Тогда я считаю, что я проверил свежую копию с сайта в geekforкаталог.

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

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

Ответы:


202

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


1
Он пишет, что отправляет в originхранилище (даже если он не знает, как это работает в терминах git) - удаление пульта вряд ли было бы полезно для него.
Аристотель Пагальцис

10
Я не понимаю, почему люди перефразируют вопросы. Это меняет смысл вопроса, делает бессмысленными существующие ответы и не позволяет другим людям знать, что спрашивающему вопрос нужно больше информации, основываясь на том факте, что их вопрос может быть слегка «неправильным».
Stu

9
Удаление удаленного источника было именно тем , что мне было нужно, поскольку оно указывало на локальный репозиторий, который больше не существовал, а не на репозиторий unuddle.
Брайан Келли

3
Стю: Переписывание это хорошая вещь! Если они не произносят слова, это явно во-первых, нет смысла получать ответы, которые не решают актуальную проблему.
DBR

4
Но так легче злиться и быть горьким. :-) Но я вижу вашу точку зрения.
Stu

286

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

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

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


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


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

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

граф


2
@Earl Не будет git diff --cached origin/masterли лучше инструкция здесь, поскольку в ней говорится, что будет результатом следующего толчка? Выделенная команда, которую вы указали выше, также отображает незафиксированные и неустановленные файлы (я думаю, я тоже новичок в Git)
nhed

48
Также возможно, что вам нужно запустить, git fetchесли вы получаете эту ошибку после git pull remote branch. Ваши ссылки могут быть устаревшими. git fetchисправляет это.
Брайан Кеннеди

делает origin/masterчасть средней masterветви в originрепо?
Ракиб

1
Обратите внимание, что это описание неполное. Я в настоящее время испытываю, # On branch master # Your branch is ahead of 'origin/master' by 3 commits. но git diff origin / master ничего не показывает (и параметр --cached не меняет это). И, git fetch не меняет это, git pull не меняет это, git reset --hard не меняет это. Чтобы изменить это, мне нужно было: git reset --hard origin / master И я выбрал этот маршрут, потому что другие люди работают со мной в этом хранилище, и я не хотел аннулировать их тестирование, и потому что я не мог выяснить, что эти коммиты являются.
RDM

1
Я также получаю это сообщение, когда мне нужно вытащить, а не толкнуть на источник / мастер. например, из другой ветки, если я git checkout masterполучаю сообщение, что означает, что я должен git pull origin masterперед работой. но я нахожу это очень запутанным, потому что формулировка сообщения предполагает обратное
Anentropic

38

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

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

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

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

$ git push origin master:master

1
Спасибо, что сделал это для меня. git diffничего не показывал, и после выполнения того, что вы описали, я больше не получаю это запутанное и раздражающее сообщение.
LaundroMat

1
Нужно больше голосов :). Все ответы с более высоким рейтингом были для меня "безрезультатными" (то есть "git fetch" - ничего не делали ... проверяли "git remote show origin" - ничего неправильного, ничего не нужно менять)
Адам

24

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

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

увидеть принятый ответ на этот вопрос

Различия между git pull origin master и git pull origin / master


10

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

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

Как я могу:

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

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

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


1
Я предположил, что мой ноутбук был источником, так как именно там я впервые создал хранилище (там, где он возник).
Брайан Келли

1
Напротив, для меня совершенно originлогично указывать на ноутбук локально, поскольку отключение или переключение сетей - очень распространенный случай для портативных устройств, таких как ноутбуки. Таким образом, вы можете использовать git pushи в git pullлюбое время, не нужно думать, если вы подключены к нужной сети в настоящее время. Эта локальная originсеть может автоматически синхронизироваться с реальными пультами, когда доступно сетевое соединение, в зависимости от текущего состояния роуминга. Проблемная часть заключается в том, когда выполнять какую синхронизацию, по сравнению с этой частью GIT довольно легко.
Тино

2
Конечно, указание originна другое хранилище на вашем ноутбуке имеет смысл. Однако указание originхранилища на себя не имеет значения: не имеет значения, запускаете ли вы git pushили нет git pull, поскольку хранилище всегда точно синхронизировано с самим собой. Это как-то тавтологично.
Аристотель Пагальцис

3

[ Решение ]

$ git push origin

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


1

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

Я создаю новый репозиторий (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. Что это я не понимаю?


1
Две вещи: проверка origin / master в rep2 на самом деле не смотрит на rep1. Если вы выполните 'git pull' в rep2, он заметит, что они находятся в одном состоянии, и перестанет жаловаться. Чтобы реально увидеть изменения от push в рабочей копии, вам нужно выполнить «git checkout» - толчки никогда не касаются рабочей копии dest repo.
Вальтер Мундт

Я думал, что это может быть в этом случае, но я получаю "git checkout M README Ваша ветвь впереди 'origin / master' на 1 коммит". Но моя рабочая копия фактически отстает на 1 коммит, а не впереди.
Стив Хиндмарч


1

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

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

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

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

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


1
Это работает только в том случае, если в сообщении о фиксации написано delete - <имя файла>
looneydoodle

1

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

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

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

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

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

/ Nara


0

Мне было интересно то же самое в моем репо. В моем случае у меня был старый пульт, на который я больше не давал, поэтому мне нужно было его удалить.

Получить список пультов:

git remote

Удалить тот, который вам не нужен

git remote rm {insert remote to remove}

0

Можно выполнить сброс до определенного коммита до того, как произойдет ваш коммит.

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

Используйте, git logчтобы узнать, какой коммит вы имели до того, как произошли локальные изменения.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Запишите локальные коммиты и сбросьте их до предыдущего коммита:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

У меня возникла проблема "Ваша ветвь опережает 'origin / master' от nn commits." когда я нажал на удаленный репозиторий с:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

Когда я обнаружил, что мой удаленный адрес был в файле .git / FETCH_HEAD и использовал:

git push

проблема исчезла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.