Отправьте запрос на перенос на GitHub только для последней фиксации

Я разветвил проект на github, успешно вношу изменения в свой локальный мастер и нажимаю на источник на github. Я хочу отправить запрос на перенос, но хочу включить только последнюю фиксацию. Пользовательский интерфейс запроса на вытягивание на github.com показывает последние 9 коммитов, и я не знаю, как отфильтровать их.

Я пытался понять, следует ли мне создать новую локальную ветвь, проверить это и как-то сбросить или переустановить на восходящий поток? Затем примените мою последнюю фиксацию от моего мастера по идентификатору к новой локальной ветке и используйте ее для запроса на перенос?

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


person Kevin Hakanson    schedule 10.03.2011    source источник
comment
А что произойдет, если вы выполните пул-реквест со всеми другими коммитами? Я думал, что git достаточно умен, чтобы игнорировать (или передавать) коммиты, которые он уже втянул?   -  person jayarjo    schedule 29.06.2012
comment
Предположительно апстрим еще не принял или не хочет, чтобы промежуточные коммиты.   -  person Michael Scott Cuthbert    schedule 09.06.2014
comment
@jayarjo Я, например, внес другие изменения, которые не хочу отправлять вверх по течению. Например, изменения в git игнорировать основной репозиторий не понадобятся. Ничего простого с git.   -  person Martin    schedule 01.07.2017
comment
Связано: некоторые полезные сведения о различиях запросов на вытягивание в Git (программное обеспечение) и GitHub (веб-сервис)   -  person RBT    schedule 12.08.2017


Ответы (7)


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

Примечание: они могут понадобиться вам перед командами 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, переключитесь на нее и сможете отправить запрос на перенос с желаемыми изменениями.

person Kevin Hakanson    schedule 11.03.2011
comment
Спасибо, мне тоже помогло это решение. Вот ссылка, объясняющая, как работает сбор вишни в git: technosophos.com/content/ (прокрутите вниз и игнорируйте сообщения об ошибках PHP). - person dubbaluga; 24.12.2012
comment
Мне также нужно git remote add upstream <git repository> и git remote update перед запуском git checkout -b upstream upstream / master. - person plainjimbo; 08.05.2013
comment
Это сработало и для меня. Новый интерфейс глупого Github. Я не могу понять, как выбрать конкретную фиксацию и создать новый запрос на перенос. К счастью, это сработало. - person firesofmay; 04.07.2013
comment
Это работает, но не так, как вы должны это делать, потому что теперь ваша ветка восходящего потока и восходящий поток / мастер разные и всегда будут разными, если слияние вашего запроса на перенос не является первым, что делает восходящий поток. По этой причине вам следует предпочесть stackoverflow.com/a/5256304/1904815. - person JonnyJD; 07.08.2013
comment
Уточнение: это не техническая проблема, а логическая. Если вы хотите сделать что-либо с восходящим потоком (например, слияние оттуда), вам нужно добавить ветвь в реальном восходящем потоке или сбросить исходный поток (не оставляя локальной ветки для вашего запроса на перенос для дополнительных изменений). - person JonnyJD; 07.08.2013
comment
Git новичок здесь. Спасибо @Jimbo за комментарий о git remote add upstream <git repository>; просто хочу добавить, что <git repository> должен быть тем, из которого вы клонировали, я изначально использовал свой собственный и обнаружил, что он не работает. - person wangzq; 03.04.2015
comment
Зачем мне нужна дополнительная ветка только для того, чтобы создать PR для одной измененной строчки кода ?! Кто-нибудь в github продумывал это? - person CodeManX; 20.08.2015
comment
@CoDEmanX, зачем вам нужна дополнительная ветка, чтобы запросить слияние ветки? Это само по себе ответ. - person Jon Hanna; 23.03.2016
comment
@JonHanna Нет ... зачем вообще нужно объединять ветку? Почему нельзя просто слить коммит? - person Kevin Krumwiede; 18.08.2016
comment
@KevinKrumwiede вы можете, но вы еще не в этом пункте; вы собираетесь запросить что-то для слияния. У данного пользователя может быть одна фиксация, которую они хотят объединить, но у них может быть несколько, поэтому github нужен способ сгруппировать одну или несколько коммитов для этого запроса. В git уже есть возможность иметь группу из одного или нескольких коммитов, которая является ветвью, так что опирайтесь на это. Кроме того, пользователю в любом случае потребуется еще одна ветка, чтобы продолжать работу над проектом. - person Jon Hanna; 18.08.2016
comment
@JonHanna Вы о многом догадываетесь из-за того, что мы просто знаем, что данный пользователь только что попросил слияние ровно одной фиксации, не обязательно ветки. Так что удивляться, зачем нужно иметь дело с ветвями, вполне понятно. - person Thorsten Schöning; 12.12.2016
comment
@ ThorstenSchöning Я не предполагаю ничего, кроме того, что пользователь хочет, чтобы один или несколько коммитов были объединены, что является допустимым предположением и концепцией, для которой у git есть механизм (ветвь). Пользователь, предполагающий, что он хочет объединить только одну фиксацию, - это тот, кто делает предположение (как они узнают, что им не будет предложено дальнейшее изменение до того, как PR будет принят?). Это не значит, что ветки ничего не стоят. - person Jon Hanna; 12.12.2016
comment
Создание ветки перед каждой фиксацией кажется утомительной тратой - просто для того, чтобы гарантировать, что коммиты разделены. У вас будет столько же ветвей, сколько коммитов, и тогда ветки и коммиты - это два обязательных шага для одной логической операции. Есть ли способ, чтобы клиент рабочего стола GitHub автоматически создавал требуемую ветку перед фиксацией? - person Ian Boyd; 14.11.2018

Создайте новую ветку, начиная с последней фиксации, которая также находится в исходном репозитории:

git branch new-branch origin/master
git checkout new-branch

Затем используйте git cherry-pick, чтобы получить единственную фиксацию, для которой требуется запрос на перенос. Если ветка с этой фиксацией называется feature, а желаемая фиксация является последней фиксацией в этой ветке, это будет

git cherry-pick feature

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

На втором этапе вам нужно решить, что делать с веткой feature. Если вы еще не опубликовали свои изменения в этой ветке, лучшей процедурой, вероятно, является перебазирование этой ветки на новую ветку (и удаление последней фиксации, если это не выполняется автоматически git rebase).

person Lars Noschinski    schedule 10.03.2011
comment
Я получаю это сообщение после выбора вишни. ничего не добавлено для фиксации, но присутствуют неотслеживаемые файлы (для отслеживания используйте git add). Все в моем мастере, но мне нужно сделать свою ветку из апстрима. - person Kevin Hakanson; 10.03.2011
comment
Если feature уже зафиксирован в origin/master, во время cherry-pick ничего не происходит. Новая ветка должна быть от upstream/master (т.е. ответ Кевина Хакансона) - person ohho; 31.01.2013

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

Я имел:

  • orignal_project
  • forked_project (создан из исходного проекта на SHA: 9685770)
  • my_fork (создан из разветвленного проекта на SHA: 207e29b)
  • коммит в моей вилке (SHA: b67627b), который я хотел отправить обратно в исходный проект

Для этого я:

  1. создал новую ветку из SHA, где был разветвлен исходный проект
  2. вытащил все из оригинального проекта
  3. вишня выбрала коммит, который я хотел отправить как запрос на перенос
  4. отправил все это на github

Команды git были примерно такими:

  1. git ветка my-feature-request 9685770
  2. git checkout мой-запрос-функция
  3. git pull https://github.com/original_project/original_project.git
  4. git вишневый выбор b67627b
  5. git push origin мой-запрос-функция

Затем я выбрал my-feature-request в качестве ветки для моего запроса на перенос в исходный проект.

person John Naegle    schedule 27.02.2013

У меня это почти сработало:

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.

person hi_tech_lowlife    schedule 26.07.2015

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

Итак, я проверил новую ветку

git checkout -b isolated-pull

И вот в чем мое решение отличается от решения @Kevin Hakanson, так как мне нужно сбросить эту ветку на то место в истории, от которого я хочу отличаться.

git reset --hard [sha-to-diff-by]

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

git cherry-pick [my-isolated-commit-sha]

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

git push origin isolated-pull

И запрос на вытягивание, что ши.

person irbanana    schedule 01.07.2016
comment
Спасибо, я действительно ненавижу Git, и все остальные ответы выдавали ошибку, которую я был слишком ленив, чтобы исправить, но ваш ответ сразу сработал. Большое спасибо - person Sasinosoft; 10.01.2021

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

Сначала создайте файлы патчей для всех интересующих коммитов:

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

Наконец, это должно выглядеть так, как если бы временная ветвь была объединена запросом на перенос, но без этой дополнительной ветки в репозитории вилки.

person Johannes Jendersie    schedule 15.03.2016

Основываясь на ответе @ 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, поэтому дайте мне знать, если есть случаи, которые я пропустил, которые можно было бы лучше автоматизировать!)

person Nathan    schedule 03.07.2019