Чому філія показу статусу git актуальна, коли зміни існують вище за течією?


226

Зміни існують вгорі в відстеженій гілці, але коли я вводять, git statusце вказує, що моя локальна гілка оновлена. Це нова поведінка, я змінив налаштування конфігурації чи щось не так?

Дякую за допомогу.

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

Відповіді:


274

Те, що говорить вам статус, - це те, що ви стоїте за викликом, origin/master який називається місцевим номером вашого місцевого репо . У такому випадку, ця подія відбувається, щоб відслідковувати гілку в якомусь віддаленому, названому origin, але статус нічого не говорить вам про гілку на віддаленому. Він розповідає про ref, який є лише ідентифікатором комісії, який зберігається у вашій локальній файловій системі (у такому випадку це, як правило, у файлі, який називається .git/refs/remotes/origin/masterу вашій місцевій репортажі).

git pullробить дві операції; спочатку він робить a, git fetchщоб бути в курсі комісій у віддаленому РЕПО (який оновлює origin/masterпосилання у вашому локальному репо), потім робить це git mergeдля об'єднання цих комісій у поточну гілку.

Поки ви не зробите цей fetchкрок (самостійно чи через нього git pull), ваше місцеве репо не може знати, що є додаткові комісії вгору за течією, і git statusлише дивиться на ваш місцевий номер origin/master.

Коли git statusйдеться про оновлення, це означає "в курсі гілки, яку відслідковує поточна гілка", що в даному випадку означає "в курсі місцевого виклику origin/master". Це тільки прирівнюється до "оновленого стану зі статусом висхідного потоку, який було отримано останній раз, коли ми зробили fetch", що не є "актуальним з останнім статусом живої лінії вгору за течією".

Чому це працює саме так? Що ж, fetchкрок - це потенційно повільна і дорога мережа. Дизайн Git (та інших розподілених систем управління версіями ) полягає у тому, щоб уникнути мережевих операцій, коли це не потрібно, і це абсолютно інша модель для типової системи клієнт-сервер, до якої звикли багато людей (хоча, як зазначено в коментарях нижче, концепція Git "гілки віддаленого відстеження", яка викликає плутанину тут, поділяються не всіма DVCS). Цілком можливо використовувати Git офлайн, без підключення до централізованого сервера, і вихід git statusвідображає це.

Створення та перемикання гілок (і перевірка їх стану) в Git, як передбачається, буде легким, а не тим, що виконує повільну мережеву роботу до централізованої системи. Припущення при розробці Git та його git statusрезультатах полягало в тому, що користувачі розуміють це (занадто багато функцій Git має сенс, лише якщо ви вже знаєте, як працює Git). З прийняттям Git партіями та безліччю користувачів, які не знайомі з DVCS, це припущення не завжди справедливо.


79
Пізній коментар, але я зіткнувся з тією ж ситуацією. Я розумію, чому git не має змоги дізнатися про зміни до отримання. Але тоді він не повинен говорити "в курсі", що просто не відповідає дійсності. Краще слід сказати "не маю уявлення, що могло статися віддалено".
Droidum

31
Можливо, це цілком логічно, але це зовсім не розумно. Чому б ти не спроектував це зробити DOH, а потім оголосити, чи це актуально? Або змінити повідомлення, щоб сказати, що воно насправді зробило, наприклад, "Ваша філія була в курсі" походження / головного "при останньому перевірці в {timestamp}"? Або навіть просто сказати: "Зробіть збір, щоб дізнатися, чи актуальна ваша філія"?
Колін

25
чому взагалі турбує показ повідомлення "Ваша філія актуальна"? Я не бачу сенсу знати статус походження / головного господаря, і якщо він повинен представляти фактичну головну гілку на віддаленому джерелі походження, то він явно не має жодного поняття.
whiterook6

2
@pastullo, тому створіть псевдонім.
Джонатан Уейклі

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

35

Це тому, що ваше місцеве репо не зареєструвалося за допомогою віддалених передач. Щоб мати цю роботу так, як ви її очікували, використовуйте, git fetchа потім запустіть ще git statusраз.


7

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

git remote show origin

Що потрібно зробити - це повернути всі поточні відслідковувані гілки, а головне - інформацію, чи вони актуальні, попереду чи позаду віддалених. Після наведеної вище команди це приклад повернення:

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

Сподіваюся, що це комусь допоможе.


0

"origin / master" посилається на посилання на посилання на команду HEAD відділення "origin / master". Посилання - дружнє для людини ім'я псевдоніму на об’єкт Git, як правило, об'єкт фіксації. Посилання "origin / master" оновлюється лише тоді, коли ви перейдете git pushна ваш віддалений ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes ).

З коріння проекту виконайте:

cat .git/refs/remotes/origin/master

Порівняйте відображений ідентифікатор комісії з:

cat .git/refs/heads/master

Вони повинні бути однаковими, і тому Git каже, що masterце актуально origin/master.

Коли ти біжиш

git fetch origin master

Це отримує нові об’єкти Git локально під папкою .git / objects. І Git оновлює .git / FETCH_HEAD, так що тепер, він вказує на останню фіксацію отриманої гілки.

Отже, щоб побачити відмінності між вашою поточною локальною гілкою та гілкою, отриманою з вищої лінії, ви можете запустити

git diff HEAD FETCH_HEAD

1
Ви не повинні котувати предмети в каталозі .git, він не працюватиме з упакованими номерами. Крім того, поведінка, яку ви описали, є для старих версій git.
Андрій C

чи не origin/masterбуде оновлення також оновлене результатом, а також натисканням?
Jonathan Wakely

Правильно. До цього часу я використовував Git 1.8.3. Я можу помітити дійсно з версією 2.2.1, FETCH_HEAD оновлюється і під час завантаження. Крім того, якщо мова йде про повідомлення "Ваша гілка оновлена ​​з ..." або "Ваша гілка позаду ... від X фіксує", вона відображається лише в тому випадку, якщо ваша локальна філія відстежує дану віддалену гілку. Щоб майстер відстежував походження / master, потрібно запустити git branch -u origin / master від master master. Якщо відстеження немає, вам все одно потрібно запустити git diff.
Марек Стенлі

Тоді я пропоную вам виправити твердження про те, що посилання "походження / майстер" оновлюється лише тоді, коли ви натискаєте на віддалений пульт "
Джонатан Уейклі

0

Нехай погляд на зразок мерзотника репо , щоб перевірити , є чи your branch (master)це up to dateз origin/master.

Переконайтесь, що місцевий майстер відстежує походження / головне:

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

Більше інформації про місцеву головну галузь:

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

Переконайтеся, що origin / master є на одній комісії:

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

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



0

Тривіальна відповідь, але точна в деяких випадках, наприклад, у тому, що мене сюди привів. Я працював у новому для мене репо, і я додав файл, який не сприймався як новий.

У кінцевому підсумку, що файл відповідав шаблону у файлі .gitignore.


0

у цьому випадку використовуйте git add та інтегруйте всі відкладені файли, а потім використовуйте git commit, а потім git push

git add - інтегруйте всі файли pedent

git commit - зберегти фільтр

git push - збереження у сховищі

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