Как "вытащить запрос" конкретное коммит

У меня есть конкретная фиксация, которую я хотел бы внести в репозиторий, который я разветкил на github. Я предполагаю, что механизм для этого - "запрос на тяну". Однако, когда я пытаюсь это сделать, я могу запросить только всю свою ветку. Я не хочу тянуть запрос на другие коммиты, поскольку они не имеют отношения к делу. Любая идея, как я могу это сделать.

repo Я хочу отправить запрос на.

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

commit Я хочу вывести запрос

Ответы

Ответ 1

Создайте новую ветвь с этим изменением:

$ git fetch --all
$ git checkout -b my-single-change upstream/master
$ git cherry-pick b50b2e7
$ git push -u origin my-single-change

Затем создайте PR из этой ветки.


Вышеизложенное предполагает, что вы установили upstream в качестве пульта. Если нет, сделайте это сначала:

$ git remote add upstream https://github.com/konradjk/exac_browser.git

Ответ 2

Я не знаком с вишневым пикером, и у меня возникла проблема, когда я попробовал подход Джозефа (что-то о том, что вишневый пирог пустой) Я нашел обходной путь, который, кажется, работал хорошо:

# Create new branch directly from specified commit:
$ git checkout -b my-single-change b50b2e7
$ git push --set-upstream origin my-single-change

Теперь вы можете выбрать эту ветку в GitHub и создать пул-запрос.

Ответ 3

У меня была та же ошибка AlwaysCurious, поэтому я немного покопался. 1

Обычный случай

A - B - C [master]
         \
          D - E - F - G [feature] 

Вы работаете над проектом, вы используете отдельную ветвь (feature) для DEFG изменений (DEFG) и хотите создать запрос на извлечение. Однако вы хотите, чтобы только некоторые коммиты были включены в запрос на извлечение (E и F)

Процедура здесь та, от Джозефа ответ

# optional: set upstream as remote if it not
git remote add upstream https://github.com/<upstream_github_username>/<upstream_github_repo_name>.git
# fetch changes
git fetch --all
# create specific branch for your partial pull request
git checkout -b partial-change upstream/master

Вот как это выглядит:

          [partial-change]
A - B - C [master]
         \
          D - E - F - G [feature]

Cherry-выберите ваши конкретные коммиты и внесите изменения:

git cherry-pick <hash of commit E>
git cherry-pick <hash of commit F>
git push -u origin partial-change

После устранения любого конфликта вы получите следующее:

          E1 - F1 [partial-change]
         / 
A - B - C [master]
         \
          D - E - F - G [feature]

Последовательный случай

Если вместо этого вы просто хотите применить все последовательные коммиты до последнего (или двух, или трех), вы можете просто перейти к конкретному коммиту. Например, здесь я просто хочу коммиты до E а не последующие:

git checkout -b partial-consecutive-changes <hash of commit E>
git push -u origin partial-consecutive-changes

A - B - C [master]
         \
          D - E [partial-consecutive-changes]
               \
                F - G [feature]

Ошибка новичка

Последняя процедура также может помочь вам, если вы просто применили последовательные изменения к мастеру, не используя для них определенную ветвь, и теперь вы хотите выбрать их после. Это актуально, если вы разветкили проект на C и продолжили работу над другими коммитами. Здесь я добавляю звездочку, чтобы сигнализировать, что на вилке происходят новые изменения:

A - B - C - D* - E* - F* - G* [master]

Что вы не должны делать, это:

git checkout -b partial-change upstream/master
git cherry-pick <hash of commit D>
git cherry-pick <hash of commit E>
git push -u origin partial-change

В этом случае вы пытаетесь разветкить мастера в G* и вишня, выбирающая предыдущие коммиты, получит вам предупреждение:

Предыдущая вишня теперь пуста, возможно, из-за разрешения конфликта.

так как вы добавляете те же старые коммиты в новую ветку.

Что вы должны сделать вместо этого:

git checkout -b partial-change <hash of commit E>
git push -u origin partial-change

A - B - C - D* - E* - F* - G* [master]
                  \
              D* - E* [partial-change]               

После этого вы готовы сделать пул-запрос только с выбранными коммитами.


Заметки:

  1. Здесь я продолжаю этот замечательный ответ от Шверна.

  2. Для получения последних n хэшей коммитов может быть полезно использовать: git log --pretty=oneline --abbrev-commit | head -n git log --pretty=oneline --abbrev-commit | head -n