Git удалить последний коммит: Как отменить или удалить коммит в Git
Git: вернуться к предыдущему коммиту
Если я чему-то научился за 15 с лишним лет программирования, так это то, что ошибки встречаются часто, и я их много делаю. Это в равной степени относится и к инструментам контроля версий. Независимо от того, случайно ли вы зафиксировали изменения или просто поняли, что ваш предыдущий зафиксированный код — это не то, что вам нужно, часто вам потребуется отменить предыдущий коммит в Git.
В этой статье я покажу несколько способов отменить ваши коммиты, в зависимости от вашего варианта использования. Это сложная тема (которая относится ко многим темам Git в целом), поэтому убедитесь, что вы следуете инструкциям, которые лучше всего соответствуют вашим потребностям.
Удалить неопубликованные коммиты
Если вы еще не опубликовали свои коммиты в удаленном репозитории, таком как GitHub, вы можете по существу удалить предыдущие коммиты с помощью команды reset.
Хотя это эффективное решение, оно опасное, поскольку вы переписываете историю и оставляете «удаленные» коммиты без ссылок или «осиротевшими». Единственный способ найти и восстановить эти несвязанные коммиты — это git reflog.
Команда reset имеет три различных параметра, два из которых мы опишем здесь:
$ git reset --hard
Используя опцию —hard, все возвращается обратно к указанному коммиту. Это включает в себя ссылки на историю коммитов, промежуточный индекс и ваш рабочий каталог.
Это означает, что с помощью этой команды вы не только вернетесь к предыдущей фиксации, но и потеряете все рабочие изменения в процессе. Чтобы не потерять какие-либо рабочие изменения, вы можете использовать команды stash и stash pop:
$ git stash $ git reset --hard $ git stash pop
Команда stash сохраняет ваши рабочие изменения (без каких-либо комитов или изменений в дереве), а затем stash pop возвращает их обратно.
Другим вариантом, который вы можете рассмотреть, является параметр —soft. Эта опция работает так же, как git reset —hard , но влияет только на историю коммитов, а не на ваш рабочий каталог или промежуточный индекс.
$ git reset --soft
Удаление опубликованных коммитов
Допустим, вы зафиксировали свой код, а затем отправили его в удаленный репозиторий. На этом этапе настоятельно рекомендуется не использовать что-то вроде git reset, поскольку вы переписываете историю.
Вместо этого рекомендуется использовать команду revert. Эта команда работает, отменяя изменения, которые были внесены в указанный коммит, создавая новый коммит и фактически не удаляя предыдущие коммиты. Это идеально для опубликованных изменений, потому что тогда реальная история репозитория сохраняется. Вот пример:
$ git revert
Допустим, в вашем репозитории есть текстовый файл со следующим содержанием
This is my sample text
И вы изменяете его на:
This is my awesome sample text
Ваша история коммитов может выглядеть примерно так:
$ git log --pretty=oneline 676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text 735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit
Если мы решили, что нам больше ненужно слово «awesome» в нашем тексте, но мы не хотим удалять коммит 676ec, мы можем использовать revert, чтобы отменить это изменение:
$ git revert 676ec [master f68e546] Revert "Added 'awesome' to text" 1 file changed, 1 insertion(+), 1 deletion(-)
Получив приглашение ввести сообщение о коммите, мы теперь можем видеть в нашей истории коммитов, что фактически существует новый коммит:
$ git log --pretty=oneline f68e546ac2ae240f22b2676b5aec499aab27f1ca Revert "Added 'awesome' to text" 676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text 735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit
В результате этого первый и третий коммиты представляют одно и то же состояние проекта. Коммит был отменен, и история не была потеряна.
Обратите внимание, что есть несколько других способов использовать эту команду, например, если вы хотите вернуть обратно 2 коммита, вы можете использовать:
git revert HEAD~2
Или, если вы хотите отменить много непостоянных коммитов, вы указываете их индивидуально:
git revert 676ec 735c5
Временно оформить предыдущий коммит
«Отмена фиксации» означает, что вы временно хотите вернуться к предыдущему состоянию в своем репозитории, но без внесения каких-либо реальных изменений в дерево. В этом случае вы, вероятно, просто захотите проверить фиксацию, что позволит вам вернуться к мастеру или любому другому состоянию, когда вы закончите:
$ git checkout
Это изменит ваш рабочий каталог на содержимое этого коммита, а также на местоположение, на которое указывает HEAD, ни одно из которых не является необратимым. Любые изменения, которые вы делаете здесь, могут быть зафиксированы в ветке или сохранены для последующего использования.
Как отменить самые последние локальные коммиты в Git? — git
Я случайно зафиксировал неправильные файлы в Git, но я еще не отправил фиксацию на сервер.
Как я могу отменить эти коммиты из локального репозитория?
git
version-control
git-commit
undo
Поделиться
Источник
Hamza Yerlikaya
29 мая 2009 в 18:09
25 Ответов
21224
Отмена фиксации и повтор
$ git commit -m "Something terribly misguided" # (1)
$ git reset HEAD~ # (2)
<< edit files as necessary >> # (3)
$ git add ... # (4)
$ git commit -c ORIG_HEAD # (5)
- Это то, что вы хотите отменить.
- Это оставляет ваше рабочее дерево (состояние ваших файлов на диске) неизменным , но отменяет фиксацию и оставляет изменения, которые вы зафиксировали, нестагнированными (поэтому они будут отображаться как «Changes not staged for commit» в
git status
, поэтому вам нужно будет добавить их снова перед фиксацией). Если вы хотите только добавить больше изменений к предыдущей фиксации или изменить сообщение фиксации 1, Вы можете использовать вместо этогоgit reset --soft HEAD~
, который похож наgit reset HEAD~
(гдеHEAD~
-то же самое, что иHEAD~1
), но оставляет ваши существующие изменения поэтапными. - Внесите исправления в файлы рабочего дерева.
git add
все, что вы хотите включить в свой новый коммит.- Зафиксируйте изменения, повторно используя старое сообщение фиксации.
reset
скопировал старую головку в.git/ORIG_HEAD
;commit
с помощью-c ORIG_HEAD
откроет редактор, который изначально содержит сообщение журнала из старой фиксации и позволяет редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать опцию-C
.
Однако имейте в виду, что если вы добавили какие-либо новые изменения в индекс, использование commit --amend
добавит их к вашей предыдущей фиксации.
Если код уже отправлен на ваш сервер и у вас есть разрешения на перезапись истории (перебазирование), то:
git push origin master --force
Вы также можете посмотреть на этот ответ:
Как переместить HEAD обратно в предыдущее место? (Отрезанная голова) & отменить совершает
Приведенный выше ответ покажет вам git reflog
, который используется, чтобы узнать, что такое SHA-1, к которому вы хотите вернуться. После того, как вы нашли точку, до которой вы хотите отменить, чтобы использовать последовательность команд, как описано выше.
1 Обратите внимание, однако ,что вам не нужно сбрасывать предыдущую фиксацию, если вы только что допустили ошибку в своем сообщении о фиксации. Более простой вариант — это git reset
(чтобы отменить все изменения, которые вы сделали с тех пор), а затем git commit --amend
, который откроет ваш редактор сообщений о фиксации по умолчанию, предварительно заполненный последним сообщением о фиксации.
Поделиться
Esko Luontola
29 мая 2009 в 18:13
10264
Отмена фиксации немного пугает, если вы не знаете, как это работает. Но на самом деле это удивительно легко, если вы понимаете.
Скажем, у вас есть это, где C-ваш HEAD и (F) — состояние ваших файлов.
(F)
A-B-C
↑
master
Вы хотите сбросить ядерную бомбу на commit C и больше никогда его не увидеть . Ты сделаешь это:
git reset --hard HEAD~1
В результате получается:
(F)
A-B
↑
master
Теперь B — это HEAD. Поскольку вы использовали --hard
, ваши файлы сбрасываются в их состояние при фиксации B.
Ах, но предположим, что commit C-это не катастрофа, а просто немного не так. Вы хотите отменить фиксацию, но сохраните изменения для небольшого редактирования, прежде чем сделать лучшую фиксацию. Начиная снова отсюда, с C в качестве вашего HEAD:
(F)
A-B-C
↑
master
Вы можете сделать это, оставив --hard
:
git reset HEAD~1
В этом случае результат таков:
(F)
A-B-C
↑
master
В обоих случаях HEAD — это просто указатель на последнюю фиксацию. Когда вы делаете git reset HEAD~1
, вы говорите Git, чтобы переместить указатель HEAD назад на одну фиксацию. Но (если вы не используете --hard
) вы оставляете свои файлы, как они были. Итак, теперь git status
показывает изменения, которые вы зарегистрировали в C. Вы же ничего не потеряли!
Для самого легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и индекс :
git reset --soft HEAD~1
Это не только оставляет ваши файлы в покое, но даже оставляет ваш индекс в покое. Когда вы сделаете git status
, вы увидите, что в Индексе находятся те же файлы, что и раньше. На самом деле, сразу после этой команды вы могли бы сделать git commit
, и вы бы повторили тот же самый коммит, который у вас только что был.
Еще одна вещь: Предположим, вы уничтожите коммит , как в первом примере, но затем обнаружите, что он вам все-таки нужен ? Не повезло тебе, верно?
Нет, все еще есть способ вернуть его обратно. Введите git reflog
, и вы увидите список (частичных) объектов фиксации (то есть хэшей), в которых вы перемещались. Найдите коммит, который вы уничтожили, и сделайте это:
git checkout -b someNewBranchName shaYouDestroyed
Теперь вы воскресили это обязательство. Коммиты на самом деле не уничтожаются в Git в течение примерно 90 дней, поэтому вы обычно можете вернуться и спасти того, от кого вы не собирались избавляться.
Поделиться
Ryan Lundy
28 июля 2011 в 22:22
1954
Это заняло у меня некоторое время, чтобы понять, так что, возможно, это кому-то поможет…
Существует два способа «undo» вашей последней фиксации, в зависимости от того, сделали ли вы уже свою фиксацию общедоступной (перенесли в удаленный репозиторий):
Как отменить локальную фиксацию
Допустим, я совершил локальную фиксацию, но теперь хочу удалить эту фиксацию.
git log
commit 101: bad commit # latest commit, this would be called 'HEAD'
commit 100: good commit # second to last commit, this is the one we want
Чтобы восстановить все обратно в том виде, в каком оно было до последнего коммита, нам нужно reset
к коммиту до HEAD
:
git reset --soft HEAD^ # use --soft if you want to keep your changes
git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
Теперь git log
покажет, что наш последний коммит был удален.
Как отменить публичную фиксацию
Если вы уже сделали свои коммиты общедоступными, вы захотите создать новый коммит, который будет «revert» изменений, внесенных в ваш предыдущий коммит (текущий HEAD).
git revert HEAD
Теперь ваши изменения будут отменены и готовы к фиксации:
git commit -m 'restoring the file I removed by accident'
git log
commit 102: restoring the file I removed by accident
commit 101: removing a file we don't need
commit 100: adding a file that we need
Для получения дополнительной информации, проверьте Git основы-отмена вещей
Поделиться
Andrew
16 июня 2011 в 17:27
1679
Добавление / удаление файлов, чтобы получить вещи так, как вы хотите:
git rm classdir
git add sourcedir
Затем внесите изменения в коммит:
git commit --amend
Предыдущая, ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса — другими словами, это будет похоже на то, что вы никогда не делали ошибку в первую очередь.
Обратите внимание, что вы должны сделать это только в том случае, если вы еще не нажали. Если вы нажали, то вам просто придется совершить исправление в обычном режиме.
Поделиться
bdonlan
29 мая 2009 в 18:16
947
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
или
git reset --hard HEAD~1
Предупреждение: приведенная выше команда навсегда удалит изменения в файлах .java
(и любые другие файлы), которые вы хотели зафиксировать.
hard reset
— HEAD-1
установит вашу рабочую копию в состояние фиксации до вашего неправильного фиксации.
Поделиться
Lennart Koopmann
29 мая 2009 в 18:13
721
Изменение последнего коммита
Замените файлы в индексе:
git rm --cached *.class
git add *.java
Затем, если это частная ветвь, измените фиксацию:
git commit --amend
Или, если это общая ветвь, сделайте новую фиксацию:
git commit -m 'Replace .class files with .java files'
( чтобы изменить предыдущую фиксацию, используйте потрясающую интерактивную ребазу )
ProTip™: добавьте *.class
к gitignore , чтобы это не повторилось снова.
Чтобы отменить фиксацию
Изменение фиксации является идеальным решением, если вам нужно изменить последнюю фиксацию, но более общим решением является reset
.
Вы можете сбросить git на любую фиксацию с помощью:
git reset @~N
Где N
— количество коммитов до HEAD
, а @~
сбрасывается до предыдущего коммита.
Таким образом, вместо внесения изменений в коммит вы можете использовать:
git reset @~
git add *.java
git commit -m "Add .java files"
Проверьте git help reset
, в частности разделы на --soft
--mixed
и --hard
, чтобы лучше понять, что это делает.
Reflog
Если вы ошиблись, вы всегда можете использовать рефлог для поиска отброшенных коммитов:
$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started
Поделиться
Zaz
31 июля 2010 в 09:39
607
Использовать git revert <commit-id>
Чтобы получить фиксацию ID, просто используйте git log
Поделиться
Jaco Pretorius
25 мая 2012 в 16:04
488
Если вы планируете полностью отменить локальную фиксацию, все, что вы изменили, вы сделали в фиксации, и если вы ничего не боитесь об этом, просто выполните следующую команду.
git reset --hard HEAD^1
(Эта команда проигнорирует всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией точно так же, как после git add
), выполните следующую команду.
git reset --soft HEAD^1
Теперь ваши зафиксированные файлы попадают в промежуточную зону. Предположим, что если вы хотите увеличить размер файлов, так как вам нужно отредактировать неправильное содержимое, то выполните следующую команду
git reset HEAD
Теперь зафиксированные файлы должны поступать из поэтапной области в нестационарную область. Теперь файлы готовы к редактированию, поэтому, что бы вы ни изменили, вы хотите пойти редактировать и добавить его и сделать новый/новый коммит.
Больше
Поделиться
Madhan Ayyasamy
31 января 2013 в 07:06
462
Если у вас установлено Git дополнительных компонентов, вы можете запустить git undo
, чтобы отменить последнюю фиксацию. git undo 3
отменит последние 3 коммита.
Поделиться
nickf
13 декабря 2011 в 10:18
430
Я хотел отменить последние 5 коммитов в нашем общем репозитории. Я посмотрел на идентификатор ревизии, к которому я хотел откатиться. Затем я напечатал следующее.
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
+ 09a6480...5a74047 master -> master (forced update)
prompt>
Поделиться
neoneye
06 апреля 2012 в 13:58
410
Я предпочитаю использовать git rebase -i
для этой работы, потому что появляется хороший список, где я могу выбрать коммиты, от которых нужно избавиться. Это может быть не так прямолинейно, как некоторые другие ответы здесь, но это просто кажется правильным .
Выберите, сколько коммитов вы хотите перечислить, а затем вызовите вот так (чтобы включить последние три)
git rebase -i HEAD~3
Примерный список
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support
Затем Git удалит фиксации для любой удаляемой строки.
Поделиться
Steven Penny
25 октября 2012 в 03:41
395
Как исправить предыдущую локальную фиксацию
Используйте git-gui (или аналогичный) для выполнения git commit --amend
. С помощью GUI вы можете добавлять или удалять отдельные файлы из фиксации. Вы также можете изменить сообщение фиксации.
Как отменить предыдущую локальную фиксацию
Просто сбросьте свою ветвь в предыдущее расположение (например, используя gitk
или git rebase
). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном репозитории это будет похоже на то, что нежелательная фиксация никогда не происходила. Чтобы сделать все это в одной команде, используйте git reset HEAD~1
.
Предупреждение: неосторожное использование git reset
-это хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам Git избегать этого, если они могут.
Как отменить публичную фиксацию
Выполните обратный выбор вишни (git-revert), чтобы отменить изменения.
Если вы еще не перенесли другие изменения в свою ветвь, вы можете просто сделать это…
git revert --no-edit HEAD
Затем переместите обновленную ветвь в общий репозиторий.
История фиксации покажет оба коммита по отдельности .
Дополнительно: исправление частной ветви в публичном репозитории
Это может быть опасно — убедитесь, что у вас есть локальная копия филиала для повторного использования.
Также обратите внимание: вы не хотите делать это, если кто-то еще может работать в этой ветке.
git push --delete (branch_name) ## remove public version of branch
Очистите свою ветвь локально, а затем повторите ее…
git push origin (branch_name)
В обычном случае вам, вероятно, не нужно беспокоиться о том, что ваша история фиксации частной ветви будет нетронутой. Просто нажмите followup commit (см. «Как отменить публичный коммит» выше), а затем выполните сквош-слияние , чтобы скрыть историю.
Поделиться
nobar
23 апреля 2013 в 17:27
317
Если вы совершили хлам но не толкнули,
git reset --soft HEAD~1
HEAD~1 -это сокращение для фиксации перед главой. Кроме того, вы можете обратиться к SHA-1 из hash, если хотите сбросить значение. — soft option удалит фиксацию, но оставит все ваши измененные файлы «изменения, которые будут зафиксированы», как выразился бы статус git.
Если вы хотите избавиться от любых изменений в отслеживаемых файлах в рабочем дереве с момента фиксации перед головкой, используйте вместо этого «—hard«.
OR
Если вы уже нажали и кто-то потянул, что обычно происходит в моем случае, вы не можете использовать git reset . Однако вы можете сделать git revert ,
git revert HEAD
Это создаст новый коммит, который перевернет все, что было введено случайным коммитом.
Поделиться
santos_mgr
03 сентября 2014 в 07:15
313
Если вы хотите навсегда отменить его и вы клонировали какой-то репозиторий
Идентификатор фиксации можно увидеть по
git log
Тогда вы можете сделать —
git reset --hard <commit_id>
git push origin <branch_name> -f
Поделиться
poorva
17 мая 2013 в 13:02
266
На SourceTree (GUI для GitHub) вы можете щелкнуть правой кнопкой мыши фиксацию и сделать ‘Reverse Commit’. Это должно отменить ваши изменения.
На terminal:
Вы можете альтернативно использовать:
git revert
Или:
git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
Поделиться
Varun Parakh
28 июня 2013 в 10:18
248
Одна команда:
git reset --soft 'HEAD^'
Он отлично работает, чтобы отменить последнюю локальную фиксацию!
Поделиться
Manish Shrivastava
05 марта 2014 в 13:55
239
Просто сбросьте его, выполнив команду ниже, используя git
:
git reset --soft HEAD~1
Объясните: что делает git reset
, это в основном reset
для любого коммита, к которому вы хотели бы вернуться, затем, если вы объедините его с ключом --soft
, он вернется, но сохраните изменения в вашем файле(файлах), поэтому вы вернетесь к этапу, на котором файл был только что добавлен, HEAD
является главой ветви, и если вы объедините его с ~1
(в этом случае вы также используете HEAD^
), он вернется только к одному коммиту, который вы хотите…
Я создаю шаги на изображении ниже более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях и фиксации кода:
Поделиться
Alireza
21 июня 2017 в 09:33
220
Как отменить последний коммит Git?
Чтобы восстановить все обратно в том виде, в каком оно было до последнего коммита, нам нужно сбросить значение commit до HEAD.
Если вы не хотите сохранить внесенные вами изменения:
git reset --hard HEAD^
Если вы хотите сохранить свои изменения:
git reset --soft HEAD^
Теперь проверьте ваш журнал git. Это покажет, что наш последний коммит был удален.
Поделиться
Ranjithkumar Ravi
23 апреля 2014 в 11:21
178
Использовать reflog, чтобы найти правильное состояние
git reflog
REFLOG ПЕРЕД СБРОСОМ
Выберите правильный reflog (f3cb6e2 в моем случае) и типа
git reset --hard f3cb6e2
После этого РЕПО HEAD будет сброшено до этого HEADid
ЖУРНАЛ ПОСЛЕ СБРОСА
Наконец рефлог выглядит как на картинке ниже
REFLOG ОКОНЧАТЕЛЬНОЙ
Поделиться
Shubham Chaudhary
06 января 2014 в 22:34
171
«Reset the working tree to the last commit»
git reset --hard HEAD^
«Clean unknown files from the working tree»
git clean
смотрите- Git краткий справочник
NOTE: эта команда удалит вашу предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard
безопаснее –
Поделиться
Ravi_Parmar
03 октября 2013 в 12:43
154
Первый запуск:
git reflog
Он покажет вам все возможные действия, которые вы выполнили с вашим репозиторием, например, фиксацию, слияние, вытягивание и т. д.
Тогда делать:
git reset --hard ActionIdFromRefLog
Поделиться
U. Ali
11 октября 2013 в 14:41
146
Отменить последний коммит:
git reset --soft HEAD^
или git reset --soft HEAD~
Это отменит последнюю фиксацию.
Здесь --soft
означает сброс в стадию.
HEAD~
или HEAD^
означает переход к фиксации перед HEAD.
Заменить последний коммит на новый коммит:
git commit --amend -m "message"
Он заменит последний коммит новым коммитом.
Поделиться
akshay_rahar
06 марта 2016 в 11:53
140
Другой способ:
Проверьте ветку, которую вы хотите вернуть, а затем сбросьте свою локальную рабочую копию обратно в фиксацию, которую вы хотите сделать последней на удаленном сервере (все, что после этого будет сделано, будет удалено). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Reset BRANCHNAME to this commit».
Затем перейдите в локальный каталог вашего репозитория и выполните эту команду:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Это приведет к удалению всех коммитов после текущего в вашем локальном репозитории, но только для этой ветви.
Поделиться
CommaToast
13 мая 2013 в 17:12
131
Введите git log
и найдите последний код фиксации hash, а затем введите:
git reset <the previous co>
Поделиться
user853293
15 мая 2013 в 13:12
127
В моем случае я случайно зафиксировал некоторые файлы, которые я не хотел. Поэтому я сделал следующее И это сработало:
git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD
Проверьте результаты с помощью gitk или git log —stat
Поделиться
egridasov
18 июля 2013 в 06:41
Похожие вопросы:
Git: отменить локальные изменения; git добавить . + git РМ?
Нужна помощь, чтобы выяснить пару общих рабочих процессов с Github. Я происхожу из среды VSTFS, так что простите меня. Отмена Ожидающих Изменений Допустим, я клонировал репозиторий git в свою…
git push, не нажимайте все локальные коммиты
Я новичок в git и тестирую его прямо сейчас. На моей локальной машине я часто совершаю коммиты. Время от времени я хочу подтолкнуть код к центральному РЕПО. На данный момент я публикую все сделанные…
Как отменить последние N коммитов?
Я работаю над деревом, которое имеет следующие коммиты:- aaaaaaa Implement function A bbbbbbb Implement function B ccccccc Implement function C Я хотел бы отменить фиксацию первых двух , то есть…
Как отменить коммиты в git
Я совершил дважды и еще не нажал. Как я могу отменить это, хотя я ничего не делал. Я всегда думал, что это сбросит его: git checkout master но это не сработало. Я также погуглил и нашел этот пост:…
Как отменить последние локальные коммиты в Git и вернуться в удаленное состояние?
Я объединил удаленную ветку в локальное РЕПО, и она создала 26 локальных коммитов. Теперь я хочу вернуть этот merge, но он думает, что довольно скучно и чувствительно к ошибкам возвращать коммиты 1…
Git revert, как отменить мое принудительное слияние с master?
Я изменил один файл и сделал следующее: cd puppet-configuration-prod/ git status git pull origin master git add Puppetfile_puppet-prod git commit -m ‘modificaton Omar’ git pull origin master git…
Невозможно отменить локальные изменения в Git
Я использую студию Android, и Git находится с ней. Путь Git в Android studio выглядит следующим образом,…
26-голый … Почему fetch не всегда показывает самые последние коммиты?
У меня есть несколько РЕПО GIT, которые я отразил локально, чтобы показать в своем экземпляре JIRA, но я заметил некоторое (для меня) странное поведение. У меня есть РЕПО, назовем это myrepo. Если я…
Объединить локальные коммиты Git в один коммит для git-svn
В настоящее время, когда я запускаю git svn dcommit git создает отдельный коммит в SVN для каждого локального коммита, который я сделал с момента последней синхронизации с SVN. Есть ли какой-нибудь…
Как удалить все локальные Git коммиты, которые я сделал?
Мне нужно удалить все локальные коммиты из проекта Git. Мне нужно сделать так, чтобы я мог зафиксировать все как один уникальный коммит, прежде чем отправлять его вверх по течению.
Git — Book
2nd Edition (2014)
Download Ebook
The entire Pro Git book, written by Scott Chacon and Ben Straub and published by Apress, is available here. All content is licensed under the Creative Commons Attribution Non Commercial Share Alike 3.0 license. Print versions of the book are available on Amazon.com.>
- 1.1
О системе контроля версий - 1.2
Краткая история Git - 1.3
Основы Git - 1.4
Командная строка - 1.5
Установка Git - 1.6
Первоначальная настройка Git - 1.7
Как получить помощь? - 1.8
Заключение
- 1.1
- 2.1
Создание Git-репозитория - 2.2
Запись изменений в репозиторий - 2.3
Просмотр истории коммитов - 2.4
Операции отмены - 2.5
Работа с удалёнными репозиториями - 2.6
Работа с метками - 2.7
Псевдонимы в Git - 2.8
Заключение
- 2.1
- 3.1
О ветвлении в двух словах - 3.2
- 3.1
Как в Git изменить последний коммит ?
Deprecated: Function create_function() is deprecated in /home/worldhel/public_html/wp-content/plugins/codecolorer/lib/geshi.php on line 4698
В своем проекте Вы сделали изменения и зафиксировали их при помощи команды $ git commit -m""
, и как обычно это бывает, подтвердив действие нажатием клавиши Enter, Вы вдруг поняли, что забыли добавить пару строчек кода, в какой-либо файл, или сделали неверный комментарий к коммиту, или забыли убрать из кода var_dump($foo)
– отладочный тестовый вывод какой-либо переменной, или вам нужно добавить пару строк кода, логически подходящие именно под этот последний коммит, да и может возникнуть много других причин, по которым вы можете захотеть поменять содержимое кода или комментарий последнего коммита. И конечно же в самой популярной системе контроля версий Git предусмотрен механизм для такой незапланированной правки с помощью команды --amend
.
ВНИМАНИЕ: Никогда не вносите изменения в последний коммит при помощи команды --amend
, если данный коммит вы уже успели запушить на удаленный центральный репозиторий. В таких случаях вам нужно внести изменения в код с помощью нового коммита.
Правка кода в последнем коммите (ключ —amend).
На иллюстрации ниже показана история коммитов в текущем репозитории при помощи команды:
В данном примере при создании последнего коммита была допущена неточность в комментарии к коммиту, и еще требуется внести небольшое изменение в код проекта. Для начала сделаем небольшие правки в файл first.php и воспользуемся для этого редактором nano.
Теперь, мы можем увидеть, что в нашем локальном репозитории, есть измененнные файлы, чье состояние пока что незафиксировано в системе контроля версий Git. Сделаем это при помощи команды:
Данные изменения нужно добавить для фиксации в коммите, при помощи:
В иллюстрации выше видно, что сделанные изменения подготовлены к фиксации в коммите, но нам необходимо сделать это не в новом коммите, а добавить к последнему старому, и мы сделаем это с помощью ключа —amend (в переводе с англ.: изменять, вносить правки).
1 | $ git commit —amend -m»It’s commit 3″ |
В результате применения команды выше, НЕ СОЗДАЕТСЯ новый коммит, а вносятся изменения в последний уже существующий. Убедиться в этом можно применив команду $ git log
Как видно на изображении выше, в результате применения команды $ git commit --amend
изменилось содержимое последнего коммита, о чем свидетельствует изменившийся ХЕШ-коммита, а также изменился последний комментарий коммита. Но без изменений остались дата и время коммита.
Как изменить только комментарий последнего коммита?
Следует стремится к тому, чтобы каждый коммит был логически законченным, поэтому при правильном процессе написания кода такая задача, как внесение правок в код последнего коммита, встречаться должна очень-очень редко. Но вот с чем точно придется столкнуться, так это изменение только комментария к последнему коммиту. Как правило это происходит по причине допущенной опечатки или желания немного по другому описать сделанные изменения в последнем коммите. В этом нам поможет тот-же ключ —amend.
Рассмотрим эту ситуацию на примере выше. Нам необходимо сделать только правку комментария, в этом случае мы сразу воспользуемся командой:
1 | $ git commit —amend -m»Change comment in commit 3″ |
На изображении выше показан результат работы команды, а также вывод полученный при $ git log
для просмотра имеющихся коммитов. Так видно, что изменилось описание
и ХЕШ-сумма последнего коммита, а время и дата остались прежними.
Таким образом для внесения изменений в код или просто только правки комментария используйте ключ —amend. Данный ключ используется для правок в последнем коммите, и настоятельно не рекомендуется к использованию, если этот комит уже запушен в центральный репозиторий.
Как привести в порядок историю ваших коммитов в Git / Блог компании Plarium / Хабр
Публикуем перевод статьи, которую мы нашли на hackernoon.com. Ее автор, Thiago Miranda, пишет о том, как сделать работу с Git более удобной и эффективной.
О некоторых крайне полезных командах в Git
Последний месяц я занимался парным программированием и создал несколько сотен коммитов в Git. В статье я поделюсь самым важным из того, что узнал за это время: расскажу о работе с историей коммитов, об удачных приемах и о том, как реализовать их с помощью десятка команд.
1. Что такое история в Git?
Точный реестр всех коммитов, содержащих произведенные с файлами изменения. В нем вы можете отследить конкретные изменения и время их внесения или сравнить текущую версию с предыдущей. Где посмотреть историю? Введите через Git Bash команду:
git log --oneline
Если у вас слишком много коммитов, вы можете переходить от одного комментария к другому с помощью клавиш со стрелками или клавиш Page Up / Page Down — как и в любом другом файле. Чтобы выйти, нажмите горячую клавишу (q).
2. О комментариях к коммитам
Не пишите бессодержательные комментарии, они должны быть краткими и не требующими пояснений. Их задача — указать, какие изменения вы внесли в код и на что они влияют.
- Как не надо: «Исправлен index.html»
- Как надо: «Улучшена скорость работы навигационной панели»
Давайте посмотрим, для чего это нужно.
Представьте, что вы работаете над таким масштабным проектом, что большую часть занятых в нем специалистов даже не знаете. Вы разрабатываете новую фичу, тестируете ее на своем оборудовании, и все работает отлично.
Но после пуша внезапно все перестает работать, и первое, что вы проверяете — изменения, внесенные за время разработки этой фичи. В логе Git вы находите множество коммитов с комментариями в стиле «исправлен». Вообразите, сколько времени придется потратить на то, чтобы найти нужное!
3. Всегда делайте коммиты
Коммиты, коммиты и еще раз коммиты. Закончили функцию — добавьте коммит, улучшили стиль блочного элемента — добавьте коммит и так далее. В идеале вы должны отправлять коммит при каждом изменении.
Возможно, вы думаете: зачем так много коммитов? Основная причина в том, что ваш новый функционал может вступить в конфликт с чьим-нибудь кодом, но если вы всегда коммитите небольшие изменения, найти их и поправить будет проще. Так вы сэкономите время на отслеживании десятков или сотен строк, измененных в одном и том же коммите.
4. Исправьте последний комментарий к коммиту
Что, если уже после добавления небольшого коммита в ваш локальный репозиторий вы захотели исправить допущенную опечатку или сделать комментарий к коммиту подробнее? Внести изменения довольно просто сделать с помощью команды:
git commit -m “correct message” --amend
Обратите внимание: если вы уже запушили коммит в удаленный репозиторий, эту команду лучше не использовать.
Подробности см. в официальной документации.
5. Объедините последние Х коммитов в один
Ситуация: отправив коммит к новой фиче, вы понимаете, что нужно еще одно небольшое изменение, вносите минимальные правки и снова коммитите… В итоге 5 коммитов об одном и том же. Бывало? Подобные коммиты выбиваются из общего вида вашей истории в Git, но при желании их несложно поправить, применив команду:
git reset HEAD~3
Команда HEAD~3 откатывает 3 верхних коммита, включая самый последний. В этом примере три ваших последних коммита будут стерты из лога, но изменения в коде останутся на месте. Теперь пора посмотреть, какой код нужно закоммитить, для этого вводим команду:
git stage --diff
Вы увидите, что все изменения в коммитах, которые вы убрали из истории, теперь индексированы, так что их можно закоммитить снова, в этот раз в один прием.
Обратите внимание, что HEAD обычно относится к последнему добавленному вами коммиту. Если вы не уверены, сверьтесь с логом Git. Если ваш последний коммит был замержен (не самый распространенный случай), команда HEAD~1 сотрет все коммиты из замерженной ветки. Чтобы узнать больше, посмотрите документацию.
6. Удалите последний коммит с изменениями
Будьте осторожны, так как этот способ сотрет все изменения без возможности откатить. Обычно он используется после экспериментов с кодом, если их результат не соответствует ожиданиям. Я рекомендую сперва попробовать в репозитории-песочнице.
git reset –-hard HEAD~1
Теперь ваш последний коммит удален, как и все соответствующие изменения в коде.
7. Очистите историю своих коммитов
Самый эффективный способ очистить историю коммитов — воспользоваться командой rebase. Будьте осторожны: вы можете удалить коммит, случайно нажав не ту клавишу. Итак, давайте запустим rebase в диалоговом режиме (флаг -i) с помощью команды:
git rebase -i HEAD~5
Как только вы вошли в него, вы увидите список из 5 последних коммитов (HEAD~5) внутри терминала. Все коммиты отсортированы по дате, т. е. наверху будет самый новый (этот список открывается с помощью Vim — текстового редактора Git по умолчанию, позволяющего редактировать текстовые файлы внутри терминала). И здесь же краткая инструкция с несколькими полезными командами. В большинстве случаев вам понадобятся команды squash и reword.
Заменив команду pick командой squash, вы удалите этот коммит из лога, и все изменения в коде будут сгруппированы с последним коммитом, выделенным командой pick.
Если вы хотите откорректировать комментарий, можно заменить команду pick командой reword и переписать комментарий.
Теперь вы можете перейти к следующему окну, где нужно написать один комментарий для группы коммитов, которые вы собираетесь склеить с помощью squash. Чтобы продолжить, нажмите ESC и введите:
:wq!
Двоеточие (:)
необходимо, чтобы показать, что вы хотите передать команду, (w)
— чтобы записать (сохранить) изменения, (q)
— чтобы выйти, а (!)
— чтобы выполнить команду.
Обратите внимание, что каждая группа коммитов получит ваш комментарий. Результат можно проверить в логе Git.
Если по какой-то причине вы покидаете это окно, не завершив операцию, вы можете вернуться в любой момент с помощью команды:
git rebase --edit
Если вы хотите покинуть окно, не сохранив изменения, нажмите клавишу ESC и введите:
:q!
Vim получит команду закрыть файл без сохранения.
8. Управляйте индексацией
Обычно следует отправлять коммиты к одному файлу или к группе связанных файлов. Но как тогда оперативно вносить изменения при индексации?
Скажем, у вас есть 3 файла, и нужно закоммитить только 2 из них. В этом случае можно попробовать следующую команду:
git add .
Теперь удалите из индексации тот файл, который вам не нужен:
git reset -- Readme.txt
И проверьте результат:
git status
Добавьте все файлы из какого-либо расширения, например CSS:
git add *.css
Добавили все по ошибке? Тогда очистите индексацию, воспользовавшись командой:
git reset --
Если вам нужны более сложные операции, можно добавить файлы в индексацию с помощью диалогового режима:
git add -i
Сначала выберите опцию, введя соответствующий номер, например (3), чтобы откатить свои действия.
Выбрав опцию, можно ввести список файлов, которые вы хотите убрать из индексации, один за другим.
Когда завершите, нажмите (Enter).
Добавление файлов происходит по той же схеме. С помощью опции (4) добавьте неотслеживаемый файл.
Чтобы выйти, введите (q)
в меню опций.
9. Вывод
Главное, что нужно сделать перед пушем в удаленный репозиторий и особенно перед мержем вашей ветки, — убедиться в том, что вы привели в порядок историю коммитов. Как только вы запушите все в удаленный репозиторий, уже ничего поправить нельзя.
Хотите узнать больше о парном программировании и начать работать удаленно? Загляните на Microverse.org.
Git — Book
2nd Edition (2014)
Download Ebook
The entire Pro Git book, written by Scott Chacon and Ben Straub and published by Apress, is available here. All content is licensed under the Creative Commons Attribution Non Commercial Share Alike 3.0 license. Print versions of the book are available on Amazon.com.>
- 1.1
О системе контроля версий - 1.2
Краткая история Git - 1.3
Основы Git - 1.4
Командная строка - 1.5
Установка Git - 1.6
Первоначальная настройка Git - 1.7
Как получить помощь? - 1.8
Заключение
- 1.1
- 2.1
Создание Git-репозитория - 2.2
Запись изменений в репозиторий - 2.3
Просмотр истории коммитов - 2.4
Операции отмены - 2.5
Работа с удалёнными репозиториями - 2.6
Работа с метками - 2.7
Псевдонимы в Git - 2.8
Заключение
- 2.1
- 3.1
О ветвлении в двух словах - 3.2
Основы ветвления и слияния - 3.3
Управление ветками - 3.4
Работа с ветками - 3.5
Удалённые ветки - 3.6
Перебазирование - 3.7
- 3.1
Как я могу отменить последнюю фиксацию?
Во-первых, прежде чем мы принесем большие пушки, давайте убедимся, что они вам действительно нужны. Потому что в случае, если вы просто хотите отредактировать свой последний коммит, вы можете просто использовать функцию Git изменить . Это позволяет вам исправить сообщение последнего коммита, а также добавить в него дополнительные изменения. Если это то, что вы хотите сделать, узнайте больше об изменении.
Шпаргалка по Git
Не нужно запоминать все эти команды и параметры: получите нашу популярную «Шпаргалку по Git» — бесплатно!
Отмена последней фиксации
Однако, конечно, существует масса ситуаций, когда вы действительно хотите отменить последнюю фиксацию.Например. потому что вы хотите его радикально реструктурировать — или даже вообще отказаться от него!
В этих случаях команда «сброса» — ваш лучший друг:
$ git reset - мягкая ГОЛОВКА ~ 1
Reset перемотает текущую ветку HEAD к указанной ревизии. В нашем примере выше мы хотели бы вернуться к версии перед текущей ревизией , фактически отменив нашу последнюю фиксацию.
Обратите внимание на флаг —soft: это гарантирует, что изменения в отмененных ревизиях сохранены.После выполнения команды вы обнаружите, что изменения в вашей рабочей копии являются незафиксированными локальными модификациями.
Если вы не хотите сохранять эти изменения, просто используйте флаг —hard. Обязательно делайте это только тогда, когда уверены, что эти изменения вам больше не нужны.
$ git reset --hard HEAD ~ 1
Если вы используете клиент Tower Git, вы можете просто нажать CMD + Z , чтобы отменить последнюю фиксацию:
Вы можете использовать то же простое сочетание клавиш CMD + Z для отмены многих других действий, от неудачного слияния до удаленной ветви!
Отмена нескольких фиксаций
Тот же метод позволяет вернуться к любой предыдущей версии:
$ git reset --hard 0ad5a7a6
Однако всегда помните, что использование команды сброса отменяет все коммиты, которые произошли после того, к которому вы вернулись:
Узнать больше
.
Как удалить неопубликованные коммиты git?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
git — Удалить коммит на gitlab
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
Git — удалить фиксацию из истории
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.