Создайте отдельный запрос на извлечение для каждой фиксации

#git #github #pull-request

#git #github #запрос на извлечение

Вопрос:

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

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

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

  1. У меня есть главная ветвь, которая на 4 коммита опережает удаленную ветку. https://github.com/Gaurang033/Selenium2Library
  2. Если я создаю новую ветку из своего мастера, все эти изменения также копируются. и поэтому создание ветки также не помогает. https://github.com/Gaurang033/Selenium2Library/tree/click_elements

Вот некоторые выходные данные из git log --all --oneline --graph --decorate :

 * 340fb9e (origin/click_elements) Feature Request - Click Elements #585
*   8a8f485 (HEAD -> master, origin/new_locator, origin/master, origin/HEAD) Merge remote-tracking branch 'upstream/master'
|
| * 2466942 (upstream/master) Libdoc updates - link to project and fix 404 (#668)
* | e66862f Added method to find element by class name #673
* | f8ec2ed Feature Request - Click Elements #585
* | 264e38c Added following keywords and their acceptance test cases to fix the issue #463 table_cell_should_not_contain table_column_should_not_contain table_footer_should_not_contain table_header_should_not_contain table_row_should_not_contain table_should_not_contain
| * [truncated: more commits on master in original repo...]
|/
*   ef5d24d Merge pull request #539 from ReadmeCritic/master
 

Кто-нибудь, пожалуйста, дайте мне знать, как решить эту проблему?

Ответ №1:

При отправке PR на GitHub обычно лучше сохранять PR атомарным и обновлять его с официальным master . То есть любая ветвь, которую вы используете для PR, должна выходить напрямую upstream/master и должна содержать только коммиты, необходимые для этого PR.

Чтобы устранить вашу проблему, сначала выполните сброс master , чтобы синхронизировать с upstream :

 git checkout master
git reset --hard upstream/master
 

Теперь для каждого PR, который вы хотите отправить, создайте новую ветку и выберите соответствующий коммит. Например.:

 git checkout -b branch1
git cherry-pick f8ec2ed
git push --set-upstream origin branch1
 

После того, как вы закончите, вы можете удалить исходную click_elements ветку:

 git branch -D click_elements
git push :click_elements
 

Или, если вы хотите, чтобы эта ветка содержала только первую фиксацию (что позволяет повторно использовать существующий PR), выполните:

 git checkout click_elements
git reset --hard 264e38c
git push --force-with-lease
 

Чтобы избежать этой проблемы в будущем, никогда не выполняйте коммит напрямую master . Вместо этого выполните следующие действия:

  1. При необходимости обновите свой репозиторий:
     git checkout master
    git pull upstream master
     
  2. Создайте новую ветку ( git checkout -b mybranch ).
  3. Внесите любые изменения, необходимые для этого одного PR в этой ветке, фиксируя как обычно.
  4. Непосредственно перед отправкой PR перебазируйте свою ветку функций:
     git checkout master
    git pull upstream master
    git checkout mybranch
    git rebase master
     

    (В зависимости от проекта, вы можете выполнить перебазирование даже после открытия PR. Однако часто вам это не понадобится, особенно если вы сделали это прямо перед открытием PR.)

  5. Откройте PR.

Обязательное предупреждение: поскольку перебазирование (а также reset --hard ) переписывает историю, это может быть опасным / разрушительным для всех, кто работает над этой веткой. Убедитесь, что вы четко сообщаете о том, что вы сделали, всем, с кем вы сотрудничаете.

Комментарии:

1. Это все. Важным моментом является то, что каждый коммит или серия коммитов, которые должны быть включены в один PR, должны иметь origin / master в качестве родительского коммита.