git: Ваша гілка випереджає X фіксує


379

Як це насправді відбувається?

На даний момент я працюю в одному репо, тому це мій робочий процес:

  1. Зміна файлів
  2. Здійснити
  3. Повторіть 1-2, поки задоволені
  4. Натисніть на майстер

Тоді, коли я це роблю, git statusце говорить мені, що моя гілка випереджає X фіксує (мабуть, стільки ж комітетів, які я зробив). Це тому, що при натисканні коду він фактично не оновлює локально кешовані файли (у папках .git)? git pullначебто "виправити" це дивне повідомлення, але мені все одно цікаво, чому це трапляється, можливо, я неправильно використовую git?


включаючи, яка гілка надрукована у повідомленні

Моє місцеве відділення випереджає господаря

куди тиснеш / тягнеш поточну гілку

Я натискаю на GitHub і тягну до того комп’ютера, над яким я працюю в цей час, моя локальна копія завжди повністю актуальна, оскільки я єдина, хто працює над цим.

він фактично не перевіряє віддалений репо

Ось що я думав, я вважав, що переконаюся, що моє розуміння цього було правильним.

чи передаєте ви це додаткові аргументи?

Не ті, які я бачу, можливо, в моєму кінці відбувається якась смішна конфігурація?

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

Як ви робите pushта які налаштування конфігурації віддалених та відділень?
CB Bailey

2
він насправді не перевіряє віддалене репо, вам потрібно зробити git вивезти останню інформацію на віддаленому репо після виконання натиску, це оновить локальну "віддалену" гілку, яку вона використовує для відстеження.
Сехат

2
@Sekhat: Хоча git statusне перевіряє віддалене сховище, так git pullі є. Якщо у вас є гілка відстеження для сховища, до якого ви натискаєте, git pushоновіть локальну гілку відстеження, щоб відобразити новий стан віддаленої гілки, якщо ваш поштовх буде успішним. Ось чому я запитав про конфігурацію запитувача, тому що якщо це не відбувається правильно, можливо, є помилка конфігурації.
CB Bailey

git status? справді? мій git statusніколи не каже мені, як далеко вперед моя гілка .. чи передаєте ви їй якісь додаткові аргументи?
hasen

4
@hasen j: git statusне переходить до віддаленого сховища, щоб перевірити, чи була оновлена ​​віддалена гілка. Він говорить про те, як далеко випереджає вашу локальну філію порівняно з локально зберігається відділенням дистанційного відстеження. Проблема полягає в тому, що звичайний git push(а також витяг та витяг) повинен оновити гілку віддаленого відстеження, і для запитувача це, здається, не працює. Щоб зрозуміти, чому нам потрібно бачити як точну форму git pushвикористовуваної, так і конфігурацію локального сховища, але оскільки запитувач вже прийняв відповідь, я не можу побачити, що це відбувається зараз.
CB Bailey

Відповіді:


508

Якщо ви отримаєте це повідомлення після того, як зробите це git pull remote branch, спробуйте дотримуватися його git fetch. (За бажанням, запустіть, git fetch -pщоб обрізати видалені гілки з репо)

Fetch, здається, оновлює місцеве представлення віддаленої гілки, що не обов'язково трапляється, коли ви робите git pull remote branch.


1
Браво. Це було справді питання. Я почав зі створення репозиторію в коді google. Потім я клонував це сховище на своєму ноутбуці, і я там працюю і натискаю на зміни, laptop => code.google. Я раніше отримував це повідомлення на своєму сервері, де я створив клон сховища коду code.google, і я втягував зміни. Я думаю, що для оновлення локальної бази даних потрібно отримати.
rjha94

2
У нас була така ж проблема, тому що інша гілка (А) вказувала на ту саму комісію господаря. Витягнення A та витягування майстра призвели до цієї ж ситуації. Коли git витягнув A, команда було оновлено до останнього, тому тягнути master у нього насправді не має нічого, тому git не оновлював останній коміс-майстер і попереджав про те, що він "випереджає майстра".
Уберто

8
Дякую, хоча я помітив одну дивну річ. "master git fetch origin" не допомагає, але "git fetch origin" робить. Я перебуваю на головній гілці, тому не впевнений, як "git fetch origin" зробив би щось інше в контексті.
Параг

2
@Parag см stackoverflow.com/questions/26350876 / ... для пояснення відмінностей між цими двома командами, і як можливо змінити конфігураційний файл , щоб змінити поведінку , щоб принести мерзотник віддалений філія також оновлює віддаленого відстеження гілки реф, так git_status не повідомляє "вперед".
Anatortoise House

2
@Parag, також stackoverflow.com/questions/7365415 / ... відповідь обговорює деталь ORIG_HEAD і FETCH_HEAD виходячи з синхронізації, в результаті чого попередження про стан і можливі виправлення файлу конфігурації.
Anatortoise House

138

Використовуйте

git pull --rebase

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


3
Дійсно хороший спосіб запобігти марним злиттям та мати більш чисте дерево за походженням!
Хатеф

1
Я спробував цю команду, але у мене все одно те ж питання ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh

4
Ця відповідь неправильна: якщо ви користуєтесь нею, не розуміючи ситуації, ви потенційно створюєте проблеми на час вперед (переписана історія!). Якщо ви розумієте ситуацію, це не буде виправленням. Подумайте, перш ніж вводити під час використання git, і ніколи не бездумно переписуйте історію!
cmaster - відновити моніку

80

Скористайтеся цими 3 простими командами

Крок 1 :git checkout <branch_name>

Крок 2 :git pull -s recursive -X theirs

Крок 3 :git reset --hard origin/<branch_name>

Детальніше: https://stackoverflow.com/a/39698570/2439715

Насолоджуйтесь.


3
Це єдина відповідь, яка фактично вирішила проблему для мене. Команди вгорі дивним чином збили її з 12 до 7 комірок, і це остаточно усунуло ці
Ieuan

1
Я згоден, що це єдине, що працювало на мене. Я переконаний, що у GIT іноді виникає розлад особистості.
поцілував

11
Як і @leuan, нічого, окрім git reset --hard origin/masterмене, це розчистило.
Дейв Ленд

Тут же, це єдині кроки, які працювали для мене
Shard_MW

51

Я думаю , що ви неправильне повідомлення - ваш філія не попереду master, то є master . Це попереду origin/master, який є віддаленим відстеженням гілки , яка записує статус віддаленого сховища з вашого останнім push, pullабо fetch. Це точно говорить вам, що ви зробили; ви випередили пульт, і це нагадує вам натиснути.


22
Це насправді після того, як я натиснув. Мені довелося витягнути (чи можливо взяти?), Щоб отримати це повідомлення, щоб не мати цього повідомлення.
SeanJA

26

Хтось сказав, що ви можете неправильно читати своє повідомлення, ви ні. Ця проблема насправді пов'язана з вашим <project>/.git/configфайлом. У ньому буде розділ, подібний до цього:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Якщо ви вилучите рядок вилучення з файлу .git / config вашого проекту, ви зупините "Ваша гілка випереджає" origin / master "на Nкоміти". роздратування від виникнення.

Або я так сподіваюся. :)


Я перевірю це наступного разу, коли побачу ahead by x commitsповідомлення. Я не бачив повідомлення вже давно.
SeanJA

Я не бачив повідомлення вже давно. Я думаю, це тому, що я почав створювати git repo локально, а потім підштовхую його до віддаленого репо, а не навпаки ...
SeanJA

Я спробував це, але він змусив eGit в Eclipse почати спливати з "внутрішньою помилкою", коли я намагався вчинити. Сам Git, здається, працює добре.
user4815162342

18
Що робить цей рядок? і що я пропускаю, видаляючи його? (крім роздратування)
Джон Мі

1
Це спрацювало, але це більше схоже на придушення помилки. Додайте рядок назад, і ви почнете отримувати попередження знову.
Крішна Пандей

15

У мене ця проблема була на моєму сценічному сервері, куди я тільки тягну. І важке скидання допомогло мені очистити HEAD до того ж, що і віддалений.

git reset --hard origin/master

Отже, я знову:

On branch master
Your branch is up-to-date with 'origin/master'.

Я спершу спробував без - твердого прапора, і це спрацювало!
kroiz

12

Це працювало для мене

git reset --hard origin/master

Вихід повинен мати вигляд

On branch dev HEAD is now at ae1xc41z Last commit message


11

У моєму випадку це було тому, що я перейшов на використання майстра

 git checkout -B master

Просто витягнути нову версію замість неї

 git checkout master

Перша команда скидає голову ведучого до моїх останніх доручень

я використав

git reset --hard origin/master

Щоб виправити це


9

Я переглядав кожне рішення на цій сторінці, і на щастя @ anatolii-pazhin прокоментував, оскільки його рішення було таким, яке працювало. На жаль, у мене недостатньо репутації, щоб підтримати його, але рекомендую спробувати його рішення спочатку:

git reset --hard origin/master

Що дало мені:

HEAD is now at 900000b Comment from my last git commit here

Я також рекомендую:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Ви також можете використовувати:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

Удачі


4

У мене ця проблема була на машині Windows. Коли я запустив git pull origin masterкоманду, я отримав би попередження "попереду" походження / майстер "від X виконує". Я виявив, що якщо я замість цього біг git pull originі НЕ вказував гілку, то я більше не отримуватиму попередження.


Я вважаю, що це ефективно робить git fetchза кадром.
Брайан Петерсон

"git fetch" не вирішив моєї проблеми, це зробило. У мене з’явився список щойно доданих гілок, і це повідомлення "Ви просили витягнути з віддаленого" вгору ", але ви не вказали гілку. Оскільки це не віддалений налаштований за замовчуванням для вашої поточної гілки, ви повинні вказати гілку в команді лінія ". а наступна команда "git status" не показала попередження.
Крішна Пандій

2

Він просто нагадує вам про відмінності між поточною гілкою та гілкою, яка робить поточну доріжку. Будь ласка, надайте більше інформації, включаючи, яка гілка надрукована у повідомленні та де ви натискаєте / тягнете поточну гілку.


2

Хоча це питання трохи старе ... Я опинився в подібній ситуації, і моя відповідь тут допомогла мені виправити подібне питання, яке я мав

Спершу спробуйте push -f варіант або форсувати

Якщо це не спрацювало, можливо, (як у моєму випадку) віддалені сховища (а точніше посилання на віддалені сховища, які відображаються на git remote -v ), можливо, не оновлюються.

Результатом є те, що ваш push синхронізував локальну / гілку з віддаленою / гілкою, однак кеш у вашому місцевому репо-ревізі все ще показує попередню фіксацію (локального / відділення ... за умови, що було натиснуто лише одну фіксацію) як HEAD.

Для підтвердження вищезазначеного клонуйте репо в іншому місці та спробуйте порівняти локальну / гілку HEAD та віддалену / гілку HEAD. Якщо вони обоє, то ви, мабуть, стикаєтеся з проблемою, яку я зробив.

Рішення:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

Тепер зробіть push -fнаступне

git push -f github master ## Зауважте, що у вашої команди originбільше немає!

Зробіть git pullзараз git pull github master

при git statusотриманні

# On branch master

nothing to commit (working directory clean)

Я сподіваюся, що це корисно для когось, оскільки кількість переглядів настільки велика, що пошук цієї помилки майже завжди перераховує цю тему вгорі

Для отримання детальної інформації зверніться також до gitref


2

У мене насправді це сталося, коли я робив комутацію / оформлення замовлення з TortiseGIT.

Моя проблема полягала в тому, що я створив філію на основі іншої місцевої гілки. Це створило запис "злиття", /.git/configякий виглядав приблизно так:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Де щоразу, коли я перейшов на відділення "web", це говорило мені, що я на 100+ завтра випереджаю розробку. Ну, я більше не зобов'язувався розвиватися, щоб це було правдою. Мені вдалося просто видалити цей запис, і він, здається, функціонує так, як очікувалося. Це належне відстеження за допомогою віддаленого відліку, а не скаржитися на те, що відстає від галузі розвитку.

Як сказала Вікрам, ця нитка переповнення стека - це найкращий результат в пошуку Google для цієї проблеми, тому я подумав, що поділюсь своєю ситуацією та рішенням.


2

Я хотів би ще раз зазначити те, що згадувалося вище @Marian Zburlia. Це працювало для мене і пропонувало б те саме і іншим.

git pull origin develop

слід дотримуватися $ git pull --rebase.

Це видалить коментарі, які з’являються $ git statusпісля останнього потягу.


2

git fetch це вирішить для вас

Якщо я розумію правильно, ваш локальний (кешований) origin/masterзастарів. Ця команда оновить стан репозиторію з сервера.


1
Будь ласка, додайте трохи опису
Mathews Sunny

2

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

Мій досвід - у командному середовищі з багатьма галузями. Ми працюємо у власних відділеннях (у місцевих клонах), і це було одне з тих, хто git statusпоказав, що я на 11 позицій попереду. Моє робоче припущення, як і автор запитання, полягало в тому, що +11 було з моїх власних комітетів .

З'ясувалося, що я змінив зміни із загальної developгілки до моєї гілки багато тижнів раніше - але забув! Сьогодні я переглянув місцеву галузь функцій і зробив git pull origin developчисло, яке підскочило до +41 перемоги вперед. Багато роботи було зроблено, developі тому моя місцева філія функції була ще більше випереджаючою галуззю функцій наorigin сховищі.

Отже, якщо ви отримаєте це повідомлення, подумайте про будь-які потяги / злиття, які ви могли зробити з інших галузей (ваших власних чи інших), до яких ви маєте доступ. Повідомлення просто сигналізує вам потрібно git pushтой - pullй вид зміна назад в originрепозиторій ( «відстеження гілки») з локальним сховища , щоб отримати речі синхронізовані вгору.


1

Відповіді, які підказують git pullабо git fetchє правильними.
Повідомлення генерується, коли git statusбачить різницю між .git/FETCH_HEADта .git/refs/remotes/<repository>/<branch>(наприклад .git/refs/remotes/origin/master).

Останній файл записує HEAD з останнього вибору (для сховища / гілки). Здійснює git fetchоновлення обох файлів до поточної ГЛАВИ гілки.
Звичайно, якщо немає чого отримати (оскільки локальне сховище вже оновлено), .git/FETCH_HEADвоно не змінюється.


Здається, це не так для мене: .git/FETCH_HEADмістить 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLі .git/refs/remotes/origin/masterмістить 9f7336c873ccffc772168bf49807e23ff74014d3, але я все одно отримую повідомлення і ні, git pullні git fetchвирішує його
Давіде

0

Якщо ви отримаєте це повідомлення після виконання зобов’язання для того, щоб вилучити файл у гілці, спробуйте внести деякі зміни в будь-який файл і виконати фіксацію. Мабуть, ви не можете зробити єдину комісію, яка включає лише вилучення раніше відслідковуваного файлу. Нарешті ця публікація допомогла мені вирішити всю проблему https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Мені просто довелося видалити файл з історії сховища.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.