Last active
October 22, 2019 12:38
-
-
Save aleksb86/b311af3e7d63554d3474716d4931e318 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Получить последний коммит: 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