Недавно я разработал проект и применил несколько исправлений. Затем я создал запрос на извлечение, который затем был принят.
Несколько дней спустя другой участник внес другое изменение. Так что моя вилка не содержит этого изменения.
Как я могу получить это изменение в моей вилке? Нужно ли мне удалять и заново создавать мой форк, когда у меня появятся дальнейшие изменения? Или есть кнопка обновления?
git
github
pull-request
git-fork
Леа Хейс
источник
источник
Ответы:
В локальном клоне вашего разветвленного репозитория вы можете добавить исходный репозиторий GitHub в качестве «удаленного». («Remotes» подобны псевдонимам для URL репозиториев -
origin
например, один.) Затем вы можете получить все ветви из этого репозитория upstream и перебазировать свою работу, чтобы продолжить работу над версией upstream. С точки зрения команд, которые могут выглядеть так:Если вы не хотите переписывать историю вашей основной ветки (например, потому что другие люди, возможно, клонировали ее), тогда вы должны заменить последнюю команду на
git merge upstream/master
. Тем не менее, для того, чтобы сделать дальнейшие пул-запросы, которые были бы максимально чистыми, вероятно, лучше сделать ребаз.Если вы переместили свою ветку на вашу ветку,
upstream/master
вам может потребоваться принудительное добавление, чтобы перенести ее в свой собственный разветвленный репозиторий на GitHub. Вы бы сделали это с:Вам нужно использовать только
-f
в первый раз после того, как вы перебазировали.источник
-f
которой портятся все, кто мог клонировать вашу версию.git merge --no-ff upstream/master
Таким образом, ваши коммиты больше не находятся на вершине.Начиная с мая 2014 года, можно обновлять форк напрямую с GitHub. Это все еще работает с сентября 2017 года, НО это приведет к грязной истории коммитов.
Update from original
).Теперь у вас есть три варианта, но каждый из них приведет к менее чистой истории фиксации.
This branch is X commits ahead, Y commits behind <original fork>
.Так что да, вы можете поддерживать репо в обновленном состоянии с помощью веб-интерфейса GitHub, но это приведет к потере истории ваших коммитов. Вместо этого придерживайтесь командной строки - это легко.
источник
Вот официальный документ GitHub по синхронизации форка :
источник
git push origin master
--follow-tags
: stackoverflow.com/a/26438076/667847git merge upstream/master
, а затем проверить, чтобы разработать ветку и сделатьgit merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
когда пытался выбрать из учетной записи Github Facebook вверх по течению.Множество ответов в конечном итоге перемещают ваш форк на один коммит вперед по сравнению с родительским репозиторием. Этот ответ суммирует шаги, найденные здесь, которые переместят ваш форк в тот же коммит, что и родительский .
Измените каталог на ваш локальный репозиторий.
git checkout master
Добавьте родителя в качестве удаленного хранилища,
git remote add upstream <repo-location>
git fetch upstream
вопрос
git rebase upstream/master
git status
вопрос
git push origin master
Для получения дополнительной информации об этих командах обратитесь к шагу 3 .
источник
Если, как и я, вы никогда не делаете что-либо напрямую, чтобы овладеть , что вам действительно нужно, вы можете сделать следующее.
Из локального клона вашей вилки создайте свой удаленный пульт. Вам нужно сделать это только один раз:
Тогда всякий раз, когда вы хотите догнать ветку основной ветки репозитория, вам необходимо:
Предполагая, что вы никогда ничего не совершали на хозяина, вам уже покончено. Теперь вы можете подтолкнуть вашего локального мастера к исходной удаленной вилке GitHub. Вы также можете переназначить свою ветку разработки на своем современном локальном мастере.
После первоначальной настройки восходящего потока и проверки мастера все, что вам нужно сделать, это запустить следующую команду, чтобы синхронизировать ваш мастер с вышестоящим: git pull upstream master .
источник
Предисловие: ваш форк - это «источник», а репозиторий, из которого вы разветвлены, - «восходящий».
Давайте предположим, что вы уже клонировали свой форк на свой компьютер с помощью команды, подобной этой:
Если это дано, вам нужно продолжить в следующем порядке:
Добавьте «upstream» в ваш клонированный репозиторий («origin»):
Получить коммиты (и ветки) из "вверх по течению":
Переключитесь на ветку «master» вашего форка («origin»):
Храните изменения вашей "главной" ветки:
Объедините изменения из "master" ветви "upstream" в вашу "master" ветку вашего "origin":
Разрешите конфликты слияния, если они есть, и зафиксируйте слияние
Нажмите изменения в вашей вилке
Верните свои скрытые изменения (если есть)
Вы сделали! Поздравляем!
GitHub также предоставляет инструкции по этой теме: Синхронизация форка
источник
git remote add upstream git@github.com:original_author/project_name.git
просто псевдоним дляgit remote add upstream https://github.com/original_author/project_name.git
?git stash
иgit stash pop
часть очень полезнаС ноября 2013 года в GitHub был открыт неофициальный запрос на добавление очень простого и интуитивно понятного метода синхронизации локального разветвления с восходящим:
https://github.com/isaacs/github/issues/121
Примечание. Поскольку запрос функции является неофициальным, рекомендуется также связаться
support@github.com
с вами, чтобы добавить поддержку для реализации подобной функции. Вышеуказанный неофициальный запрос может быть использован как свидетельство заинтересованности в этом.источник
На момент получения этого ответа GitHub не имеет ( или я больше не скажу? ) Этой функции в веб-интерфейсе. Вы можете, однако, попросить
support@github.com
добавить свой голос за это.Тем временем, пользователь GitHub bardiharborow создал инструмент для этого: https://upriver.github.io/
Источник находится здесь: https://github.com/upriver/upriver.github.io
источник
Если вы используете GitHub для Windows или Mac, то теперь у них есть возможность одним щелчком мыши обновить вилки:
источник
На самом деле, можно создать ветку в вашем форке из любого коммита восходящего потока в браузере:
https://github.com/<repo>/commits/<hash>
, где repo - ваш форк, а hash - полный хеш коммитов, который вы можете найти в вышестоящем веб-интерфейсе. Например, я могу открыть https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 , который указывает наlinux
master
время написания.Затем вы можете извлечь эту ветку в свой локальный клон, и вам не нужно будет отправлять все эти данные обратно в GitHub, когда вы вносите изменения поверх этого коммита. Или используйте веб-интерфейс, чтобы что-то изменить в этой ветке.
Как это работает (это предположение, я не знаю, как именно GitHub это делает): вилки совместно используют хранилище объектов и используют пространства имен для разделения ссылок пользователей. Таким образом, вы можете получить доступ ко всем коммитам через ваш форк, даже если они не существовали на момент разветвления.
источник
Выполните следующие шаги. Я попробовал их, и это помогло мне.
Оформить заказ в вашем филиале
Потяните ветку репозитория исходного кода для получения последней версии кода.
источник
git push HttpsForYourForkOfTheRepo BRANCH_NAME
Я обновляю свои разветвленные репо этой строкой:
Используйте это, если вы не хотите добавлять другую удаленную конечную точку в ваш проект, как другие решения, опубликованные здесь.
источник
pull
.В качестве дополнения к этому ответу я искал способ обновить все удаленные ветки моего клонированного репо ( источника ) из вышестоящих веток за один раз. Вот как я это сделал.
Это предполагает , что вы уже настроили на входе пульта дистанционного управления , указывая на репозиторий (где происхождение было раздвоенным от) и синхронизировали его с
git fetch upstream
.Затем запустите:
Первая часть этой команды перечисляет все заголовки в удаленном репо восходящего направления и удаляет SHA-1, за которым
refs/heads/
следует префикс имени ветви.Затем для каждой из этих ветвей она отправляет локальную копию восходящей удаленной ветви отслеживания (
refs/remotes/upstream/<branch>
на локальной стороне) непосредственно в удаленную ветку на источнике (refs/heads/<branch>
на удаленной стороне).Любая из этих команд синхронизации веток может завершиться с ошибкой по одной из двух причин: либо ветка upstream была переписана, либо вы передали коммиты в этой ветке на ваш форк. В первом случае, когда вы ничего не добавили в ветку на своей вилке, можно принудительно нажать (добавьте ключ -f ; т.е.
git push -f
в приведенной выше команде). В другом случае это нормально, так как ваша ветвь ветвления разошлась, и вы не можете ожидать, что команда sync будет работать до тех пор, пока ваши коммиты не будут объединены с апстримом .источник
Приложение "Pull" - это решение для автоматической настройки и забывания. Он будет синхронизировать ветку по умолчанию вашего форка с репозиторием upstream.
Зайдите на URL, нажмите зеленую кнопку «Установить» и выберите репозитории, в которые вы хотите включить автоматическую синхронизацию.
Ветвь обновляется один раз в час непосредственно на GitHub, на вашем локальном компьютере вам нужно извлечь основную ветку, чтобы убедиться, что ваша локальная копия синхронизирована.
источник
mergemethod
. Подробнее об этом здесьAndroid Studio теперь научилась работать с вилочными репозиториями GitHub (вам даже не нужно добавлять «восходящий» удаленный репозиторий по команде консоли).
Откройте меню VCS → Git
И обратите внимание на два последних пункта всплывающего меню:
Перебазировать мою вилку GitHub
Создать запрос на извлечение
Попробовать их. Я использую первый для синхронизации моего локального хранилища. В любом случае ветки из родительского удаленного репозитория («upstream») будут доступны в Android Studio после того, как вы нажмете «Rebase my GitHub fork», и вы сможете легко с ними работать.
(Я использую Android Studio 3.0 с подключаемыми модулями Git и GitHub.)
источник
Когда вы клонировали свой разветвленный репозиторий, перейдите в путь к каталогу, где находится ваш клон, и в несколько строк в вашем Git Bash Terminal.
И вот вам хорошо идти. Все обновленные изменения в основном репозитории будут помещены в ваш репозиторий fork.
Команда «fetch» необходима для того, чтобы быть в курсе последних событий проекта: только при выполнении «git fetch» вы будете информированы об изменениях, которые ваши коллеги отправили на удаленный сервер.
Вы все еще можете посетить здесь для дальнейших запросов
источник
Если вы установите свой апстрим. Посоветуйтесь
git remote -v
, тогда этого будет достаточно.источник
Это зависит от размера вашего хранилища и от того, как вы его разветвили.
Если это довольно большой репозиторий, возможно, вы захотите управлять им особым образом (например, история удаления). По сути, вы можете получить различия между текущей и исходной версиями, зафиксировать их, а затем снова выбрать мастер.
Попробуйте прочитать это . В нем описывается, как обращаться с большими репозиториями Git и как добавлять в них последние изменения.
источник
Я хотел бы добавить к @ krlmlr - х ответа .
Первоначально раздвоенное хранилище имеет один филиал по имени:
master
. Если вы работаете над новой функцией или исправлением, вы обычно создаете новую веткуfeature
и вносите изменения.Если вы хотите, чтобы разветвленный репозиторий синхронизировался с родительским репозиторием, вы можете настроить файл конфигурации (
pull.yml
) для приложения Pull ( в ветви функций ), например:Это сохраняет
master
ветвь разветвленного репо актуальной с родительским репо. Он сохраняетfeature
ветвь разветвленного репо черезmaster
ветку разветвленного репо, объединяя ее. Это предполагает, чтоfeature
ветвь является веткой по умолчанию, которая содержит файл конфигурации.Здесь два
mergemethods
вступают в игру, один изhardreset
которых помогает принудительно синхронизировать изменения вmaster
ветви разветвленного репо с родительским репо, а другой - методmerge
. Этот метод используется для объединения изменений, выполненных вами вfeature
ветви, и изменений, выполненных из-за принудительной синхронизации вmaster
ветви. В случае конфликта слияния приложение pull позволит вам выбрать следующий порядок действий при запросе на слияние.Вы можете прочитать об основных и расширенных конфигурациях и различных
mergemethods
здесь .Я в настоящее время использую эту конфигурацию в моем раздвоенном репо здесь , чтобы убедиться , что усиление запрошенными здесь остается обновляется.
источник
Есть две основные вещи о том, чтобы держать разветвленный репозиторий всегда обновлять навсегда.
Поэтому, когда ваш запрос на извлечение будет принят, вы можете безопасно удалить ветку, так как ваш введенный код будет затем находиться в вашем мастере вашего разветвленного репозитория, когда вы обновите его с помощью апстрима. Таким образом, ваш мастер всегда будет в чистом состоянии, чтобы создать новую ветку, чтобы сделать еще одно изменение.
Это можно сделать с помощью cron . Вот пример кода, если вы делаете это в Linux.
Поместите этот код
crontab file
для выполнения задания в почасовом режиме.затем создайте
cron.sh
файл сценария и взаимодействие git с ssh-agent и / или ожидайте, как показано нижеПроверьте ваш разветвленный репозиторий. Время от времени он всегда будет показывать это уведомление:
источник
Используйте эти команды (в случае удачи)
источник