git push говорит «все актуально», хотя у меня есть локальные изменения


238

У меня есть удаленный сервер gitosis и локальный репозиторий git, и каждый раз, когда я делаю большие изменения в своем коде, я также отправляю изменения на этот сервер.

Но сегодня я обнаружил, что, несмотря на некоторые локальные изменения и фиксацию в локальном репозитории, при запуске git push origin masterон говорит «Все актуально», но когда я использую git cloneдля извлечения файлов на удаленном сервере, он не содержит последних изменений , И у меня есть только одна ветка с именем "master" и один удаленный сервер с именем "origin".

PS: это то, что git отображает при запуске ls-remote, я не уверен, помогает ли это

$ git ls-remote origin
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
$ git ls-remote .
49c2cb46b9e798247898afdb079e76e40c9f77ea        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/remotes/origin/master
3a04c3ea9b81252b0626b760f0a7766b81652c0c        refs/tags/stage3


Стоит дважды проверить, что вы находитесь в правильном каталоге! Особенно когда у вас есть подмодули, вы можете ошибочно принять git-ответы от родителя ..
geotheory

В моем случае я получал ошибку, commitкоторую я не заметил, и пытался вставить код
Зохаб Али

3
забыл совершить?
ldgorman

Ответы:


256

Вы работаете с отстраненной головой случайно?

Как в:

оторванная голова

показывая, что ваш последний коммит не является главой ветки.

Предупреждение : следующее git reset --hard: убедитесь, что git stashсначала используете, если хотите сохранить измененные в данный момент файлы.

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Как упомянуто на git checkoutстранице руководства (выделено мое):

Иногда полезно иметь возможность извлекать коммит, который не находится на кончике одной из ваших веток .
Самый очевидный пример - проверить коммит в официальной точке релиза с тегом, например так:

$ git checkout v2.6.18

В более ранних версиях git это не разрешалось, и вам предлагалось создать временную ветку, используя эту -bопцию, но начиная с версии 1.5.0 вышеприведенная команда отсоединяет вашу HEADот текущей ветви и напрямую указывает на коммит, указанный тегом ( v2.6.18в пример выше).

Вы можете использовать все команды git, находясь в этом состоянии.
Вы можете использовать git reset --hard $othercommitдля дальнейшего перемещения, например.
Вы можете вносить изменения и создавать новый коммит поверх отдельного HEAD .
Вы даже можете создать слияние, используя git merge $othercommit.

Состояние, в котором вы находитесь, пока ваш HEAD отсоединен, не записывается ни одной веткой (что естественно - вы не находитесь ни в одной ветке).
Это означает, что вы можете отказаться от своих временных коммитов и слияний, переключившись обратно на существующую ветку (например git checkout master), а затем git pruneили git gcсобрать их.
Если вы сделали это по ошибке, вы можете попросить reflog для HEAD, где вы были, например,

$ git log -g -2 HEAD

4
Мне не совсем понятно, как я попал в это состояние (пока что занимался гаданием с git-svn), но этого было достаточно, чтобы вернуть меня в нужное место. Спасибо.
Кристофер Шмидт

Я нахожусь в отдельном состоянии, слил свои изменения, зафиксировал свои изменения, и теперь я хочу передать это Мастеру и не могу - говорит мне «все в курсе». Но я следую инструкциям моего Гитлаба: Step 1: git fetch origin git checkout -b "nodeAPI" "origin/nodeAPI" Step 2. Review the changes locally Step 3. Merge and fix conflicts git fetch origin git checkout "origin/master" git merge --no-ff "nodeAPI" Step 4. Push the result of the merge to GitLab git push origin "master" я в порядке до последнего шага. Но сейчас я просто запутался, как двигаться вперед.
Джон

@John Вы должны быть в ветке, чтобы подтолкнуть. Пока вы находитесь в автономном режиме HEAD, это не будет работать. Верните свою ветку туда, где вы находитесь:, git branch -f myBranch HEADзатем оформите указанную ветку и нажмите на нее. В вашем случае, myBranchможет быть, masterесли вы были в процессе слияния nodeAPI.
VonC

Пожалуйста, остерегайтесь потери всех локальных изменений после выполнения этой команды !! Подумайте о создании git stash & code backup, прежде чем делать что-то подобное.
кт

@kta Хороший вопрос: я отредактировал ответ, чтобы сделать это предупреждение видимым.
VonC

152

Э-э-э ... Если вы мерзавец, вы уверены, что git commitраньше git push? Я сделал эту ошибку в первый раз!


10
Это было git commit -a -m "your message goes here"в моем случае
aexl

Я ЛЮБЛЮ (сарказм) каждый раз, когда я хочу добавить новый проект в github, я иногда забываю, и сообщение об ошибке заставляет меня думать, что я сделал что-то действительно неправильно - тогда, конечно, DUH! коммит Только со мной происходит, когда я
создаю

git noob здесь - я забываю совершать каждый проклятый раз перед тем, как нажимать - нажатие должно автоматически фиксироваться, если вы не сделали этого раньше
FoxMcCloud

2
@FoxMcCloud является совершали важный шаг , чтобы осознавать, я уверен , что вы будете учиться любить его , если вы еще не :) ~ git add -A, git diff --staged, прокручивает изменения Хмм выглядит очень хорошо, git commit -m 'bam!',git push
AFOC

58

Может быть, вы продвигаете новую местную ветку?

Новая локальная ветвь должна быть выдвинута явно:

git push origin your-new-branch-name

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


3
Спасибо! Это исправило мою проблему "все в курсе" с новой веткой, которую я имел
Pangu

Что, черт возьми, означает «ваше новое имя-ветви»? Ps: Вы ооочень правы по поводу новичков.
www-0av-Com

@ user1863152 это имя новой локальной ветки, которую вы создали. Похоже, вы этого не делали, поэтому посмотрите другие ответы здесь.
Роман Старков

Полностью согласен с «этот рабочий процесс крайне недружественный для новичков». Я борюсь с этим с 1 часа. Я устанавливаю удаленное и локальное репо. Внесены изменения в локальный файл REAME и попробуйте отправить его на удаленный компьютер, а на удаленном компьютере ничего не изменится.
Vir


28

Еще одна ситуация, о которой важно знать: своего рода состояние по умолчанию для git - это то, что вы работаете в «основной» ветке. И для многих ситуаций вы будете просто тусоваться в этом как ваша основная рабочая ветвь (хотя некоторые люди увлекаются и занимаются другими делами).

Во всяком случае, это только одна ветвь. Итак, ситуация, в которую я могу попасть:

Моя активная ветвь на самом деле НЕ является основной ветвью. ... Но я обычно делаю команду: git push(а я раньше делал git push origin master, так что это ярлык для ТО).

Поэтому я обычно помещаю ветку master в общий репозиторий ... что в моем случае, вероятно, неплохо ...

Но я забыл, что изменения, над которыми я работал, еще не в ветке master !!!

Поэтому каждый раз, когда я пытаюсь git push, и вижу «Все в курсе», я хочу кричать, но, конечно, это не вина Гита! Это мое.

Вместо этого я объединяю свою ветку с мастером, а затем делаю push, и все снова становится счастливым.


Я тоже хотел кричать, но потом вы проповедовали путь спасения, чтобы объединить Бранта с мастером, а затем git push.
Аарон С

16
$ git push origin local_branch:remote_branch

объяснение

У меня была та же ошибка, и я часами пытался ее выяснить. Наконец я нашел это. Чего я не знал, так это того, что нажатие этой git push origin branch-xкнопки будет пытаться найти локальную ветвь-x, а затем - удаленную ветвь-x.

В моем случае у меня было два удаленных URL. Я сделал проверку от Branch-X до Branch-Y, когда пытался передать с локального Y на удаленный X Я получил сообщение, что все в порядке, что является нормальным, потому что я нажимал на X второго пульта.

Короче говоря, чтобы не попасть в эту ловушку, вам нужно указать исходную ссылку и целевую ссылку:

$ git push origin local_branch:remote_branch

Обновить:

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

$ git push --set-upstream origin local_branch:remote_branch

Или

$ git push -u origin local_branch:remote_branch

'git push upstream dev: master' Это означает, что он будет толкать источник от dev к master. Правильно?
Дхадук Митеш

Это помогло мне, у меня был другой локальный филиал, названный как удаленный, что вызвало путаницу.
Юбер Кубяк

Хорошо, это определенно работает для меня, но я должен делать это каждый раз, когда хочу что-то перенести на пульт. Как мне это исправить раз и навсегда?
Самурай Джек

вам может потребоваться установить восходящий поток между вашей локальной и удаленной веткой следующим образом: $ git push --set-upstream origin local_branch: remote_branch
Melchia

6

Смотрите ответ VonC выше - мне нужен был дополнительный шаг:

$ git log -1
- note the SHA-1 of latest commit
$ git checkout master
- reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Я сделал это, но когда я попытался git push remoterepo master, он сказал: «ошибка: не удалось нажать некоторые ссылки. Чтобы предотвратить потерю истории, обновления без ускоренной перемотки были отклонены, объедините удаленные изменения (например,« git pull ») перед толкать снова ".

Так что я сделал 'git pull remoterepo master', и он обнаружил конфликт. Я сделал git reset --hard <commit-id>снова, скопировал конфликтующие файлы в резервную папку, сделал git pull remoterepo masterснова, скопировал конфликтующие файлы обратно в мой проект git commit, затем сделал git push remoterepo master, и на этот раз это сработало.

Гит перестал говорить «все актуально» - и перестал жаловаться на «быстрые форварды».


3

Я столкнулся с подобной ситуацией; когда я внес изменения и попытался git push origin master это, он говорил, что все было в курсе.

Я должен был git addизменить файл, а затем git push origin master. Это начало работать с тех пор.


4
Разве вам не нужно git commitдобавлять этот файл перед нажатием?
Дэвид Харкнесс

3

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

Но в любом случае, вот что случилось со мной .. Я столкнулся со следующей ошибкой:

fatal: The remote end hung up unexpectedly
Everything up-to-date

Более информативным сообщением здесь является то, что пульт повесил трубку. Оказалось, что это связано с превышением размера HTTP-буфера постов. Решение состоит в том, чтобы увеличить его с

git config http.postBuffer 524288000


3

У меня была эта проблема сегодня, и она не имела ничего общего с другими ответами. Вот что я сделал и как я это исправил:

Мой репозиторий недавно переехал, но у меня была локальная копия. Я отделился от своего локального «главного» филиала и внес некоторые изменения, а затем вспомнил, что хранилище перенесено. Я использовал git remote set-url origin https://<my_new_repository_url>для установки нового URL, но когда я нажимал, он просто говорил «Все в курсе» вместо того, чтобы подталкивать мою новую ветку к мастеру.

Я закончил тем, что решил ее, перебрав на origin/masterи затем подтолкнув с явными названиями веток, например так:

$ git rebase <my_branch> origin/master
$ git push origin <my_branch>

Надеюсь, это поможет любому, у кого была такая же проблема!


3

Очень редко - но все же: в Windows может быть, что упакованные ссылки имеют ветку с одним регистром букв (т.е. dev / mybranch), а ссылки папке есть другой регистр (то есть dev / mybranch), когда для core.ignorecase установлено значение true ,

Решение состоит в том, чтобы вручную удалить соответствующую строку из упакованных ссылок . Не нашел более чистого решения.


Это было проблемой для меня тоже. Закончилось переименованием папок с неверным регистром внутри папки .git (logs / refs /heads, refs /head).
Алексей Солонец

2

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

Сначала я разветвлял новую локальную ветку от моей старой локальной ветки (которую я не мог нажать). Затем я перенес новую локальную ветку на исходный сервер (Github). Т.е.

$ git checkout -b newlocalbranch oldlocalbranch
$ git push origin newlocalbranch

Это заставило изменения появиться на Github, хотя и в newlocalbranch, а не в oldlocalfranch.


2

В моем случае у меня было 2 удаленных репо.

git remote -v
originhttps https://asim_kt@...
originhttps https://asim_kt@...
origin  ssh:git@bitbucket.org:...
origin  ssh:git@bitbucket.org:...

Оба репо были одинаковыми. Просто один был httpsдругим был ssh. Таким образом, удаление ненужного (в моем случае ssh. Поскольку я использовал, httpsпотому что sshне работал!) Решило проблему для меня.


2

Моя ошибка отличалась от всего, что упоминалось ранее. Если вы не знаете, почему у вас оторванная голова, то, вероятно, нет. Я работал на автопилоте с git commitи git pushи не читал вывод с git commit. Оказывается, это было сообщение об ошибке, потому что я забыл -am.

[colin] ~/github/rentap.js [master] M % git commit 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'
error: pathspec 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers' did not match any file(s) known to git.
[colin] ~/github/rentap.js [master] M % git push
Enter passphrase for key '/home/colin/.ssh/id_ecdsa': 
Everything up-to-date

Исправил это, поставив, -amгде я обычно делаю:

[colin] ~/github/rentap.js [master] M % git commit -am 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'

2

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

git push origin master

И это показывает сообщение Everything up-to-date.

чтобы решить эту проблему, попробуйте эти шаги

  1. git add .
  2. git commit -m "Bug Fixed"
  3. git push -u origin master

1

Убедитесь, что вы не указали свой удаленный URL.

Я просто хотел также упомянуть, что столкнулся с этим после включения Git в качестве CVS в локальной конфигурации сборки Jenkins. Похоже, что Дженкинс проверил самый последний коммит из ветви, которую я дал, а также сбросил свой пульт, чтобы он соответствовал путям, которые я дал ему в репо. Пришлось снова проверить мою ветку функций и исправить исходный URL-адрес с помощью 'git remote set-url'. Не направляйте инструмент сборки в свой рабочий каталог, иначе у вас будет плохое время. Для моего пульта был задан путь к файлу в моем рабочем каталоге, поэтому он, естественно, сообщал обо всем обновленном, когда я пытался отправить изменения с тем же источником и местом назначения.


1

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


1

Есть быстрый способ, который я нашел. Перейдите в папку .git, откройте HEADфайл и измените любую ветвь, на которой вы были, обратно на master. Например, ссылка:refs/heads/master


На самом деле установка его refs/heads/masterсломала мой репозиторий. Но установить его на то , что я думал, что ГОЛОВА коммит дал следующее сообщение: Warning: you are leaving 1 commit behind, not connected to any of your branches. Я смог перенести коммит в новую ветку и объединить его с мастером.
schmijos

1

Я была такая же проблема. В моем случае это было вызвано необходимостью имен для одного и того же пульта. Он создал стандартную «origin», но я давно использовал «github» в качестве пульта, так что это тоже было там. Как только я удалил пульт «origin», ошибка исчезла.


1

У меня было такое (коммиты в моем журнале git не были на GitHub, хотя git сказал, что все было в курсе), и я уверен, что проблема была в Github. Я не получил никаких сообщений об ошибках в git, но GitHub имел ошибки статуса, и мои коммиты были там через несколько часов.

https://status.github.com/messages

Сообщения о состоянии GitHub были:

  • Мы расследуем сообщения о недоступности сервиса.
  • Мы расследуем проблемы с доступом к GitHub.com.
  • Мы отказываемся от системы хранения данных, чтобы восстановить доступ к GitHub.com.

1

Еще одна очень простая, но нубийская ошибка: я просто забыл добавить -mмодификатор сообщения в свой коммит. Итак, я написал:

git commit 'My message'

Вместо правильного:

git commit -m 'My message'

ПРИМЕЧАНИЕ: он не выдает никаких ошибок! Но вы не сможете выдвинуть свои коммиты и всегда получите Everything up to dateвместо этого


0

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

сейчас приходит путь:

$ git push origin  use_local_cache_v1
Everything up-to-date
$ git status
On branch test
Your branch is ahead of 'origin/use_local_cache_v1' by 4 commits.
  (use "git push" to publish your local commits)
  ......
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:use_local_cache_v1

To push to the branch of the same name on the remote, use

    git push origin test
    
$ git push origin HEAD:use_local_cache_v1    
Total 0 (delta 0), reused 0 (delta 0)
remote:

команда, которая работает для меня

$git push origin HEAD:use_local_cache

(Надеюсь, вы, ребята, избавитесь от этой проблемы как можно скорее)


0

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

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

Я не знаю почему, но, возможно, это будет полезно для кого-то еще.


Это на самом деле не дает ответа на вопрос. Как только вы заработаете достаточно репутации , вы получите привилегии для ответов на ваши вопросы . Таким образом, будущие посетители вопроса увидят большее количество голосов по этому ответу, а ответчик также получит очки репутации. Посмотрите, почему голосование важно .
Waqar UlHaq

1
Хорошо, спасибо за разъяснения. Но почему это нельзя рассматривать (если хотите) как «обходной путь» к проблеме? Это не решение, но оно может быть полезно для других в любом случае.
Cisco

0

Другая возможность состоит в том, что у вас есть коммиты, которые не влияют на каталог, который вы нажимаете. Так что в моем случае у меня была такая структура

- .git
- README.md
- client/
 - package.json
 - example.js
- api/
 - requirements.txt
 - example.py

И я сделал коммит мастер модификации README.md, затем побежал git subtree push --prefix client heroku-client masterи получил сообщениеEverything up-to-date


0

Я работал с Jupyter-Notebook, когда столкнулся с этой обманчивой ошибкой.

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

Но у меня были файлы размером чуть больше 1 МБ, а самый большой - почти ~ 2 МБ . Я уменьшил размер файла с помощью Как я могу уменьшить размер файла моего ноутбука iPython?техника. Это помогло уменьшить размер моего файла, очистив выходные данные. Я был в состоянии выдвинуть код, теперь он принес мой размер файла в килобайтах.


0

Нам нужно добавить файлы и зафиксировать уже измененные / добавленные файлы, выполнить приведенные ниже команды

мерзавец добавить. или git add nameoffile #it добавит существующие файлы в проект

git commit -m "первый коммит" # коммит всех файлов в проекте

мастер происхождения git push

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