Как заставить обновления при выполнении git pull? - PullRequest
45 голосов
/ 29 декабря 2010

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

т.е. это может сдуть мои локальные изменения.

Ответы [ 3 ]

76 голосов
/ 29 декабря 2010

Это должно сработать:

git reset --hard HEAD
git pull
30 голосов
/ 16 января 2013
git fetch
git checkout origin/name_of_branch  # correct state but in 'head without a name'
git checkout -B name_of_branch      # overwrite current tree onto name_of_branch

Это проверяет ветку удаленного слежения в голове без имени, затем вы можете посмотреть и убедиться, что вы счастливы. Всякий раз, когда вы хотите (даже после изменений или фиксации) вторая проверка git помечает ваше текущее дерево как name_of_branch, даже если для этого нужно удалить старое name_of_branch.


Редактировать: «Какой сумасшедший синтаксис командной строки»

Синтаксис команд git кажется не интуитивным. На самом деле, модель данных Git не интуитивна. Это не плохой дизайн, но потому что он работает с файлами, ветвями и фиксациями способами, которые намного более гибки и мощны, чем другие системы контроля версий. Как только вы поймете, как все это работает в Git, командная строка обретет большой смысл, и вы сможете точно угадать, как делать сложные вещи.

  • git fetch извлекает все обновления, которые произошли на сервере origin с последнего раза. Git отделяет выборку с сервера от обновления, слияния и т. Д. Любых ваших веток . Все ветви с именем origin/XXX являются вашими самыми последними версиями того, что находится на сервере. Это не удаленные ветви , а удаленные ветви отслеживания , локальные ветви, которые отслеживают удаленные ветви. Когда вы делаете git fetch, вы обновляете их, не касаясь ни одной из ваших собственных веток. Когда вы делаете git merge, git rebase и т. Д., Вы используете выбранную версию, без , получая более свежую копию с сервера. Это означает, что вы можете контролировать, когда выполняются сетевые запросы (если вы не всегда подключены к серверу), и вы можете «получить» снимок сервера, а затем объединяться на досуге. В случае сомнений сначала наберите git fetch.
  • git checkout origin/name_of_branch git checkout делает две вещи. Он обновляет ваши файлы в этой ветке и устанавливает HEAD в эту ветку. Вещи файлов - это то, что вы ожидаете. Вещи HEAD означают, что когда вы делаете коммиты, они добавляются в конец ветви, на которую указывает HEAD. IOW, checkout выполняет и вывод - пишет правильные версии файлов и готовится к input - готовится сохранить коммиты, которые вы собираетесь сделать, в нужном месте. Если вы извлечете ветку с именем foo, ваше дерево изменится на состояние, сохраненное в foo, и , следующие ваши коммиты будут добавлены в foo. В случае origin\xyz вы не можете записать свои изменения в ветку origin - они отслеживают то, что находится на сервере origin и не могут быть зафиксированы напрямую. Таким образом, извлечение обновляет файлы и устанавливает HEAD в ничто - безымянная ветвь. Это останавливает вас от случайной фиксации вашего вновь извлеченного материала обратно в предыдущую ветку, которую вы использовали, и на самом деле вы будете сильно обескуражены коммитом git до тех пор, пока у вас не появится ветка назначения.
  • git checkout -B name_of_branch Как обычно, когда git делает две разные вещи с помощью одной команды, обе они могут быть настроены отдельно . Таким образом, вторая часть того, что делает checkout, устанавливая HEAD для ветви, которую вы хотите зафиксировать, может относиться к новой ветви, а не к ветви, которую вы проверяете, если вы используете опцию -B. Так что git checkout -B new_stuff old_stuff установит все ваши файлы в состояние в old_stuff, но подготовит вас к записи ваших коммитов в новую ветку new_stuff. Это обычная задача, которая избавляет вас от проверки ветви и ее разветвления в два этапа. Теперь почти все аргументы команд git могут быть опущены, и git сделает самую очевидную вещь . В этом случае создается новая ветка на основе той, на которой вы находитесь , а не та, которую вы хотите оформить. Итак, git берет неназванную ветвь, в которой вы находитесь, и создает новую ветвь с именем name_of_branch, которую вы можете начать фиксировать. Обратите внимание, что буква «В» в верхнем регистре означает «сила». Если вы используете "-b", git откажется перезаписывать уже существующую ветку. С "-B" он будет выполняться без предупреждения или подтверждения.
10 голосов
/ 31 июля 2017

Движение, колено , решение: git reset --hard origin/master

Это всемогущее решение как для экспертов, так и для начинающих, которое быстро выполняет свою работу. Хотя и без предупреждения удаляет все незафиксированные изменения.

Команда безопаснее немного сложнее набрать: git checkout -B master origin/master

Введите псевдонимы:

git config --global alias.become '!git checkout -B "$(git symbolic-ref --short HEAD)"'

Впредь можно набирать: git become origin/master

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...