Попередні відповіді охоплювали використання git rebase -i
для редагування комітету, який ви хочете розділити, та виконання його частинами.
Це добре працює при розділенні файлів на різні коміти, але якщо ви хочете розділити зміни на окремі файли, вам потрібно знати більше.
Діставшись зобов’язання, яке ви хочете розділити, використовуючи rebase -i
та позначивши його edit
, у вас є два варіанти.
Після використання git reset HEAD~
перейдіть патчі окремо, використовуючи git add -p
для вибору потрібні елементи під час кожного виконання
Відредагуйте робочу копію, щоб видалити не потрібні зміни; вчинити цей тимчасовий стан; а потім витягнути повну комісію для наступного раунду.
Варіант 2 корисний, якщо ви розділяєте велику комісію, оскільки вона дозволяє перевірити, чи тимчасові версії будуються та працюють належним чином як частина об'єднання. Це відбувається наступним чином.
Після використання rebase -i
та edit
використання комісії, використовуйте
git reset --soft HEAD~
щоб скасувати комісію, але залишити файли в індексі. Ви також можете зробити змішане скидання, опустивши --soft, залежно від того, наскільки близький до кінцевого результату буде ваша початкова комісія. Різниця полягає лише в тому, чи почати ви з усіх поетапних змін або з усіма нестандартними.
Тепер увійдіть і відредагуйте код. Ви можете видалити зміни, видалити додані файли та зробити все, що завгодно, щоб сконструювати першу фіксацію потрібної серії. Ви також можете створити його, запустити і підтвердити, що у вас є послідовний набір джерела.
Після того, як ви щасливі, розмістіть / видаліть файли за потребою (я люблю це використовувати git gui
) та виконайте зміни через інтерфейс користувача або командний рядок
git commit
Це перша зроблена комісія. Тепер ви хочете відновити свою робочу копію в тому стані, який він мав після розколу, який ви розщеплюєте, щоб ви могли скористатися більшою кількістю змін для наступного вчинення. Щоб знайти sha1 комітету, який ви редагуєте, використовуйте git status
. У перших кількох рядках статусу ви побачите команду rebase, яка виконується в даний час, і в якій ви можете знайти sha1 свого початкового комітету:
$ git status
interactive rebase in progress; onto be83b41
Last commands done (3 commands done):
pick 4847406 US135756: add debugging to the file download code
e 65dfb6a US135756: write data and download from remote
(see more in file .git/rebase-merge/done)
...
У цьому випадку команда, яку я редагую, має sha1 65dfb6a
. Знаючи це, я можу перевірити вміст цього комітету в моєму робочому каталозі, використовуючи форму, git checkout
яка займає і фіксацію, і розташування файлу. Тут я використовую .
як розташування файлів, щоб замінити всю робочу копію:
git checkout 65dfb6a .
Не пропустіть крапку в кінці!
Це дозволить перевірити та проаналізувати файли такими, якими вони були після редакції, яку ви редагуєте, але відносно попереднього вступу, яке ви зробили, тому будь-які зміни, які ви вже здійснили, не будуть частиною комісії.
Ви можете або продовжити зараз, і виконати це як - це закінчити розкол, або знову обійтися, видаливши деякі частини зобов’язання перед тим, як зробити чергове тимчасове зобов'язання.
Якщо ви хочете повторно використовувати оригінальне повідомлення про фіксацію для однієї чи кількох комісій, ви можете використовувати його прямо з робочих файлів ребазу:
git commit --file .git/rebase-merge/message
Нарешті, після внесення всіх змін,
git rebase --continue
буде продовжувати та завершувати операцію ребаші.