Как мне сделать PR из разветвленного репо только для определенных файлов, но все они фиксируются?

tl;dr

  • Я разветвил репо и сделал много коммитов для многих файлов, все в главной ветке.
  • Теперь я хочу создать запрос на перенос для всех коммитов в выбранных файлах, чтобы отправить его автору исходного репо. Например, я хочу отправить обратно некоторые улучшения, но не файлы, которые я добавил.
  • Меня не волнует, если все коммиты будут объединены в совершенно новый.

Что я пробовал ...

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

Что я вижу ...

Казалось, что всякий раз, когда я выбирал вишню, я получал ветку без изменений (что имеет смысл, поскольку они уже назначены мастером, не так ли? - тогда как мне создать эту тематическую ветку, о которой я вижу, что упоминается?) теперь я выполнил несколько команд, которые я не полностью понимаю (например, git remote add ...), а также, возможно, поменял местами исходное репо автора и мое разветвленное репо в них, поэтому становится трудно сказать, не работают ли что-то, потому что я испортил свою среду вверх.

Убираться

@ Ответ Омера отлично сработал. Затем я сделал

git reset --hard HEAD

помыть. Первоначальный автор объединил PR, и я синхронизировал его:

git remote add upstream git://github.com/<author>/<repo>.git
git pull upstream master

person slackwing    schedule 31.07.2020    source источник
comment
Вы хотите, чтобы для конкретного выбранного файла были внесены все изменения или их часть?   -  person ElpieKay    schedule 31.07.2020
comment
В моем случае это работает, чтобы получить все изменения. (Если я вообще вношу изменения в исходный файл репо, его стоит отправить обратно. Мои собственные настройки всегда будут в отдельных новых файлах.)   -  person slackwing    schedule 31.07.2020


Ответы (1)


В вашем репозитории используйте git log, чтобы вычислить хэш последнего коммита, который вам не принадлежит (коммит, который был последним в master, когда вы разветвлялись). С этого момента я буду называть этот хеш abcd.

Оформить заказ и создать новую ветку для ВАШЕЙ последней фиксации (НЕ abcd), выполнив:

git checkout -b andrew_pr

Теперь выполните смешанный сброс, чтобы ветвь andrew_pr ответвилась от abcd, но все ваши ранее зафиксированные изменения остались локальными:

# Remember to replace "abcd" with the commit hash from the beginning!
git reset --mixed abcd # <---- Replace abcd

Теперь, когда все ваши изменения представляют собой простые локальные изменения, вы можете выполнить интерактивное git add, используя:

git add -p

Это будет сопровождать вас подсказкой по каждому из ваших изменений, и вы можете отбросить некоторые изменения и сохранить некоторые другие изменения. Конечно, вы захотите сохранить все изменения, которые хотите видеть в PR.

Как только вы закончите, зафиксируйте

git commit -m "Andrew's changes"

И толкнуть

git push --set-upstream origin andrew_pr

Журналы push-уведомлений должны содержать удобную ссылку для создания запроса на вытягивание. Перейдите по этой ссылке и отправьте свой PR.

person Omer Tuchfeld    schedule 31.07.2020
comment
Хм. Когда я сделал это в другой раз, последний шаг дал мне ссылку для создания PR в моем разветвленном репо вместо исходного репо. Есть идеи, что могло случиться? - person slackwing; 10.08.2020
comment
Не уверен, что ссылка исходит от вашего хоста git - будь то Github, BitBucket, GitLab и т. Д. Это удобная функция, часто реализуемая этими службами. Вместо этого вы можете посетить исходное репо на веб-сайте хоста git и создать новый PR из пользовательского интерфейса. Это должно позволить вам выбирать ветки из вашего разветвленного репо в качестве исходных веток. - person Omer Tuchfeld; 10.08.2020