совместить - схлопнуть коммиты git




Как изменить существующие, нечеткие коммиты? (18)

Изменение последнего сообщения о фиксации

git commit --amend

откроет ваш редактор, что позволит вам изменить сообщение фиксации последнего коммита. Кроме того, вы можете установить сообщение commit непосредственно в командной строке:

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

... однако, это может сделать многострочные сообщения фиксации или небольшие исправления, более громоздкие для ввода.

Перед тем, как это сделать, убедитесь, что у вас нет каких-либо изменений в рабочей копии, иначе они также будут совершены. ( Нестационарные изменения не будут зафиксированы.)

Изменение сообщения фиксации, которое вы уже нажали на удаленную ветку

Если вы уже подтолкнули свое сообщение к удаленной ветке, то вам нужно принудительно нажать фиксацию с помощью:

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

Предупреждение: принудительное нажатие перезапишет удаленную ветвь с состоянием вашего местного . Если в удаленном филиале есть коммиты, которых у вас нет в вашем локальном филиале, вы потеряете эти коммиты.

Предупреждение: будьте осторожны при внесении поправок в то, что вы уже поделились с другими людьми. Внесение поправок, по сути, переписывает их, чтобы иметь разные идентификаторы SHA , что создает проблему, если у других людей есть копии старого коммита, который вы переписали. Любой, у кого есть копия старого коммита, должен будет синхронизировать свою работу с вашим недавно переписанным фиксатором, что иногда может быть затруднено, поэтому убедитесь, что вы координируете работу с другими при попытке переписать общую историю фиксаций или просто не переписываете общие коммиты в целом.

Использовать интерактивную переустановку

Другой вариант - использовать интерактивную перезагрузку.
Это позволяет редактировать любое сообщение, которое вы хотите обновить, даже если это не последнее сообщение.

Чтобы выполнить скриншот git, выполните следующие действия:

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

Как только вы раздавите свои коммиты - выберите e/r для редактирования сообщения

Важное примечание об интерактивной перестановке

Когда вы используете git rebase -i HEAD~X может быть больше, чем X совершает. Git будет «собирать» все коммиты в последнем X и если бы произошло слияние где-то между этим диапазоном, вы увидите все коммиты, поэтому результат будет X +.

Хороший совет:

Если вам нужно сделать это для более чем одной ветки, и вы можете столкнуться с конфликтами при изменении содержимого, настройте git rerere и дайте git разрешить эти конфликты автоматически для вас.

🔥 Горячий наконечник

Вы также можете написать небольшую функцию bash, чтобы исправить последнее сообщение git commit и нажать на пульте дистанционного управления. Помогает мне все время. Вот функция; поместите его в свой .bashrc или похожий файл .zshrc и перезагрузите свою оболочку.

# Amend the last commit message
# Push the changes to remote by force
# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "[email protected]"
    git push --force
}

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

Я написал неверное в сообщении о фиксации. Кроме того, я забыл включить некоторые файлы.

Как я могу изменить сообщение / файлы фиксации? Конец еще не нажат.


изменить

У вас здесь пара вариантов. Ты можешь сделать

git commit --amend

пока это ваша последняя фиксация.

Интерактивная перестановка

В противном случае, если это не ваша последняя фиксация, вы можете сделать интерактивную перезагрузку,

git rebase -i [branched_from] [hash before commit]

Затем внутри интерактивной переадресации вы просто добавляете изменения для этого фиксации. Когда это происходит, сделайте git commit --amend и измените сообщение фиксации. Если вы хотите вернуться назад до этой точки фиксации, вы также можете использовать git reflog и просто удалить эту фиксацию. Затем вы снова делаете git commit .


Вау, поэтому есть много способов сделать это.

Еще один способ сделать это - удалить последнее коммит, но сохранить его изменения, чтобы вы не потеряли свою работу. Затем вы можете выполнить другое коммитирование с исправленным сообщением. Это будет выглядеть примерно так:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Я всегда делаю это, если забываю добавить файл или внести изменения.

Не забудьте указать --soft вместо --hard , иначе вы полностью потеряете эту фиксацию.


Вы можете использовать Git rebasing . Например, если вы хотите изменить back to commit bbc643cd, запустите

$ git rebase bbc643cd^ --interactive

В редакторе по умолчанию измените 'pick' на 'edit' в строке, чью фиксацию вы хотите изменить. Внесите свои изменения, а затем выполните их

$ git add <filepattern>

Теперь вы можете использовать

$ git commit --amend

для изменения фиксации, и после этого

$ git rebase --continue

чтобы вернуться к предыдущей фиксации головы.


Вы также можете использовать git filter-branch для этого.

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

Это не так просто, как тривиальный git commit --amend , но это особенно полезно, если у вас уже есть некоторые слияния после вашего сообщения с ошибочным фиксацией.

Обратите внимание, что это попытается переписать КАЖДОЙ фиксацию между HEAD и ошибочным фиксацией, поэтому вы должны выбрать команду msg-filter очень мудрую ;-)


Для тех, кто ищет графический интерфейс Windows / Mac для редактирования старых сообщений (т. Е. Не только последнее сообщение), я бы рекомендовал SourceTree . Ниже приводятся следующие шаги.

Для коммитов, которые еще не были нажаты на удаленный:

  1. Убедитесь, что вы зафиксировали или спрятали все текущие изменения (т. Е. Нет файлов, перечисленных на вкладке «Статус файла») - это не будет работать иначе.
  2. На вкладке «Журнал / история» щелкните правой кнопкой мыши на записи с соседней строкой в ​​графе, расположенной ниже фиксации, которую вы хотите отредактировать, и выберите «Rebase children of <commit ref> интерактивно ...»
  3. Выберите целую строку для сообщения фиксации, которое вы хотите изменить ( т.е. нажмите столбец «Сообщение» ).
  4. Нажмите кнопку «Редактировать сообщение».
  5. Измените сообщение по желанию в появившемся диалоговом окне и нажмите «ОК».
  6. Повторите шаги 3-4, если есть другие сообщения фиксации для изменения.
  7. Нажмите «ОК»: начнется перезагрузка. Если все будет хорошо, выход завершится успешно.

... Или ... за фиксации, которые уже были нажаты:

Следуйте инструкциям в этом ответе , которые аналогичны приведенным выше, но для запуска команды из командной строки требуется дополнительная команда, чтобы принудительно нажать ветку - прочитайте ее все и примените необходимую осторожность!


Если вы используете Git GUI, вы можете изменить последнее сообщение, которое не было нажато:

Commit/Amend Last Commit

Если вы используете инструмент Git GUI, есть кнопка с именем last last commit. Нажмите на эту кнопку, а затем отобразите свои последние файлы фиксации и сообщение. Просто отредактируйте это сообщение, и вы можете передать его с новым сообщением фиксации.

Или используйте эту команду с консоли / терминала:

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

Если вы хотите изменить последнее сообщение, вы должны использовать флаг --only или его ярлык -o с commit --amend :

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

Это гарантирует, что вы случайно не улучшите свое совершение с помощью поставленных вещей. Конечно, лучше иметь правильную конфигурацию $EDITOR . Затем вы можете оставить параметр -m , и git предварительно заполнит сообщение фиксации старым. Таким образом, его можно легко отредактировать.


Если фиксация, которую вы хотите исправить, не самая последняя:

  1. git rebase --interactive $parent_of_flawed_commit

    Если вы хотите исправить несколько ошибочных коммитов, передайте родительскую часть самой старой из них.

  2. Появится редактор со списком всех фиксаций с момента, когда вы дали.

    1. Измените pick чтобы reword (или в старых версиях Git, чтобы edit ) перед любыми фиксациями, которые вы хотите исправить.
    2. Как только вы сохраните, Git будет воспроизводить перечисленные коммиты.

  3. Для каждой фиксации, которую вы хотите переписать , Git вернет вас обратно в ваш редактор. Для каждой фиксации, которую вы хотите изменить , Git бросает вас в оболочку. Если вы находитесь в оболочке:

    1. Измените фиксацию любым способом.
    2. git commit --amend
    3. git rebase --continue

Большая часть этой последовательности будет вам объяснена выводом различных команд по ходу. Это очень просто, вам не нужно запоминать это - просто помните, что git rebase --interactive позволяет исправить git rebase --interactive независимо от того, как давно они были.

Обратите внимание, что вы не захотите изменять фиксации, которые вы уже нажали. Или, может быть, вы это сделаете, но в этом случае вам придется проявлять большую осторожность, чтобы общаться со всеми, кто, возможно, потянул ваши коммиты и сделал работу поверх них. Как восстановить / повторить синхронизацию после того, как кто-то нажал на переустановку или сброс в опубликованную ветку?


Как уже упоминалось, git commit --amend - это способ перезаписать последнее коммит. Одна нота: если вы хотите также перезаписать файлы , команда будет

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

Обновите последнее ошибочное сообщение с новым сообщением о фиксации в одной строке:

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

Или попробуйте выполнить сброс git, как показано ниже:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

Использование сброса для разделения коммитов на более мелкие коммиты

git reset может помочь вам разбить один фиксатор на несколько коммитов:

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Здесь вы успешно сломали свою последнюю фиксацию на две фиксации.


Чтобы внести изменения в предыдущую фиксацию, внесите необходимые изменения и выполните эти изменения, а затем выполните

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 изменение» также из редактора, открытого git commit --amend


Я добавил псевдоним recm , recm для recommit (amend) , теперь я могу сделать это с помощью git recm или git recm -m .

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

Я предпочитаю этот путь.

git commit --amend -c <commit ID>

В противном случае произойдет новый коммит с новым идентификатором фиксации


использование

git commit --amend

Чтобы понять это подробно, отличный пост - 4. Перезапись истории Git . В нем также говорится о том, когда не использовать git commit --amend .


Если вы не нажали код на удаленную ветку ( GitHub / Bitbucket ), вы можете изменить сообщение фиксации в командной строке, как показано ниже.

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

Если вы работаете над определенной веткой, выполните следующие действия:

git commit --amend -m "BRANCH-NAME: new message"

Если вы уже нажали на код с неправильным сообщением, и вам нужно быть осторожным при изменении сообщения. То есть, после того, как вы измените сообщение фиксации и попробуйте нажать его снова, у вас возникнут проблемы. Чтобы сделать его гладким, выполните следующие действия.

Прежде чем делать это, прочитайте мой весь ответ.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Важное примечание. Когда вы используете прямое нажатие, вы можете столкнуться с проблемами кода, которые другие разработчики работают в одной ветви. Поэтому, чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветки, прежде чем нажимать силовую кнопку :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Это наилучшая практика при изменении сообщения фиксации, если оно уже было нажато.


Я понял, что я нажал на фиксацию с опечаткой. Чтобы отменить, я сделал следующее:

git commit --amend -m "T-1000, advanced prototype"
git push --force

Предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветку локальным. Убедитесь, что вы не будете переписывать все, что хотите. Также будьте осторожны в силе, надавливающей исправленную (переписанную) фиксацию, если кто-то другой разделяет эту ветку с вами, потому что они должны будут переписать свою собственную историю, если у них есть старая копия коммитов, которую вы только что переписали.





amend