2

Не получается произвести Push на удалённый репозиторий Bitbusket. Ошибка:

Git remote repository contains commits unmerged into the local branch

В большинстве предложенных решений говорится, что надо выполнить Pull, а потом уже Push. Но, как я и ожидал, Pull привёл к наложению старого состояния проекта, который хранится на удалённом репозитории, на новый (то есть добавился ненужный старый код, а где-то и вовсе код продублировался). В результате у меня чуть не полетел весь проект (еле-еле откатил, чуть не потеряв 6 часов работы ...).

Мне больше не нужно старое состояние проекта на удалённом репозитории, потому я не хочу его merge с новым, мне нужно просто обновить удалённый репозиторий, причём ветвь master. Как это можно сделать?

Боков Глеб
  • 1,116
  • 2
  • 25
  • 70

2 Answers2

7

Только если репозиторий лично ваш и никто другой им не пользуется, можно осущестить «переписывание истории» — это когда вы как бы «удаляете коммиты» из ветки.

Теория

Так выглядит обычная ситуация перед пушем. У вас в master есть новые коммиты, на сервере в origin/master их ещё нет:

A – B – C    origin/master
         \
          D  master

В результате git push origin master будет:

A – B – C — D   master, origin/master

Вот что происходит у вас:

A – B – C    origin/master
     \
       D     master

Гит не позволяет просто так взять и запушить master в origin/master, потому что коммит C потеряется. Это и называется «переписыванием истории». Его можно осуществить принудительно, с ключом --force или -f. Это опасная команда, нельзя ей пользоваться в общем репозитории, читайте о подробностях и последствиях, включая «бьют по лицу».

После git push --force origin master:

A – B – D    master, origin/master
     \
       C     (потерян)

Практика:

  1. Возможно ветка master защищена на удаленном репозитории — нельзя переписывать её историю. В настройках удаленного репозитория (то есть на bitbucket) снимите защиту ветки или выдайте себе права на переписывание. (Bitbucket – branch permissions)
  2. Выполните git push -f origin master.
  3. Верните защиту ветки.
Nick Volynkin
  • 34,094
  • 1
    Благодарю Вас за подробное объяснение! От души написанный ответ, что сказать... – Боков Глеб Jun 15 '17 at 09:22
  • @GurebuBokofu пожалуйста. Ещё вот это вам может пригодиться: https://ru.stackoverflow.com/q/431520/181472 – Nick Volynkin Jun 15 '17 at 09:26
  • Кто сказал, что git push -f нельзя использовать в общем репозитории? Правильнее написать не рекомендуется И дописать вы должны понимать, что вы делаете. (Да, очевидно, что под общим репозиторием могут пониматься несколько разные вещи) – 0andriy Jun 15 '17 at 19:08
  • 1
    @0andriy все время забываю упомянуть, что речь только о стабильных ветках, а фичеветки — в зависимости от командных договоренностей. Завтра подумаю, как переформулировать. – Nick Volynkin Jun 15 '17 at 19:14
  • @0andriy тут ведь какое дело: если писать "не рекомендуется и вы должны понимать", то человек может подумать, что понимает, хотя на самом деле не понимает. Поэтому перестраховываюсь. Тех, кто действительно всё понимает, такая инструкция не остановит. – Nick Volynkin Jun 15 '17 at 19:15
  • @NickVolynkin, и это тоже не совсем корректно. Очень много здесь зависит как от проекта, так и от процесса. У нас в конторе есть репозиторий, которым пользуются, наверное, 100+ человек, на регулярной основе там делается rebase. Соответственно force push. Потому что основной репозиторий, который можно назвать целевым, не у нас, но он (целевой репозиторий) действительно работает по принципу: "замержили регрессию, тогда мержим реверт или фикс". (Это комментарий на ваш предыдущий) – 0andriy Jun 15 '17 at 19:17
  • @0andriy форспуши наверняка в фичеветках делаются перед мержем в мастер, так? – Nick Volynkin Jun 15 '17 at 19:23
  • Да, но и в мастер тоже. – 0andriy Jun 15 '17 at 19:25
0

Удали удаленную ветку командой git push origin :master (название удаленки напиши свое) и залей туда свои данные командой git push -u origin master

Slavka_
  • 73
  • Благодарю Вас за овет! К сожалению, не получилось выполнить git push origin https://bitbucket.org/ExampleName/example.git refs/heads/master:refs/heads/master. Пишет fatal: remote part of refspec is not a valid name in https://bitbucket.org/ExampleName/example.git. – Боков Глеб Jun 15 '17 at 08:48
  • @Nick Volynkin, если Вы про мой удалённый репозиторий, то там нет ничего ценного. – Боков Глеб Jun 15 '17 at 09:02
  • Вы ставили ключ -u ? – Slavka_ Jun 15 '17 at 09:13