Как мне найти местоположение источника/мастера в git и как его изменить?
-
07-07-2019 - |
Вопрос
Я новичок в 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 для развертываний и извлекаю код из репозитория unfuddle, используя главную ветку.
Недавно я заметил следующее сообщение, когда запускаю «git status» на своем ноутбуке:
# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)
И я в недоумении, почему.Я думал, что мой ноутбук был источником...но не знаю, является ли причиной появления сообщения тот факт, что я изначально извлек из Subversion или отправил в Unfuddle.Как я могу:
- Узнайте, где, по мнению Git, находится «происхождение/мастер»?
- Если это где-то еще, как мне превратить свой ноутбук в «оригинал/мастер»?
- Уберите это сообщение.Это заставляет меня думать, что 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 и, вероятно, оттуда я нажал, чтобы разобраться.Затем, кажется, я проверил свежую копию от Unfuddle до geekfor
каталог.
Итак, похоже, мне следует последовать совету dbr и сделать:
git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git
Решение
1.
Узнайте, где Git считает, что «origin / master» использует <код> ГИТ-удаленный код> р>
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
Другие советы
Я пришел к этому вопросу в поисках объяснения того, что означает сообщение «ваша ветка впереди...» в общей схеме git.Здесь не было ответа на этот вопрос, но поскольку этот вопрос в настоящее время появляется в верхней части Google, когда вы ищете фразу «Ваша ветка опережает «origin/master»», и с тех пор я понял, что на самом деле означает это сообщение. , решил разместить информацию здесь.
Итак, будучи новичком в git, я вижу, что ответ, который мне был нужен, был явно ответом новичка.В частности, фраза «ваша ветка впереди...» означает, что есть файлы, которые вы добавили и зафиксировали в своем локальном репозитории, но никогда не отправляли в источник.Цель этого сообщения еще больше запутывается тем фактом, что «git diff», по крайней мере для меня, не выявил никаких различий.Только когда я запустил «git diff origin/master», мне сказали, что между моим локальным репозиторием и удаленным мастером есть различия.
Итак, чтобы внести ясность:
"Ваша ветка впереди на..." => Вам нужно отправить команду удаленному мастеру.Бегать "git diff origin/master" чтобы увидеть различия между вашим локальным репозиторием и удаленным главным репозиторием.
Надеюсь, это поможет другим новичкам.
(Кроме того, я осознаю, что существуют тонкости конфигурации, которые могут частично сделать это решение недействительным, например, тот факт, что мастер на самом деле не может быть «удаленным», и что «происхождение» — это реконфигурируемое имя, используемое по соглашению, и т. д.Но новичков это не волнует.Нам нужны простые и понятные ответы.О тонкостях мы сможем прочитать позже, когда решим насущную проблему.)
Эрл
У меня была проблема, похожая на эту, когда мой рабочий каталог был впереди источника X-коммитами
, но git pull
приводил к актуальный код>. Мне удалось это исправить, следуя этим советам . Я публикую это здесь на случай, если это поможет кому-то еще с подобной проблемой.
Основное исправление заключается в следующем:
$ git push {remote} {localbranch}:{remotebranch}
Где слова в скобках должны быть заменены на ваше удаленное имя, имя вашего локального филиала и имя вашего удаленного филиала. например.
$ git push origin master:master
иногда существует разница между локальной кэшированной версией мастера происхождения (origin / master) и истинного мастера происхождения.
Если вы запустите удаленное обновление git
, это повторно синхронизирует мастер источника с источником / мастером
см. принятый ответ на этот вопрос
Различия между мастером происхождения git pull и amp; git pull origin / master
Я думал, что мой ноутбук был источником & # 8230;
Это бессмысленно: origin
относится к удаленному репозиторию по умолчанию & # 8211; тот, с которого вы обычно получаете / извлекаете изменения других людей.
<Ол>Как я могу:
git remote -v
покажет вам, что такое origin
; origin / master
- это ваша & # 8220; закладка & # 8221; для последнего известного состояния ветви master
в хранилище origin
, а ваш собственный master
- это ветвь отслеживания для origin / master
. Это все как и должно быть .
Вы не пользуетесь т. По крайней мере, не имеет смысла, чтобы хранилище было удаленным хранилищем по умолчанию для себя.
Это не & # 8217; т. Это просто говорит вам, что вы сделали столько-то коммитов локально, которых нет в удаленном хранилище (в соответствии с последним известным состоянием этого хранилища).
[Решение]
$ git push origin
^ это решило это для меня. Что он сделал, он синхронизировал мой мастер (на ноутбуке) с «происхождением» это на удаленном сервере.
Я борюсь с этой проблемой, и ни один из предыдущих ответов не рассматривал вопрос так, как я его вижу. Я разобрал проблему до ее основ, чтобы посмотреть, смогу ли я прояснить проблему.
Я создаю новый репозиторий (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. Что я не понимаю?
Он ждет, когда вы "нажмете". Попробуйте:
$ git push
У меня недавно была эта проблема, и я решил, что это потому, что я удалил некоторые файлы, которые мне больше не нужны. Проблема в том, что git не знает, что файлы были удалены, и видит, что он все еще есть на сервере. (сервер = источник)
Итак, я побежал
git rm $(git ls-files --deleted)
А затем запустил коммит и нажал. Р>
Это решило проблему.
Я тоже новичок в git.У меня была та же проблема с сообщениями «ваша ветка опережает источник/мастер на N коммитов».Выполнение предложенного «git diff origin/master» выявило некоторые различия, которые я не хотел сохранять.Так ...
Поскольку мой клон git предназначался для хостинга, и мне нужна была точная копия главного репозитория, и я не хотел сохранять какие-либо локальные изменения, я решил сохранить весь свой репозиторий и создать новый:
(на хост-машине)
mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo
Для удобства я вносил изменения в клон на своем хостинге.Больше не надо.Я внесу эти изменения в мастер-файл, зафиксирую там git и выполню git pull.Надеюсь, это обеспечит полную синхронизацию моего клона git на хостинге.
/Нара
Мне было интересно то же самое в моем репо. В моем случае у меня был старый пульт, на который я больше не давал, поэтому мне нужно было его удалить.
Получить список пультов:
git remote
Удалите тот, который вам не нужен
git remote rm {insert remote to remove}
Можно выполнить сброс до определенного коммита до того, как произойдут ваши собственные коммиты.
$ 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
У меня возникла проблема " Ваша ветка опережает 'origin / master' по nn commits. " когда я нажал на удаленный репозиторий с:
git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git
Когда я обнаружил, что мой удаленный адрес был в файле .git / FETCH_HEAD и использовал:
git push
проблема исчезла.