Як змінити автора коммітов для одного конкретного коммітов?

Я хочу змінити автора одного конкретного коммітов в історії. Це не останній Ком.

Я знаю про це питання - як мені змінити автора коммітов в git?

Але я думаю про щось, де я ідентифікую Комміт по хешу або короткому хешу.

тисяча п'ятсот шістьдесят чотири
15 июня '10 в 7:00 2010-06-15 07:00 заданий MicTech 15 червня '10 о 7:00 2010-06-15 7:00
@ 9 відповідей

Інтерактивна перебазування з точки раніше в історії, ніж Комміт, який вам потрібно змінити ( git rebase -i <earliercommit> ). У списку коммітов, які було перебазовано, змініть текст з pick на edit поруч з хешем того, який ви хочете змінити. Потім, коли git запропонує вам змінити Комміт, використовуйте це:

 git commit --amend --author="Author Name <email@address.com>" 

Наприклад, якщо ваша історія коммітов ABCDE-f з F якості HEAD , і ви хочете змінити автора C і D , то ви б ...

  1. Вкажіть git rebase -i B ( ось приклад того, що ви побачите після виконання команди git rebase -i B )
    • якщо вам потрібно відредагувати A , використовуйте git rebase -i --root
  2. змінити рядки для C і D від pick до edit
  3. Як тільки почався ребаз, він спочатку зупиниться на C
  4. Ви повинні зробити git commit --amend --author="Author Name <email@address.com>"
  5. Потім git rebase --continue
  6. Це знову зупиниться на D
  7. Потім ви повинні знову git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. Перебазування буде завершено.
  10. Використовуйте git push -f щоб оновити ваш джерело оновленими коммітов.
2672
15 июня '10 в 7:31 2010-06-15 07:31 відповідь дан Amber 15 червня '10 в 7:31 2010-06-15 7:31

Прийнятим відповіддю на це питання є дивно розумне використання інтерактивного перебазування, але, на жаль, воно викликає конфлікти, якщо Комміт, який ми намагаємося змінити, автор використовував для гілки, яка згодом була об'єднана. У більш загальному випадку, це не працює при обробці брудних історій.

Оскільки я побоююся запуску скриптів, які залежать від установки і скидання змінних середовища для перезапису історії git, я пишу новий відповідь на основі цього поста, який схожий на цей відповідь, але є більш повним.

Наступне перевірено і працює, на відміну від пов'язаного відповіді. Припустимо для ясності викладу, що 03f482d6 - це Комміт, автора якого ми намагаємося замінити, а 42627abe - це Комміт з новим автором.

border=0
  1. Оформіть Комміт, який ми намагаємося змінити.

     git checkout 03f482d6 
  2. Примусьте автора змінити.

     git commit --amend --author "New Author Name <New Author Email>" 

    Тепер у нас є новий Комміт з хешем, рівним 42627abe .

  3. Оформити замовлення оригінальної гілці.

  4. Замініть старий Комміт на новий локально.

     git replace 03f482d6 42627abe 
  5. Переписати всі майбутні коммітов на основі заміни.

     git filter-branch -- --all 
  6. Видаліть заміну для чистоти.

     git replace -d 03f482d6 
  7. Натисніть на нову історію (використовуйте тільки --force, якщо наведене нижче не вдається, і тільки після перевірки працездатності за допомогою git log і / або git diff ).

     git push --force-with-lease 

Замість 4-6 ви можете просто перейти на новий Комміт:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 відповідь дан merlin2011 04 березня '15 в 5:11 2015-03-04 5:11
09 июня '15 в 19:02 2015-06-09 19:02 відповідь дан olivieradam666 09 червня '15 о 19:02 2015-06-09 19:02
  • Скиньте Вашу електронну адресу електронної пошти в конфігурації:

    git config --global user.email example@email.com

  • Тепер скиньте автора вашого коммітов без необхідності редагування:

    git commit --amend --reset-author --no-edit

82
05 апр. відповідь дан pravbeatle 05 Квітня. 2017-04-05 15:44 '17 о 15:44 2017-04-05 15:44

Ви можете змінити автора останньої фіксації, використовуючи наведену нижче команду.

git commit --amend --author="Author Name <email@address.com>"

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

Запустіть перезавантаження за допомогою git rebase -i . Він покаже вам щось на зразок цього.

Змініть ключове слово pick на edit для коммітов, які ви хочете змінити ім'я автора.

Потім закрийте редактор. Для новачків натисніть Escape , потім введіть :wq і натисніть Enter .

Тоді ви побачите свій термінал, як ніби нічого не сталося. Насправді ви перебуваєте в середині інтерактивної перестановки. Тепер прийшов час змінити ваше ім'я автора фіксації, використовуючи команду вище. Він знову відкриє редактор. Закрийте і продовжите перезавантаження за допомогою git rebase --continue . Повторіть те ж саме для кількості фіксації, яке ви хочете відредагувати. Ви можете переконатися, що інтерактивна зведення закінчилася, коли ви отримали повідомлення No rebase in progress? .

69
29 авг. відповідь дан Fatih 29 Серпня. 2015-08-29 03:52 '15 в 3:52 2015-08-29 3:52

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

Як привід для опитування git filter-branch я написав script, щоб переписати ім'я автора та / або авторську електронну пошту для даної фіксації:

15 июня '10 в 8:24 2010-06-15 08:24 відповідь дан Chris Johnsen 15 червня '10 о 8:24 2010-06-15 8:24

При виконанні git rebase -i є цей цікавий біт в документі:

Якщо ви хочете скинути дві або більше коммітов в одну, замініть команду "pick" на другу і наступну фіксацію за допомогою "squash" або "fixup" . Якщо у коммітов були різні автори, складений фіксаж буде приписаний автору першого коммітов. Пропоноване повідомлення фіксації для складеного фіксації є конкатенацію повідомлень фіксації першого фіксації і команд з командою "squash" , але опускає повідомлення фіксації коммітов за допомогою команди "fixup" .

  • Якщо у вас є історія ABCDEF ,
  • і ви хочете змінити commits B і D (= 2 коммітов),

то ви можете зробити:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • створювати порожні коммітов (по одному для кожного фіксації):
    • вам потрібно для цілей переадресації
    • git commit --allow-empty -m "empty"
  • запустіть операцію перезавантаження
    • git rebase -i B^
    • B^ вибирає батьківський елемент B .
  • вам потрібно помістити один порожній commit до для кожної фіксації для зміни
  • вам потрібно змінити pick на squash для них.

Приклад того, що git rebase -i B^ дасть вам:

 pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty 

змініть це на:

 # change commit B author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

Він запропонує вам відредагувати повідомлення:

 # This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there... 

і ви можете просто видалити перші кілька рядків.

12
28 авг. відповідь дан dnozay 28 Серпня. 2013-08-28 04:03 '13 в 4:03 2013-08-28 4:03

Є ще один крок до Бурштиновий відповідь , якщо ви використовуєте централізований репозиторій:

git push -f , щоб примусово оновити центральний репозиторій.

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

11
20 дек. відповідь дан Fabian76 20 дек. 2013-12-20 18:06 '13 о 18:06 2013-12-20 18:06

Зафіксувати перед:

2019

Інші питання по мітках або Задайте питання