Як я можу знайти місце походження / master у git та як це змінити?


227

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

Я також використовую unuddle.com для зберігання свого коду. Я вношу зміни на своєму ноутбуці Mac у поїзді до / з роботи, а потім підштовхую їх до відміни, коли у мене є мережне з'єднання, використовуючи таку команду:

git push unfuddle master

Я використовую Capistrano для розгортань і витягую код з відмінювання сховища за допомогою гілки master.

Останнім часом я помітив таке повідомлення, коли запускаю "статус git" на своєму ноутбуці:

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

І я розгублений, чому. Я подумав, що мій ноутбук був джерелом ... але не знаю, чи не те, що спочатку я витащив із Subversion або натиснув на Unfuddle - це те, що викликає повідомлення. Як я можу:

  1. Дізнайтеся, де Гіт думає, що "походження / господар"?
  2. Якщо це десь в іншому місці, як я можу перетворити свій ноутбук на "походження / головного"
  3. Отримайте це повідомлення, щоб піти. Це змушує мене думати, що Гіт чомусь незадоволений.

Мій 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

Відповіді:


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він перевіряє, чи у віддаленому файлі відсутні коміти (порівняно з вашим локальним сховищем), а якщо так, то на скільки комітетів. Якщо ви натиснете всі свої зміни на "походження", вони будуть синхронізовані, тож ви не отримаєте це повідомлення.

2. Якщо це десь в іншому місці, як я можу перетворити свій ноутбук на "походження / головного"

Немає сенсу робити це. Скажіть, що "походження" перейменовано на "ноутбук" - цього ніколи не хочеться робити git push laptopзі свого ноутбука.

Якщо ви хочете видалити вихідне джерело, ви зробите ..

git remote rm origin

Це не зможе видалити що-небудь (з точки зору файлового вмісту / ревізії-історії). Це припинить повідомлення "ваша гілка попереду ..", оскільки вона більше не буде порівнювати ваше сховище з віддаленим (адже його вже немає!)

Варто пам’ятати, що в цьому немає нічого особливого origin, це лише ім'я git, яке використовується за замовчуванням.

Git використовується originза замовчуванням, коли ви робите такі речі, як git pushабо git pull. Отже, якщо у вас є пульт, який ви багато використовуєте (Unfuddle, у вашому випадку), я рекомендую додати unuddle як "походження":

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
Я не розумію, чому люди переробляють питання. Це змінює зміст питання, він робить існуючі відповіді безглуздими, і це не дає іншим людям знати, що запитувачеві питання потрібна додаткова інформація, виходячи з того, що їх питання може бути трохи невірним.
Ст

9
Видалення віддаленого джерела було саме те , що мені було потрібно, оскільки воно вказувало на локальне сховище, яке вже не існувало, а не на скасовування сховища.
Брайан Келлі

3
stu: Переформатування - це добра річ! Якщо вони в першу чергу чітко не сказали слова, немає сенсу отримувати відповіді, які не вирішують актуальну проблему.
DBR

4
Але так набагато легше злитися і бути гіркотою. :-) Але я бачу вашу думку.
stu

286

Я підійшов до цього питання, шукаючи пояснення щодо того, що означає повідомлення "ваша гілка попереду ..." в загальній схемі git. Тут на це відповіді не було, але оскільки це питання наразі з’являється у верхній частині Google, коли ви шукаєте фразу "Ваша гілка випереджає" походження / головний ", і я з того часу з’ясував, що таке повідомлення насправді означає , Я думав, що розміщу інформацію тут.

Отож, будучи новачком з гнітом, я можу бачити, що потрібна мені відповідь була явно новачковою відповіддю. Зокрема, те, що означає "ваша філія попереду ...", це те, що є файли, які ви додали та привласнили до вашого локального сховища, але ніколи не підштовхували їх до початку. Намір цього повідомлення ще більше пригнічений тим, що "git diff", принаймні для мене, не виявив відмінностей. Тільки до того, як я запустив "git diff origin / master", мені сказали, що існують відмінності між моїм місцевим сховищем та віддаленим майстром.

Отже, щоб було зрозуміло:


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


Сподіваюся, що це допомагає іншим новачкам.

(Також я усвідомлюю, що існують тонкощі конфігурації, які частково можуть визнати недійсним це рішення, наприклад, те, що майстер насправді не може бути "віддаленим", і що "походження" - це ім'я, яке може бути конфігуруване, що використовується конвенцією тощо. не байдуже до подібних речей. Ми хочемо простих, зрозумілих відповідей. Про тонкощі ми можемо прочитати пізніше, як тільки вирішимо актуальну проблему.)

Граф


2
@Earl Не git diff --cached origin/masterбуде тут кращої інструкції, оскільки в ній зазначено, що буде наслідком наступного натиску? Виділена вище команда також показує невиправлені файли та непомічені файли (я думаю, я теж git newbie)
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 - твердий не змінює цього. Щоб змінити це, мені знадобилося: git reset - тверде походження / 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" - нічого неправильного, нічого не потрібно змінювати)
Adam

24

іноді існує різниця між локальною кешованою версією master master (origin / master) та справжнім master master початком.

Якщо це запустити, git remote updateвін буде пересинхронізувати початковий код з origin / master

див. прийняту відповідь на це запитання

Відмінності між master git origin origin і 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, він помітить, що вони знаходяться в одному стані, і перестане скаржитися. Щоб насправді побачити зміни від натискання в робочій копії, вам потрібно зробити "git checkout" - натискання ніколи не торкаються робочої копії dest repo.
Вальтер Мундт

Я думав, що це може бути так, але я отримую "git check M M README Ваша філія випереджає" origin / master "на 1 коміту". Але моя робоча копія фактично відстає на 1 комітку, а не попереду.
Стів Хайндмарш

1

Це чекає на те, що ви «підштовхнете». Спробуйте:

$ git push


1

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

Тому я побіг

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

А потім побіг виконувати та натиснути.

Це вирішило питання.


1
Це працює лише в тому випадку, якщо повідомлення про фіксацію видаляє - <ім'я файлу>
looneydoodle

1

Я також новачок у гніті. У мене була така сама проблема з повідомленнями: "Ваша філія випереджає походження / майстер повідомленнями N комітів". Виконуючи запропоновані "git diff origin / master", я показав деякі відмінності, які я не хотів тримати. Так ...

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

(на хостинговій машині)

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

Для доцільності я вносив зміни до клону на своєму хостинговій машині. Не більше. Я внесу ці зміни до господаря, git там зроблять і зроблю git pull. Будемо сподіватися, що це повинно підтримувати мій клон git на хостинг-машині в повній синхронізації.

/ Нара


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.