Отправьте запрос на перенос на GitHub только для последней фиксации
Я разветкил проект на github и успешно вношу изменения в свой локальный мастер и нажав на начало координат на github. Я хочу отправить запрос на перенос, но хочу включить только последнее коммит. Пользовательский интерфейс запроса на вывод на github.com показывает последние 9 коммитов, и я не знаю, как отфильтровать это.
Я пытался понять, должен ли я создать новую локальную ветвь, проверить это и как-то reset или переупаковать вверх по течению? Затем примените мой последний коммит от моего хозяина по id к новому локальному ветки и используйте его для запроса на растяжение?
Я пытаюсь правильно понять эти понятия и выяснять правильные командные строки, чтобы делать то, что мне нужно.
Ответы
Ответ 1
Вам нужно создать новую ветку и выбрать те коммиты, которые вы хотите добавить в нее.
Примечание: они могут понадобиться перед командами checkout/cherry-pick
git remote add upstream <git repository>
git remote update
git checkout -b <new-branch-name> upstream/master
git cherry-pick <SHA hash of commit>
git push origin <new-branch-name>
После этого вы увидите <new-branch-name>
на github, переключитесь на нее и сможете отправить запрос на получение с нужными вам изменениями.
Ответ 2
Создайте новую ветку, начиная с последней фиксации, которая также находится в исходном репозитории:
git branch new-branch origin/master
git checkout new-branch
Затем используйте git cherry-pick
, чтобы получить одиночную фиксацию, для которой требуется запрос на pull. Если ветвь с этой фиксацией называется feature
, и фиксация, которую вы хотите, является последней фиксацией в этой ветке, это будет
git cherry-pick feature
Предполагая, что этот патч применяется без конфликтов, у вас есть ветка, для которой вы можете выполнить запрос на перенос.
На втором этапе вам нужно решить, что делать с веткой feature
. Если вы еще не опубликовали свои изменения в этой ветке, лучшая процедура, вероятно, переустанавливает эту ветвь на новую ветвь (и удаляет последнюю фиксацию, если это не делается автоматически с помощью git rebase
).
Ответ 3
Я оказался в ситуации, когда я разветкил вилку и хотел отправить запрос на возврат обратно в исходный проект.
У меня было:
- orignal_project
- forked_project (созданный из оригинального проекта на SHA: 9685770)
- my_fork (создается из разветвленного проекта на SHA: 207e29b)
- фиксация в моей вилке (SHA: b67627b), которую я хотел бы вернуть обратно к оригинальному проекту
Для этого I:
- создал новую ветку из SHA, где исходный проект был разветвлен
- вытащил все из исходного проекта
- Вишня выбрала коммит, который я хотел отправить в качестве запроса на растяжение.
- нажал все на github
Команды git были примерно такими:
Затем я выбрал my-feature-request в качестве ветки для моего запроса на перенос в исходный проект.
Ответ 4
Это почти сработало для меня:
git checkout -b upstream upstream/master
git cherry-pick <SHA hash of commit>
git push origin upstream
Единственное различие заключалось в следующем:
git push origin upstream:upstream
Мне нужно было изменить эту последнюю строку, чтобы git push сделал бы ветку вверх по моей репликации GitHub, чтобы я мог сделать PR из нее.
Ответ 5
Я уже сделал коммит, который я хотел бы выделить в качестве запроса на извлечение обратно в текущую ветку.
Итак, я проверил новую ветку
git checkout -b isolated-pull
И здесь, где мое решение отличается от @Kevin Hakanson, так как мне нужно reset эту ветвь на место в истории, которую я хочу отличать от
git reset --hard [sha-to-diff-by]
И вишня - выберите фиксацию, из которой я хочу создать отдельный запрос на растяжение
git cherry-pick [my-isolated-commit-sha]
Наконец, нажмите на пульте дистанционного управления
git push origin isolated-pull
И вытащите запрос, который ши.
Ответ 6
Решение создать новую (временную) ветвь, вишневый выбор и создание запроса на растяжение для этой ветки меня не удовлетворило. Я не хотел менять свой репозиторий, чтобы сделать набор коммитов доступным, поэтому я придумал следующую альтернативу:
Сначала создайте файлы патчей для всех интересующих объектов:
git format-patch -1 <sha>
Если фиксация интереса является последней, вы можете использовать HEAD
вместо <sha>
.
Теперь вы можете отправить исправления для хранителя исходного репозитория, который может их применять:
git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch
git am < <the patch>
...
git checkout master
git merge new-branch
Наконец, это должно выглядеть так же, как если бы временная ветвь была объединена по запросу pull, но без этой дополнительной ветки в fork-repository.
Ответ 7
Основываясь на ответе @kevin-hakanson, я написал этот небольшой скрипт bash, чтобы облегчить этот процесс. Он добавит репозиторий в восходящем потоке, если он еще не существует (запрашивая у вас URL), а затем запросит имя новой создаваемой ветки и тег /SHA для фиксации вишни, выбранной для этой ветки. Он проверяет, в какой ветке или коммите вы находитесь, а затем сохраняет все изменения, чтобы вы могли проверить новую ветку. Стратегия слияния сохраняет изменения от вишневого коммита. После отправки новой ветки в origin
(предполагается, что это имя вашего удаленного репо), ветвь или фиксация, в которой вы находились до этого, снова извлекается, и ваши предыдущие изменения извлекаются из тайника.
if ! git remote | grep -q upstream; then
read -p "Upstream git repo URL: " upstream
git remote add upstream $upstream
git remote update
fi
read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
# detached HEAD; just get the commit SHA
current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop
(Это сработало для меня в нескольких простых тестах, но я не программист bash или git-эксперт, поэтому дайте мне знать, если есть пропущенные мной случаи, которые можно было бы автоматизировать лучше!)