Шпаргалка по GIT

Все команды не упомнишь...

Итак, ты всё сломал, и чё теперь делать?

*ля, я накосячил, где у git волшебная машина времени?!

git reflog
# вы увидите список всего,
# что сделали в git, во всех ветках!
# у каждого элемента есть индекс HEAD@{индекс}
# найдите тот, перед которым всё сломалось
git reset HEAD@{index}
# волшебная машина времени

*ля, я закоммитил и вспомнил, что кое-что забыл!

# сделайте своё изменение
git add . # или добавьте файлы по отдельности
git commit --amend --no-edit
# теперь ваш последний коммит содержит это изменение!
# ПРЕДУПРЕЖДЕНИЕ: никогда не меняйте опубликованные коммиты!

Также можно сделать изменения в новом коммите и использовать rebase -i чтобы склеить оба коммита вместе, но так в миллион раз быстрее.

*ля, мне нужно изменить сообщение моего последнего коммита!

git commit --amend
# открывает редактор для смены сообщения

Ё*аные требования по наименованию.

*ля, я случайно закоммитил что-то в мастер, хотя это должно быть в новой ветке!

# создаст новую ветку из текущего состояния мастера
git branch какое-то-имя-новой-ветки
# удалит последний коммит из мастера
git reset HEAD~ --hard
git checkout какое-то-имя-новой-ветки
# ваш коммит теперь живёт в этой ветке :)

это не будет работать, если вы уже отправили коммит в удалённую ветку, и если вы пробовали сделать это как-то по-другому, может помочь

git reset HEAD@{количество-коммитов-назад}

вместо HEAD~.

*ля, я случайно закоммитил не в ту ветку!

# отменяет последний коммит, но оставляет изменения доступными
git reset HEAD~ --soft
git stash
# переключиться на нужную ветку
git checkout имя-нужной-ветки
git stash pop
git add . # или добавьте отдельные файлы
git commit -m "ваше сообщение здесь"
# теперь ваши изменения на нужной ветке

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

git checkout имя-нужной-ветки
# скопировать последний коммит из мастера
git cherry-pick master
# удалить из мастера
git checkout master
git reset HEAD~ --hard

*ля, мне нужно отменить коммит, который был 5 коммитов назад!

# найдите коммит, который нужно отменить
git log
# используйте стрелочки, чтобы прокрутить историю
# сохраните хеш нужного коммита
git revert [сохранённый хеш]
# git создаст новый коммит, отменяющий выбранный
# отредактируйте сообщений коммита
# или просто сохраните
Также можно отменить только один файл вместо целого коммита! Но конечно, (как всегда у git'a) это совершенно другой набор чёртовых команд...

*ля, мне нужно отменить изменения в файле!

# найти хеш коммита, до которого нужно откатиться
git log
# используйте стрелочки, чтобы прокрутить историю
# сохраните хеш нужного коммита
git checkout [сохранённый хеш] -- путь/к/файлу
# старая версия файла окажется в вашем индексе
git commit -m "Ого, теперь не придётся копипастить, чтобы отменить изменения!"
Также можно отменить только один файл вместо целого коммита! Но конечно, (как всегда у git'a) это совершенно другой набор чёртовых команд...

*ля, мне нужно зазеркалить репозиторий!

# заберите старый репозиторий
git clone https://some.github.url/чёртов-репозиторий-git.git
# поменяйте ему урл на новый
git remote set-url --push origin https://some.github.url/новый-репозиторий-git.git
# синхронизируйте изменения
git fetch -p origin
git push --mirror
# теперь ваши изменения на новом репозитории

На*уй всё, я сдаюсь.

# получить последнее состояние origin
git fetch origin
git checkout master
git reset --hard origin/master
# удалить неиндексированные файлы
git clean -d --force
# повторить checkout/reset/clean для каждой испорченной ветки

По мотивам https://ohshitgit.com/ru