Skip to content

Instantly share code, notes, and snippets.

@aleksb86
Last active October 22, 2019 12:38
Show Gist options
  • Save aleksb86/b311af3e7d63554d3474716d4931e318 to your computer and use it in GitHub Desktop.
Save aleksb86/b311af3e7d63554d3474716d4931e318 to your computer and use it in GitHub Desktop.
Получить последний коммит: git log --name-status HEAD^..HEAD
Получить N последних коммитов: git log -n <число коммитов>
NB! Удалить все локальные коммиты до указанного: git reset --hard <sha-1 коммита, ДО которого нужно откатиться> (операция необратима)
Откатить отдельный файл к предыдущему коммиту: git checkout 59a89329038f6a5be7e2b2dba4e45e0b6c465ea2 -- core/app/models/core/bpe/tasks/send_exemplars.rb
Откатить все к предыдущему коммиту: git checkout <sha-1 of that commit>
git checkout <хэш коммита, к которому надо откатиться> -- <путь к файлу>
Выкинуть измененный файл из стейджа: (по сути, операция обратная git add) git reset <путь к файлу>
Спрятать изменения: git stash (посмотреть список спрятанных изменений: git stash list)
Вернуть спрятанные изменения: git stash pop (под определенным номером: git stash pop stash@{номер стэша})
Отменить последний (незапушенный) коммит: git reset HEAD~1 (1 - кол-во коммитов, которые надо отменить)
Что делать, если коммит попал в неправильную ветку локального репозитория?
NB! если правильная ветка содержит незакомиченные изменения, нужно сделать stash, чтобы не потерять их. NB!
- выполнить git reset HEAD~1 (отменить 1 последний коммит) в "неправильной" ветке (той, откуда мы не собираемся пушить).
- переключиться на правильную ветку (checkout <user name>).
- добавить изменения и выполнить коммит.
Что делать, если коммит ошибочно запушен в удаленный репозиторий (решение сносит удаленный и локальный коммит)?
NB! рассматривается ситуация, пока не создан мердж реквест.
- git reset HEAD~1 (возвращаем локальные изменения на 1 коммит назад)
- git push -f origin <название ветки>
Посмотреть изменения в одном коммите: git show <хэш коммита>
Посмотреть изменения в диапазоне коммитов (между x и y): git diff <хэш коммита x>^ <хэш коммита y>
Получить n последних коммитов: git log -n
Сохранить именованный стэш: git stash save "имя"
Удалить файл "случайно" добавленный в индекс (NB: файл будет удален физически): git rm -f <file name>
Посмотреть изменения в стэше: git stash show -p (или git stash show -p stash@{1} (выборочно для конкретного стэша))
Добавить все измененные файлы, кроме указанного (к примеру, Gemfile.lock): git add -u && git reset -- Gemfile.lock
Ревертнуть запушенный коммит:
- сделать git revert <commit hash> (с хэшем коммита, который нужно отменить)
- разрешить конфликты (поправить затронутые файлы), git add <files>
- git revert --continue
- git amend
- git push origin boev
Сменить URL удаленного репозитория: git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
(Посмотреть текущие origin: git remote -v)
Узнать, какие изменения будут отправлены при пуше:
git diff --stat --cached origin/boev
Если коммит в мерджреквесте требуется перенести в другую ветку (допустим, что локально изменений нет, находимся в ветке, откуда нужно переносить):
git fetch
git reset <ID коммита, кот нужно перенести>
git reset HEAD~1
git checkout -- . (потребуется т.к. наверняка будут открытые изменения)
git cherry-pick <ID !своего! коммита, который необходимо сохранить> (берет изменения и применяет их заново, поверх текущей ветки) - повторить для всех коммитов, которые требуется сохранить
git rm -rf <файл с изменениями> - возможно потребуется выполнить, если в ветке будет список "чужих" изменений
git status - убедиться, что незакомиченных изменений нет
git pull origin master
git checkout <new_branch> - перейти на ветку, в которую требуется поместить коммит
git cherry-pick <ID коммита, который необходимо переместить>
git log -N - убедиться в наличии коммита, который необходимо переместить. N - позиция коммита, в случае, если он не первый в логе.
git show <ID коммита, который необходимо переместить> - посмотреть его содержимое (на всякий случай)
git pull origin <new branch> - отправить изменения в отдельную ветку
git checkout boev - вернуться в ветку, ОТКУДА перенесен коммит
git push -f origin boev - принудительный пуш тех коммитов, кот находились выше в истории, чем перенесенный.
Если имеются изменения в удаленной ветке, а git pull их не привозит. Возможно поможет принудительное переписывание локальной ветки последним коммитом из удаленной ветки. (NB! Решение приносит необратимые изменения из-за reset --hard):
git fetch origin master
git reset --hard FETCH_HEAD
git clean -df
Если нужно удалить N коммитов перед последним то:
git log -N (получить коммиты до уровня отмены) NB! беречь этот список
git reset --hard HEAD~N (удалить изменения до уровня отмены)
git cherry-pick <хэш коммита, который надо сохранить> (возможно коммитОВ)
локально все готово
если требуется запушить удаленно, то:
git push -f origin <ветка>
Если (не дай Бог) сделал stash clear, а стэш потребовался:
NB! Способ не гарантированный - сработает только если недоступный фрагмент не был перезаписан.
1. Узнать хэш стэша (вот такого вида: "WIP on rspec-boev: e0fe24b"), если узнать нельзя (например не осталось вывода команды stash в открытом терминале), то нужно ориентироваться только по дате стэша.
2. git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk --grep=WIP
3. Если вывелся список, то разыскать в нем нужный стэш (они выглядят как коммиты в логе, только с пометкой WIP)
4. git stash apply <длинный хэш> для нужного стэша
А теперь хинты для взрослых!:
Получение разницы в коммитах между ветками:
git log <branch1>..<branch2> # покажет коммиты, имеющиеся в branch2, но отсутствующие в branch1
пояснения к двум следующим пунктам: https://stackoverflow.com/a/29916361/4288922
Изменение "родителя" для ветки (коммита):
(rebase with two arguments)
(находимся на ветке, где происходит перемещение) git rebase --onto <oldparent> <newparent>
Изменение "родителя" для диапазона коммитов:
(rebase with three arguments)
(находимся на ветке, где происходит перемещение) git rebase --onto <oldparent> <newparent> <range>
Посмотреть историю для диапазона строк файла (см. пример - изменения 155 строки):
git log --pretty=short -u -L 155,155:<файл с нужными строками>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment