Надішліть запит на витяг на GitHub лише для останньої передачі


280

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

Я намагався зрозуміти, чи варто створити нову локальну гілку, перевірити це і якось скинути або відновити верхні потоки? Тоді застосуйте моє останнє зобов’язання від мого майстра за id до нової місцевої гілки та використати це для запиту на виклик

Я намагаюся правильно зрозуміти поняття і визначити правильні командні рядки, щоб робити те, що мені потрібно.


А що станеться, якщо ви виконаєте запит на тягнення з усіма іншими комісіями? Я думав, що git досить розумний, щоб ігнорувати (або передавати) зобов'язання, які він уже втягнув?
jayarjo

3
Імовірно, верхня частина течії ще не прийняла або не хоче, що втручається.
Майкл Скотт Катберт

@jayarjo Я, наприклад, вніс інші зміни, які я не хочу надсилати вище. Наприклад, зміни в git ігноруванні основного сховища не знадобляться. Нічого просто з git.
Мартін

Пов’язано: Деякі хороші подробиці про те, чим відрізняються запити на виклики в Git (програмне забезпечення) та GitHub (веб-сервіс)
RBT

Відповіді:


302

Потрібно, в основному, створити нову гілку та вибрати вишні, які ви хочете до неї додати.

Примітка: вони можуть знадобитися перед командами оформлення замовлення / вишеньки

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


32
Мені також потрібно git remote add upstream <git repository>і git remote updateдо запуску git checkout -b upstream upstream / master.
звичайний

6
Це працює, але це не так, як ви повинні це робити, тому що тепер ваша гілка вище та вище / по течії / master є різною і завжди буде різною, якщо об'єднання запиту на витяг не перше, що робить вище. З цієї причини вам слід віддати перевагу stackoverflow.com/a/5256304/1904815 .
JonnyJD

2
Докладніше: Це не технічна проблема, а логічна. Коли ви хочете зробити що-небудь із висхідним потоком (як, наприклад, злиття звідти), вам потрібно додати гілку "реально вгору" або скинути її вище (не залишаючи місцевої гілки для запиту на отримання додаткових змін).
JonnyJD

15
Чому на землі мені потрібна додаткова гілка, тільки щоб створити PR для єдиного зміненого рядка коду ?! Хтось із Github задумався про це?
CodeManX

2
@JonHanna Ні ... чому взагалі вам потрібно об'єднати гілку? Чому ви не можете просто злити об’єкт?
Кевін Крумвіде

57

Створіть нову гілку, починаючи з останньої комісії, яка також знаходиться у сховищі початкових даних:

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

Потім використовуйте git cherry-pickдля отримання єдиного комітету, для якого потрібно запит на витяг. Якщо гілка цього комітету буде викликана, featureа потрібна фіксація - остання фіксація в цій гілці, це буде

git cherry-pick feature

Якщо припустити, що цей патч застосовується без конфлікту, тепер у вас є відділення, для якого ви можете виконати запит на виклик.

На другому кроці тепер вам потрібно вирішити, що робити з вашою featureфілією. Якщо ви ще не опублікували свої зміни в цій гілці, найкраща процедура - це, мабуть, звільнення цієї гілки за новою гілкою (та видалення останньої комісії, якщо це не робиться автоматично git rebase).


Це повідомлення я отримую після вишні. нічого не додано для фіксації, окрім наявних неперевірених файлів (для відстеження використовуйте "git add"). Все у мого господаря, але мені потрібно зробити свою гілку з верхньої течії.
Кевін Хакансон

5
Якщо featureце вже зроблено origin/master, протягом цього нічого не відбувається cherry-pick. Нова гілка повинна бути з upstream/master(тобто відповідь Кевіна Хакансона)
ой

26

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

Я мав:

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

Для цього я:

  1. створили нову філію з SHA, де роздвоєний оригінальний проект
  2. витягнуло все з оригінального проекту
  3. вишня вибрала зобов’язання, яке я хотів подати як запит на тягу
  4. підштовхнув усе це до github

Команди git були чимось на зразок:

  1. git branch мій-особливий запит 9685770
  2. git checkout my-особливість-запит
  3. git pull https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. git push origin my-особливість-запит

Тоді я вибрав свою функцію-запит як гілку для мого запиту на потяг до оригінального проекту.


6

Це майже працювало для мене:

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.


5

Я вже взяв на себе зобов’язання, яке хотів, щоб я міг ізолювати як запит на тягнення назад на поточну гілку.

Тому я перевірив нове відділення

git checkout -b isolated-pull

І ось, де моє рішення відрізняється від @Kevin Hakanson's , оскільки мені потрібно скинути цю гілку на місце в історії, від якого я хочу відрізнятись

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

І вишневий вибір, з якого я хочу створити ізольований запит на витяг

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

Нарешті підсуньте його до пульта

git push origin isolated-pull

І тягнути запит дат ши.


1

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

Спершу створіть файли патчів для всіх об'єктів, що цікавлять:

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

На основі відповіді @ kevin-hakanson я написав цей маленький скрипт, щоб полегшити цей процес. Він додасть репо-вихідний потік, якщо він ще не існує (запит на отримання 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

(Це спрацювало для мене в декількох простих тестах, але я не баш програміст чи експерт з git, тому дайте мені знати, якщо є випадки, які я пропустив, які могли б бути автоматизовані краще!)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.