Заставить" git push " перезаписывать удаленные файлы

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

Как я могу сделать это с Git?

4 ответов


вы должны иметь возможность принудительно локальную ревизию к удаленному РЕПО с помощью

git push -f <remote> <branch>

(например,git push -f origin master). Оставляю <remote> и <branch> заставит нажать все локальные ветви, которые установили --set-upstream.

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

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

обновление 2: из-за увеличения числа зрителей я хотел бы добавить дополнительную информацию о том, что делать, когда ваш upstream тут испытайте толчок силы.

скажем, я клонировал ваше РЕПО и добавил несколько таких коммитов:

            D----E  topic
           /
A----B----C         development

но потом development филиала ударил rebase, что заставит меня получить ошибку, как это, когда я запускаю git pull:

Unpacking objects: 100% (3/3), done.
From <repo-location>
 * branch            development     -> FETCH_HEAD
Auto-merging <files>
CONFLICT (content): Merge conflict in <locations>
Automatic merge failed; fix conflicts and then commit the result.

здесь я мог бы исправить конфликты и commit, но это оставит меня с действительно уродливой историей фиксации:

       C----D----E----F    topic
      /              /
A----B--------------C'  development

это может выглядеть заманчиво, чтобы использовать git pull --force но будьте осторожны, потому что это оставить вас с многожильных коммитов:

            D----E   topic

A----B----C'         development

поэтому, вероятно, лучший вариант-сделать git pull --rebase. Это потребует от меня разрешения любых конфликтов, как раньше, но для каждого шага вместо фиксации я буду использовать git rebase --continue. В конце концов история фиксации будет выглядеть намного лучше:

            D'---E'  topic
           /
A----B----C'         development

обновление 3: вы также можете использовать --force-with-lease вариант как" более безопасная " сила толкай,как упоминалось Cupcake в его ответ:

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

git push <remote> <branch> --force-with-lease

вы можете узнать больше о том, как использовать --force-with-lease by чтение любого из следующего:


вы хотите заставить толкать

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

если вы хотите получить более подробное объяснение каждой из следующих команд, см. раздел Мои сведения ниже. У вас в основном есть 4 разных варианта для принудительного нажатия с Git:

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

если вы хотите более подробное объяснение каждой команды, см. раздел мои длинные ответы под.

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

сила выталкивания детали

указание пульта дистанционного управления и ветви

вы можете полностью указать конкретные ветви и пульт дистанционного управления. The -f флаг-это короткая версия из --force

git push <remote> <branch> --force
git push <remote> <branch> -f

опуская филиала

когда ветвь для нажатия ветви опущена, Git выяснит это на основе ваших настроек конфигурации. В версиях Git после 2.0 у нового РЕПО будут настройки по умолчанию, чтобы нажать текущую ветку:

git push <remote> --force

в то время как до 2.0 новые репозитории будут иметь настройки по умолчанию для нажатия нескольких локальных ветвей. Параметры в вопросе remote.<remote>.push и push.default параметры (см. ниже.)

опуская пульт и филиала

когда как удаленный, так и ветвь опущены, поведение just git push --force определяется push.default в Git файл config параметры:

git push --force
  • начиная с Git 2.0, настройка по умолчанию,simple, в основном просто подтолкнет вашу текущую ветвь к ее восходящей удаленной встречной части. Пульт определяется ветвью branch.<remote>.remote настройка и значения по умолчанию для исходного РЕПО иначе.

  • перед git версии 2.0, настройка по умолчанию,matching, в основном просто толкает все ваши локальные ветви в ветви с тем же именем на пульте (по умолчанию origin).

вы можете подробнее push.default настройки путем считывания git help config или онлайн-версия страницы руководства git-config(1).

сила толкая более безопасно с --force-with-lease

усилие нажимая с a "аренда" позволяет принудительному толчку терпеть неудачу, если на пульте есть новые коммиты, которые вы не ожидали (технически, если вы еще не получили их в свою ветвь удаленного отслеживания), что полезно, если вы не хотите случайно перезаписать чьи-то коммиты, о которых вы даже не знали, и вы просто хотите перезаписать свои собственные:

git push <remote> <branch> --force-with-lease

вы можете узнать больше о том, как использовать --force-with-lease прочитав любой из следующий:


другой вариант (чтобы избежать любого принудительного толчка, который может быть проблематичным для других участников):

  • поместите свои новые коммиты в выделенную ветку
  • сбросить master on origin/master
  • объедините выделенную ветку в master, всегда сохраняя коммиты из выделенной ветви (что означает создание новых ревизий поверх master который будет отражать вашу выделенную ветку).
    См."команда git для создания одной ветви, как другой " для стратегий моделирования git merge --strategy=theirs.

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


git push-f немного разрушителен, потому что он сбрасывает любые удаленные изменения, которые были сделаны кем-либо еще в команде. Более безопасным вариантом является {git push --force-with-lease}.

Что {--force-with-lease} делает, это отказывается обновлять ветку, если это не то состояние, которое мы ожидаем; т. е. никто не обновил ветку вверх по течению. На практике это работает, проверяя, что восходящий ref-это то, что мы ожидаем, потому что refs являются хэшами и неявно кодируют цепочку родителей в их значение. Вы можете точно сказать {--force-with-lease}, что нужно проверить, но по умолчанию будет проверять текущую удаленную ссылку. На практике это означает, что когда Алиса обновляет свою ветвь и подталкивает ее к удаленному репозиторию, будет обновлена указывающая глава ветви. Теперь, если Боб не вытащит пульт, его локальная ссылка на пульт будет устаревшей. Когда он идет нажать, используя {--force-with-lease}, git проверит локальную ссылку на новый пульт и откажется силу толчка. {--force-with-lease} эффективно позволяет только принудительно толкать, если никто другой не подтолкнул изменения к удаленному в промежутке. Это {--force} с ремнем безопасности.