Заставить" 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
onorigin/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} с ремнем безопасности.