Як видалити коміти з запиту на витягування


105

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

Я знайшов кілька подібних питань щодо StackOverflow, але я не можу застосувати те, що там. Це мій перший запит на GitHub, тому мені дивно, як все це працює.

Виділений коміт - це той, який мені потрібно зберегти та видалити всі інші речі. Це стає четвертим комітом в історії, тому що я роблю злиття.

введіть тут опис зображення

мій журнал git введіть тут опис зображення

Хтось може пояснити, що відбувається і як вирішити цю проблему?


2
Вам потрібно перебазувати і лише "вибрати" коміт "додано з github" (тобто прокоментувати рядки для кожного іншого коміту)
Роббі Аверілл

1
перебазуйте яку гілку на яку гілку, будь ласка, додайте більше пояснень.
гумазе

what branch= гілка, над якою ви працюєте, onto what branch= гілка, яку ви вимагаєте
Роббі Аверілл

Я пояснив, на що натякнув @Robbie Averill у своїй відповіді. Дивно, що дотепер ніхто не писав відповіді, пояснюючи це.
ferit

Відповіді:


109

У вас є кілька методів, щоб це зробити.

Цей пост - прочитайте частину про скасування, де детально пояснить, що ми хочемо зробити і як це зробити.

Ось найбільш просте рішення вашої проблеми:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

Команда revert створить новий коміт із скасуванням початкового коміту.


2
Це працює навіть тоді, коли ми розлучили проект з якоюсь іншою людиною і хочемо видалити деякі коментарі в запиті на витягування?
Dr.jacky

110

Люди не хотіли б бачити неправильний коміт і скасувати коміт, щоб скасувати зміни неправильного коміту. Це забруднює історію історії.

Ось простий спосіб видалення неправильного коміту замість скасування змін за допомогою повернення коміту.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// де n- кількість останніх комітів, які ви хочете включити в інтерактивну базу даних.

  3. Замініть pickна dropдля комітів, які потрібно відкинути.
  4. Збережіть і вийдіть.
  5. git push --force

8
це спрацювало для мене як чарівність. У мене була купа комітетів, які не повинні були бути в PR. Я просто інтерактив перебазував, скинув ці коміти і відсунув їх назад
FullStackEngineer

1
Вам все одно слід синхронізуватися з віддаленим майстром, перш ніж запускати pr, ні?
ferit

5
Для того, щоб підштовхнути я повинен був зробити: git push origin HEAD:myBranch --force. Але інакше чудово і корисно.
ScottyBlades

4
Це також корисно, коли ви хочете виправити відкритий PR в GitHub, вам просто потрібно мати змогу зробити примусовий поштовх
Володимир Ідальго

1
@jorijnsmit вони означають після запуску git rebase -i HEAD~<n>, у верхній частині файлу будуть <n>рядки комітів, кожен рядок містить текст pick <commit id>. Комітування за замовчуванням pick, тому для кожного коміту, який ви хочете скинути, змініть текст pickнаdrop
Slim

6

Якщо ви видаляєте коміт і не хочете зберігати його зміни, @ferit має гарне рішення.

Якщо ви хочете додати цей коміт до поточної гілки, але не має сенсу бути частиною поточного pr, замість цього ви можете зробити наступне:

  1. використання git rebase -i HEAD~n
  2. Поміняйте коміт, який ви хочете видалити, на нижню (останню) позицію
  3. Зберегти та вийти
  4. використовувати, git reset HEAD^ --softщоб скасувати зміни та повернути їх у поетапний стан.
  5. використовувати git push --forceдля оновлення віддаленої гілки без видаленого коміту.

Тепер ви видалите коміт із віддаленого пульта, але зміни все одно матимуть локально.


2

Отже, зробіть наступне,

Скажімо, ваше ім’я філії - my_branch, і в цьому є додаткові коміти.

  1. git checkout -b my_branch_with_extra_commits (Зберігаючи цю гілку під іншою назвою)
  2. gitk (Відкриває консоль git)
  3. Шукайте коміт, який ви хочете зберегти. Скопіюйте SHA цього коміту в блокнот.
  4. git checkout my_branch
  5. gitk (Це відкриє консоль git)
  6. Клацніть правою кнопкою миші на коміті, до якого потрібно повернутися (Зазначте перед внесенням змін), і натисніть " reset branch to here"
  7. Зробіть a git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Тепер подивіться на історію комісій місцевого відділення та переконайтеся, що все виглядає добре.


0

Ось що мені допомогло:

  1. Створіть нову гілку з наявною. Назвемо існуючий branch_oldі новий як branch_new.

  2. Скиньте branch_newдо стабільного стану, коли у вас не було жодної проблеми з комітом. Наприклад, щоб поставити його на рівні місцевого майстра, зробіть наступне:

    git reset —hard master git push —force origin

  3. cherry-pickкоміти з branch_oldвbranch_new

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