Питання Як змінити існуючі, невикористані копії?


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

Як я можу змінити повідомлення чи файли? Звернення ще не висунуто.


7680
2017-10-07 15:44


походження


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


Відповіді:


Зміна останнього повідомлення про здійснення

git commit --amend

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

git commit --amend -m "New commit message"

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

Переконайтеся, що у вас немає змін у роботі копії постановка перш ніж робити це, або вони також будуть вчинені. (Unstaged зміни не будуть здійснені.)

Зміна повідомлення про здійснення, яке ви вже натиснули на ваш віддалений підрозділ

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

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

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

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


Використовуйте інтерактивний ребаз

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

Для того, щоб зробити гітару сквош, виконайте такі дії:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Після того, як ви наклеїти свої зобов'язання - виберіть e/r для редагування повідомлення

enter image description here

Важлива примітка про інтерактивний перебаз

Коли ви використовуєте git rebase -i HEAD~X може бути більше ніж X зобов'язується. Гіт буде "збирати" всі зобов'язання в останній X і якщо в такому діапазоні з'явиться злиття, то ви побачите всі зобов'язання, а результат буде X +.

Гарний відгук:

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


Документація


14802
2018-02-08 04:26



Однак git commit --amend не така потужна як git rebase -i. - Jeffrey Jose
@jeffjose, це, безумовно, не повинно бути. Крім того, git commit --amend може виправити (??) майстер здійснити. - strager
Якщо ви вже натиснули, просто натисніть сили знову: git push -f origin branchname - hughes
@Hughes немає git push -f трохи небезпечно, якщо інші люди використовують один і той же сховище? - Armand
Якщо ви не бажаєте переписати все повідомлення про помилку, перейдіть на сторінку git commit --amend -c HEAD. Це дозволить відкрити редактор із заздалегідь заповненим вашим старим повідомленням, щоб ви могли його змінити. - Sam


git commit --amend -m "your new message"

2415
2017-10-07 19:52



Я зробив git commit -amend -m "Нове повідомлення", але натискання на Github породжувало "Об'єднати віддалені зміни, перш ніж натискати знову". Після тріску, скопіюйте - обертайте, і натисніть знову, нове повідомлення не з'явиться. Замість цього у мене є "Merge branch" master "з github.com:[myrepo]" - Dave Everitt
@DaveEveritt ви, найімовірніше, підштовхнули вашу компанію до впорядкування, перш ніж намагатись її виправити. - Thorbjørn Ravn Andersen
@Kyralessa неправда У bash ви можете легко створити повідомлення про багатоліткові фіксації, просто не закриваючи цитату, поки ви не закінчите (повернення в кінці кожного рядка в лапках). - hobs
Я не розумію, як відповідь, яка виглядає дуже як головна ідея відповіді, написаної два роки тому, а також прийнята відповідь отримує так багато голосів. Дивно. (нічого поганого з відповіддю, хоча) - happy coder
@AmalMurali, ну Мова йшла не про популярність питання, а про корисність відповіді. Але ця конкретна відповідь не є найстарішою відповіддю, а також не дає подальшого розуміння прийнятої відповіді. Здається, це копія розділу прийнятої відповіді. Це була моя точка зору. ЧЕРЕЗ! - happy coder


Якщо зобов'язання, яке ви хочете виправити, не є останнім:

  1. git rebase --interactive $parent_of_flawed_commit

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

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

    1. Змінити pick до reword (або на старі версії Git, до edit) перед будь-якими зобов'язаннями, які ви хочете виправити.
    2. Після збереження, Git буде повторювати перераховані зобов'язання.
       

  3. Для кожного зобов'язання ви хочете переосмислити, Gіt поверне вас у ваш редактор. Для кожного зобов'язання ви хочете редагувати, Гіт викидає тебе в оболонку. Якщо ви перебуваєте в оболонці:

    1. Змініть фіксацію будь-яким способом.
    2. git commit --amend
    3. git rebase --continue

Більша частина цієї послідовності буде пояснена вами результатами різних команд, коли ви йдете. Це дуже просто, вам не потрібно запам'ятовувати це - просто пам'ятайте це git rebase --interactive дозволяє правильно робити копії незалежно від того, як давно вони були.


Зауважте, що ви не хочете змінювати зобов'язання, які ви вже натиснули. Або, можливо, ви робите, але в такому випадку вам доведеться дуже уважно спілкуватися з усіма, хто, можливо, потягнув ваші зобов'язання і зробив роботу над ними. Як я можу відновити / синхронізувати після того, як хтось натискає перезавантаження чи скидання до опублікованої гілки?


2297
2017-08-15 21:20



Чи можна змінити повідомлення про першу фіксацію (яка не має батьківського значення)? - 13ren
Це згадується в одній з інших відповідей, але я помічу це тут. Оскільки git 1.6.6 ви можете використовувати reword замість pick редагувати повідомлення журналу. - MitMaro
До речі, $parent_of_flawed_commit еквівалентно $flawed_commit^. - Peeja
Ніколи не робіть цього (або перебудовуйте взагалі), якщо ви вже підштовхнули вгору за течією! - Daniel Rinser
Використовуйте -p (--preserve-merges), якщо після збійної фіксації відбулося злиття. - ahven


Щоб змінити попередній корект, внесіть потрібні зміни та виправте ці зміни, а потім запустіть

git commit --amend

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

Щоб внести зміни до попередньої фіксації та зберегти те саме повідомлення журналу, запустіть

git commit --amend -C HEAD

Щоб виправити попередню помилку, повністю її видаливши, запустіть

git reset --hard HEAD^

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

git rebase -i HEAD~commit_count

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

git commit --amend
git rebase --continue

Примітка. Ви можете «Внести потрібні зміни» також з відкритого редактора git commit --amend


750
2018-06-06 21:16



git rebase -i HEAD~commit_count також дозволить вам змінити повідомлення про корупцію, однак, багато вирішених вами завдань. Просто позначте вибрану команду як "reword", а не "pick". - Joe
Що робити, якщо ти не хочеш перебазувати? Ви просто хочете змінити старе повідомлення? - SuperUberDuper
git reset --hardанігілює незв'язані зміни. Будь ласка, замініть --hard з --soft. - eel ghEEz


Як вже згадувалося, git commit --amend це спосіб перезаписати останню фіксацію. Один примітка: якщо ви хотіли б також перезаписати файли, команда буде

git commit -a --amend -m "My new commit message"

381
2017-09-01 20:35



І якщо ви не хочете додавати все, спочатку можете це зробити git add file.ext тоді просто git commit --amend - MalcolmOcean


Ви також можете використовувати git filter-branch для того.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Це не так просто, як тривіальне git commit --amend, але це особливо корисно, якщо у вас вже є декілька об'єднань після помилкового повідомлення про помилку.

Зауважте, що це спробує переписати КОЖНЕ зобов'язання між HEAD і недосконалість, так що ви повинні вибрати свою msg-filter команда дуже розумна ;-)


346
2018-01-10 14:23



Чи є версія такої, яка не змінює коректність, якщо регулярний вираз не знаходить нічого? - sjakubowski
Фільтр-гілка AFAIK --msg-фільтр генерує нові зобов'язання в будь-якому випадку. Тим не менш, ви можете перевірити в межах msg-фільтра, якщо сед зміг і використовувати цю інформацію, коли операція фільтра-гілки закінчиться, щоб скинути ваше дерево на реф / оригінал. - Mark
@DavidHogue Це вірно лише при використанні методу фільтра-гілки. Ідентифікатори кодів після модифікованого коректування не змінюються, якщо ви використовуєте інтерактивну базу даних. - Mark
@ Марк Так вони роблять, вони зобов'язані. Ідентифікатори Commit залежать від попередніх зобов'язань. Якщо вони не змінювалися, гіт буде марним. - Miles Rout
Тобі потрібно $flawed_commit^..HEAD, ні $flawed_commit..HEAD. як заявляє людина сторінка: «Ця команда перезапише лише позитивні посилання, згадані в командному рядку (наприклад, якщо ви передаєте a..b, лише b буде перезаписано).» - Ángel


Я віддаю перевагу цьому шляху.

git commit --amend -c <commit ID>

В іншому випадку з'явиться нова фіксація з новим ідентифікатором


306
2017-11-08 03:51



Для мене, використовуючи вашу команду вище, насправді створюється нова фіксація з новим ідентифікатором, а також додатковим зобов'язанням, що повідомляє "з'єднати гілку" як повідомлення про помилку. - Jan
Внесення змін завжди створює нове повідомлення з новим ідентифікатором. Ідентифікатор commit - це SHA-хеш вмісту фіксації, включаючи повідомлення про помилку та авторизовані чи впорядковані відмітки часу. Це особливість Git, що, забороняючи зіткнення хеш-шоу, гарантує, що два з однаковими ідентифікаторами виконують саме ті самі зобов'язання з точно таким же вмістом, історією тощо. - Emil Lundberg
Погодьтеся з Емілем. Крім того, читання документів - здається, що все "-c" - це команда git, яка повідомлення про помилку використовувати як за замовчуванням / шаблон для вашого нового зобов'язання. Дійсно, він вже збирається робити "-c <commit ID>" за замовчуванням , тому не потрібно вказувати його. - Gal
The -c робить кілька речей. За замовчуванням він використовує старе повідомлення, але також копіює інформацію про авторство (людину та час). -C робить те саме, крім того, що він не просить вас редагувати повідомлення. - Joseph K. Strauss
Як @ SantanuDey, це не спрацювало для мене. я зрозумів, я отримав fatal: Option -m cannot be combined with -c/-C/-F/--fixup. - Andrew Grimm


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

Або скористайтеся цією командою з консолі / терміналу:

git commit -a --amend -m "My new commit message"

304
2018-01-22 17:23





Ви можете використовувати Перезаряджання гіт. Наприклад, якщо ви хочете змінити назад на commit bbc643cd, запустіть

$ git rebase bbc643cd^ --interactive

У редакторі за замовчуванням змініть параметр "вибрати", щоб "редагувати" у рядку, зобов'язання якого ви хочете змінити. Зробіть свої зміни, а потім спробуйте їх

$ git add <filepattern>

Тепер ви можете використовувати

$ git commit --amend

змінити фіксацію, а після цього

$ git rebase --continue

повернути назад до попередньої голови фіксації.


279
2017-10-22 11:22



Якщо ви хочете переконатися, що ваша зміна git commit --amend прийняв вплив, який ви можете використовувати git show і це покаже нове повідомлення. - Steve Tauber


  1. Якщо ви хочете лише змінити своє останнє повідомлення, виконайте наступне:

    git commit --amend
    

    Це дозволить вам перейти до вашого текстового екзистора і дозволити вам змінити останнє повідомлення про фінансування.

  2. Якщо ви хочете змінити останні 3 повідомлень для здійснення або будь-які з повідомлень про прибуття до цього пункту, то постачайте HEAD~3 до git rebase -i команда:

    git rebase -i HEAD~3
    

270
2017-11-15 09:29



Це попередня відповідь вже каже, що ви можете використовувати git commit --amend, і він також говорить, що ви можете використовувати git rebase -i HEAD~commit_count, все, що ви робили, було підключено 3 за commit_count.