Як я можу поєднати два коміти в один коміт?


99

У мене є відділення "firstproject" з 2 комітами. Я хочу позбутися цих комітів і змусити їх виглядати як єдине комітування.

Команда git merge --squashзвучить багатообіцяюче, але коли я запускаю git merge --squashсвій термінал, просто з’являються варіанти команди. Яка правильна команда?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

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

Ні, ти можеш змінити кілька комітів на один коміт : git-scm.com/book/en/Git-Tools-Rewriting-History. Моє питання стосується лише конкретної команди для нього.
Дон П

@BSull Ви абсолютно можете змінювати коміти будь-яким способом, який хочете. Їх можна повністю редагувати буквально в будь-який час. Якщо ви ділитесь кодом з іншими, це перепише вашу історію, і ви фактично будете працювати з іншою гілкою, ніж усі інші.
meagar

Цього ніколи не слід обманювати. Насправді, той інший слід було закрити як занадто широкий. Інше питання, яке це позначено як обман, є непотрібним складним, оскільки воно передбачає відмову від попереднього перебазування.
Еван Керролл,

Відповіді:


134

Ви хочете git rebase -iвиконати інтерактивне перебазування .

Якщо ви наразі перебуваєте у своєму "коміті 1", і коміт, який ви хочете об'єднати, "коміт 2", є попереднім комітом, ви можете запустити його git rebase -i HEAD~2, що створить редактор із переліком усіх комітів, які буде переглядати база даних. Ви повинні побачити два рядки, що починаються на "вибрати". Щоб приступити до стиснення, змініть перше слово другого рядка з "вибрати" на "сквош". Потім збережіть файл і закрийте програму. Git перекладе ваш перший коміт у ваш другий останній коміт.

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

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


2
Як це зробити Then write your file, and quit? Я використовую Android Studio Terminal, саму консоль git Або навіть відкрив git консоль програмним забезпеченням SourceTree. Але як зберегти і вийти?
Dr.jacky

1
Як поєднати 2 коміти, які не є двома останніми комітами у гілці?
Weishi Zeng

1
@meagar Я думаю, що це має сенс ... якщо ви перевірите цю проблему (дублікат цього), стискання "напрямку" мало велике значення і було корінням усієї проблеми (див. перший коментар із приблизно 200 голосами "за" давлячи неправильний шлях ') - stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWood Ви неправильно читаєте відповідь. Перший спосіб був простим неправильним , а не іншим . Ви можете тільки сквош тому, це НЕ має сенсу думати про давлячи старше зробити в новішу, але якщо ви могли б це була б та ж операція.
meagar

1
Я зрозумів до "змінити перше слово другого рядка" - другий рядок чого?
Ендрю Торр,

70

Ледача проста версія для таких забудьків, як я:

git rebase -i HEAD~3 або скільки завгодно замість 3.

Поверніть це

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

в це

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

і робити якісь - то дії , коли ви потрапили escпотім , enterщоб зберегти зміни. [1]

Коли з’явиться наступний екран, позбудьтесь цих сміттєвих # рядків [2] і створіть нове повідомлення про коміт або щось інше, і виконайте те саме escape enter. [1]

Wowee, у вас менше комітів. Або ти просто все зламав.


[1] - або що інше, що працює з вашою конфігурацією git. Це лише послідовність, яка є ефективною, враховуючи мою настройку.

[2] - ви побачите декілька речей, як- # this is your n'th commitот кілька разів, з оригінальними комітами прямо під цим повідомленням. Ви хочете видалити ці рядки та створити повідомлення про коміт, щоб відобразити наміри n комітів, які ви поєднуєте в 1.


Дуже стисле рішення - дякую. Може бути зручно окреслити, що sтут використовується для сквошу. Використовувати
коміт

Якщо у вас є лише 2коміти і ви хочете поєднати один і той же 2коміт, вам потрібно буде запустити git reset --soft HEAD~і git commit --amend.
скрутарі

22
  1. Оформіть своє відділення та підрахуйте кількість усіх ваших комісій.
  2. Відкрийте git bash і напишіть: git rebase -i HEAD~<quantity of your commits>(тобто git rebase -i HEAD~5)
  3. У відкритому txtфайлі змініть pickключове слово на squashвсі коміти, крім першого коміту (який знаходиться вгорі). Для першого змініть його на reword(це означає, що ви надасте новий коментар до цього коміту на наступному кроці) і натисніть ЗБЕРЕГТИ! Якщо у vim, натисніть, escа потім збережіть, ввівши wq!і натисніть enter.
  4. Надайте коментар.
  5. Відкрийте Git і зробіть "Отримати все", щоб побачити нові зміни.

Готово


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