Отправить запрос на GitHub только для последнего коммита - PullRequest
265 голосов
/ 10 марта 2011

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

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

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

Ответы [ 7 ]

288 голосов
/ 11 марта 2011

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

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

56 голосов
/ 10 марта 2011

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

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

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

git cherry-pick feature

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

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

26 голосов
/ 27 февраля 2013

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

У меня было:

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

Для этого я:

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

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

  1. git branch my-feature-request 9685770
  2. git checkout my-Feature-Request
  3. git pull https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. git push origin my-feature-request

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

6 голосов
/ 26 июля 2015

Это почти сработало для меня:

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

5 голосов
/ 01 июля 2016

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

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

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

И запрос на получение данных.

1 голос
/ 15 марта 2016

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

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

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

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

0 голосов
/ 03 июля 2019

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

...