Git push ничего не сделает (все актуально)


105

Я пытаюсь обновить репозиторий Git на GitHub. Я внес кучу изменений, добавил их, зафиксировал, а затем попытался сделать git push. В ответе говорится, что все обновлено, но это явно не так.

git remote show origin

отвечает репозиторием, которого я ожидал.

Почему Git сообщает мне, что репозиторий обновлен, когда есть локальные коммиты, которые не видны в репозитории?

  [searchgraph]  git status
# On branch develop
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       Capfile
#       config/deploy.rb
nothing added to commit but untracked files present (use "git add" to track)

  [searchgraph]  git add .

  [searchgraph]  git status
# On branch develop
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   Capfile
#       new file:   config/deploy.rb
#

  [searchgraph]  git commit -m "Added Capistrano deployment"
[develop 12e8af7] Added Capistrano deployment
 2 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 Capfile
 create mode 100644 config/deploy.rb

  [searchgraph]  git push
Everything up-to-date

  [searchgraph]  git status
# On branch develop
nothing to commit (working directory clean)

Также убедитесь, что вы нажимаете правильную ветку.
Брайан

Ответы:


145

git pushне проталкивает все ваши локальные ветки: как он узнает, в какие удаленные ветки их отправить? Он отправляет только локальные ветки, которые были настроены для отправки в конкретную удаленную ветку.

В моей версии Git (1.6.5.3), когда я запускаю, git remote show originон фактически распечатывает, какие ветки настроены для push:

Local refs configured for 'git push':
  master pushes to master (up to date)
  quux   pushes to quux   (fast forwardable)

В. Но я мог бы продолжить, masterне беспокоясь обо всем этом!

Когда вы git cloneпо умолчанию настраиваете локальную masterветвь для отправки в удаленную masterветку (локально называемую origin/master), поэтому, если вы только фиксируете master, то простой git pushвсегда будет возвращать ваши изменения.

Однако, судя по опубликованному вами фрагменту вывода, вы находитесь в ветке с именем develop, которая, как я предполагаю, не была настроена для отправки ни на что. Таким образом, git pushбез аргументов мы не будем отправлять коммиты в эту ветку.

Когда он говорит «Все обновлено», это означает «все ветки, которые вы мне рассказывали, как отправлять, обновлены».

В. Итак, как я могу отправить свои коммиты?

Если вы хотите поместить свои изменения из developв origin/master, то вам, вероятно, следует объединить их в свой локальный, а masterзатем нажать на это:

git checkout master
git merge develop
git push             # will push 'master'

Если вы хотите создать developветвь на пульте дистанционного управления, отдельно от master, а затем предоставить аргументы для git push:

git push origin develop

Это: создаст новую ветку на удаленном компьютере develop; и обновите эту ветку в своем местном developфилиале; и набор , developчтобы подтолкнуть к origin/developтак , что в будущем, git pushбез аргументов будет толкать developавтоматически.

Если вы хотите переместить локальный компьютер developв удаленную ветку, называемую чем-то другим develop , то вы можете сказать:

git push origin develop:something-else

Однако эта форма не будет настроена developна постоянную отправку origin/something-elseв будущем; это одноразовая операция.


Большое спасибо, ваш git push origin develop: что-то еще дало ответ на вопрос, который я не мог получить некоторое время.
Antroid

1
В моем случае git push origin xвсе еще не настраивалась ветка x для отправки в будущем. Это произошло из-за определенного pushspec в .gitconfig [remote "origin"]разделе, который вызывал поведение git.
Raman

Используя только у git push originменя была эта проблема, используя ваш пример git push origin developи разместив его в моей основной ветке, git push origin masterпроблема была решена, спасибо
FantomX1

28

Это случилось со мной, когда мое приложение SourceTree вылетело во время постановки. А в командной строке казалось, что предыдущее git addбыло повреждено. В этом случае попробуйте:

git init
git add -A
git commit -m 'Fix bad repo'
git push

По последней команде вам может потребоваться установить ветку.

git push --all origin master

Имейте в виду, что этого достаточно, если вы не делали никаких ветвлений или чего-либо подобного. В этом случае убедитесь, что вы нажимаете правильную ветку, например git push origin develop.


15

Пытаться:

git push --all origin

это подталкивает коммиты к разделению веток в репо, а не из одной ветки в мастер.
Sreedevi J

13

Пожалуйста, попробуйте перейти к последней фиксации и сделайте это git push origin HEAD:master.


1
Это действительно сработало. Вы хотите объяснить, почему это сработало?
René Nyffenegger

Текст из документов:Push the current branch to the remote ref matching master in the origin repository. This form is convenient to push the current branch without thinking about its local name.
uruapanmexicansong 01


Я сравнил, как настроено мое репо, и все ветки выглядели одинаково. Тем не менее, в одной ветке я не мог просто использовать git push: / Это работает для меня , а также: git push origin HEAD:my_branch_name.
iaforek

6

В моем случае ни одно другое решение не помогло. Мне пришлось сделать резервную копию новых измененных файлов (обозначенных значком git status) и запустить файл git reset --hard. Это позволило мне перенастроить удаленный сервер. Добавление новых измененных файлов и запуск

git add .
git commit -am "my comment"
git push

Сделал свое дело. Надеюсь, это кому-то поможет, как «последний шанс».


4

Прямо сейчас он выглядит так, как будто вы находитесь в ветке разработки. У вас есть ветка разработки на вашем origin? Если нет, попробуйте git push origin develop. git pushбудет работать, как только он узнает о ветке разработки в вашем источнике.

В качестве дальнейшего чтения я бы посмотрел на страницы руководства git-push , в частности, на раздел примеров.


4

Чтобы быть конкретным, если вы хотите объединить что-то для освоения, вы можете выполнить следующие шаги.

git add --all // If you want to stage all changes other options also available
git commit -m "Your commit message"
git push // By default when it clone is sets your origin to master or you would have set sometime with git push -u origin master.

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

git push origin develop // It will create a remote branch with name "develop".

Если вы хотите создать ветку, отличную от имени вашей локальной ветки, вы можете сделать это с помощью следующей команды.

git push origin develop:some-other-name

2

Спасибо Сэму Стоуксу. Судя по его ответу, вы можете решить проблему другим способом (я использовал этот способ). После обновления каталога разработки вы должны повторно инициализировать его.

git init

Затем вы можете зафиксировать и отправить обновления в мастер


1
Спасибо! В моем случае введите: git initи откройте новую вкладку команд, введите:git push origin branch_name
s7ven

2

Это случилось со мной, когда я ^Cнаходился посреди git pushGitHub. Однако GitHub не показал, что изменения были внесены.

Чтобы исправить это, я внес изменения в свое рабочее дерево, зафиксировал его и снова нажал. Он работал отлично.


2

Это случилось со мной. Я просто повторно зафиксировал изменения, а затем нажал.


2

Я пробовал много методов, включая определенные здесь. Что у меня есть,

  • Убедитесь, что имя репозитория правильное. Лучше всего скопировать ссылку с сайта репозитория и вставить в git bash.

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

    git commit -m "Your commit here"
    
  • Если оба шага не работают, попробуйте

    git push -u -f origin master


1

Вместо этого вы можете попробовать следующее. Вам не нужно идти master; вы можете напрямую принудительно отправить изменения из самой ветки.

Как объяснялось выше, когда вы выполняете перебазирование, вы меняете историю своей ветки. В результате, если вы попытаетесь выполнить обычную git pushоперацию после перебазирования, Git отклонит его, поскольку нет прямого пути от фиксации на сервере к фиксации в вашей ветке. Вместо этого вам нужно использовать флаг -fили, --forceчтобы сообщить Git, что да, вы действительно знаете, что делаете. При выполнении принудительных нажатий настоятельно рекомендуется установить для push.defaultпараметра конфигурации значение simple, которое является значением по умолчанию в Git 2.0. Чтобы убедиться, что ваша конфигурация верна, запустите:

$ git config --global push.default simple

Как только все будет правильно, вы можете просто запустить:

$ git push -f

И проверьте свой запрос на перенос. Его надо обновить!

Для получения более подробной информации перейдите к нижней части раздела « Как изменить базу запроса на слияние» .


0

Это случилось со мной, когда я попытался нажать из новой ветки и использовал git push origin masterвместо этого. Вам следует либо:

  • Использование: git push origin your_new_branchесли вы хотите, чтобы эта ветвь тоже происходила в удаленном репо.
  • В противном случае проверьте, что ваша основная ветка объединяет вещи, а затем отправляет от мастера к репозиторию git с помощью git merge origin master.

Резюме: суть в том, что вы должны проверить, где вы предлагаете второй параметр для git merge. Поэтому, если вы находитесь в главном хранилище, используйте master в качестве второго параметра, если вы находитесь в new_branch, используйте его в качестве второго параметра, если вы хотите сохранить эту ветку в удаленном репо, иначе вместо этого выберите второй вариант выше.



-6
git push origin master

Не знаю, почему так много плохих голосов, это то, что сработало для меня git push origin master, git push origin только притворяется, что работает, но не работает, кто знает, поможет ли настройка восходящего потока или что-то еще
FantomX1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.