Git Outta Trouble

Если вы выберетесь в лес с Git, обычно есть способ вернуться. Вот несколько уловок из командной строки, которые помогут вам вернуться к следу.

Аутентификация

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

$ git push
info: please complete authentication in your browser...
Everything up-to-date

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

Старый метод аутентификации предполагал ввод имени пользователя и пароля при вводе команды:

$ git push
Username for 'https://github.com':

Если это произойдет, значит, ваш репозиторий еще не обновлен по-новому. Если вы используете такой хост, как GitHub, ваш репозиторий уже должен быть настроен для использования токена.

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

$ git config credential.helper store
$ git push
Everything up-to-date

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

Отредактировано в неправильной ветке

Вы редактировали файл не в той ветке. Что вы хотите сделать, так это отменить эти изменения, переключить ветви, а затем повторить их. На самом деле, было бы даже лучше снять эти изменения с неправильной ветки, аккуратно положив их поверх ветки, в которой вы собирались находиться. К счастью, Git предоставляет команду под названием stash, которая делает именно это.

Если вы не только отредактировали, но и совершили ошибку, сначала отмените фиксацию изменений (см. «Совершено по ошибке» выше), прежде чем переходить к следующим шагам.

  1. Убедитесь, что вы находитесь в правильном каталоге.
  2. Используйте git status, чтобы проверить, в какой ветке вы находитесь. При необходимости перейдите в ветку, в которой вы ошибочно редактировали файл. Например:
    $ git checkout the-wrong-branch
    Switched to branch ‘the-wrong-branch’
  3. Сохраните незафиксированные изменения:
    $ git stash
  4. Переключитесь на ветку, в которой вы хотели бы работать:
    $ git checkout -b the-wrong-branch
    Switched to branch ‘the-wrong-branch’
  5. Используйте stash pop, чтобы применить там изменения:
    $ git stash pop

Отредактировал неправильный файл

Вы открыли файл, чтобы посмотреть на него, но затем ваш кот прошел по клавиатуре.

Вы не знаете, что было добавлено или удалено. Вы просто хотите вернуться к тому, как все было при последней фиксации. Для этого используйте checkout - это не только для переключения ветвей!

  1. Убедитесь, что вы находитесь в правильном каталоге.
  2. Используйте git status, чтобы проверить, в какой ветке вы находитесь. При необходимости переключитесь на ветку, в которой возникла проблема. Например:
    $ git checkout the-branch
    Switched to branch ’the-branch’
  3. Используйте git status, чтобы увидеть, какие файлы были случайно изменены. Например:
    $ git status
    On branch main
    Changes not staged for commit:
    (use “git add <file>…” to update what will be committed)
    (use “git checkout — <file>…” to discard changes
    in working directory)

    modified: dont-change-this.md
  4. Используйте git checkout -- <file>, чтобы отменить изменения. Например:
    git checkout -- dont-change-this.md

Вывод команды git status говорит вам, как использовать git checkout таким образом.

Конфликт слияния

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

Когда вы открываете файл, конфликт слияния выглядит так:

<<<<<<< HEAD
Some content that was changed by one person
=======
Other content that someone else changed
>>>>>>> 9af9d3b

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

Все, что вам нужно сделать, это решить, какую версию контента вы хотите сохранить, а затем удалить маркеры конфликта слияния (<<<<<<<, =======, #>>>>>>>).

После того, как вы таким образом внесете все изменения, просто зафиксируйте еще раз.

Постановка по ошибке

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

  1. Убедитесь, что вы находитесь в правильном каталоге.
  2. Используйте git status, чтобы проверить, в какой ветке вы находитесь. При необходимости переключитесь на ветку, в которой возникла проблема. Например:
    $ git checkout the-branch
    Switched to branch ‘the-branch’
  3. Используйте git status, чтобы увидеть, какие файлы были случайно изменены. Например:
    $ git status
    On branch main
    Changes to be committed:
    (use “git reset HEAD <file>…” to unstage)

    renamed: README.md -> README
    modified: dont-commit-this.md
  4. Используйте git reset, чтобы удалить файл из следующего коммита. Например:
    $ git reset HEAD dont-commit-this.md

В выходных данных команды git status рассказывается, как использовать reset для отмены постановки изменений.

Совершено по ошибке

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

  1. Убедитесь, что вы находитесь в правильном каталоге.
  2. Используйте git status, чтобы проверить, в какой ветке вы находитесь. При необходимости перейдите в ветку, в которой вы ошиблись. Например:
    $ git checkout the-wrong-branch
    Switched to branch ‘the-wrong-branch’
  3. Используйте git reset, чтобы отменить фиксацию изменений:
    git reset HEAD~ --soft

При желании вы можете повторно зафиксировать изменения позже.

Если вы хотите сначала переместить изменения в другую ветку, вы можете использовать git stash (см. «Отредактировано в неправильной ветке» ниже).

Подталкивается ошибкой

Если вы совершили фиксацию по ошибке, ваша ошибка теперь доступна другим людям. К счастью, есть способ «отменить» толчок.

Может быть полезно войти на хост git, чтобы увидеть, что на самом деле было отправлено.

Отменить плохой толчок

Вот шаги, чтобы исправить плохой толчок:

  1. Используйте git log, чтобы показать список последних коммитов и определить тот, который вы нажали по ошибке. Параметр --oneline упрощает чтение списка. Список отсортирован от самого нового к самому старому. Пример:
    $ git log --oneline
    d9fa1d2 (HEAD -> master, origin/master, origin/HEAD) This commit is a mistake!
    d555f66 Committing some lovely changes
  2. Используйте git revert и номер фиксации (или хэш), чтобы создать новую фиксацию, которая отменяет все действия в плохой фиксации. Пример:
    $ git revert d9fa1d2
  3. Появится экран, на котором вы можете ввести сообщение фиксации или просто оставить сообщение по умолчанию. Сохранение и выход зависят от того, какой редактор Git настроен для использования.
    - Если вы видите двоеточие внизу экрана, вы, вероятно, используете vi или Vim. Введите wq и нажмите клавишу ВВОД.
    - Если вы видите список команд внизу экрана, вы, вероятно, используете Nano. Нажмите Control-o, затем Control-x.
  4. Вы можете использовать git status, чтобы увидеть, что у вас есть новый коммит, готовый к отправке:
    $ git status
    On branch master
    Your branch is ahead of ‘origin/master’ by 1 commit.
    (use “git push” to publish your local commits)
  5. Подтвердите фиксацию с помощью команды git push:
    $ git push

Это касается исправления репо. Любой, кто потянет, теперь получит всю историю, включая ошибку и исправление, и все будет в порядке с миром.

Эта операция оставляет все как было до внесения вами ошибочно внесенных изменений. Другими словами, ваши файлы будут выглядеть так, как они выглядели после того, как вы совершили «Фиксация некоторых прекрасных изменений», и вся работа, которую вы проделали в «Эта фиксация является ошибкой», была отменена.

Получить изменения из старого коммита

Если вы хотите получить изменения, чтобы снова поработать над ними, вернитесь к старой фиксации (например, d9fa1d2) и сохраните их:

  1. Используйте git checkout, чтобы проверить старую фиксацию. Пример:
    $ git checkout d9fa1d2
  2. Выполните программный сброс, который отменяет все изменения:
    $ git reset — soft HEAD~1
  3. Если хотите, вы можете использовать git status, чтобы увидеть, какие незафиксированные изменения у вас есть.
  4. Используйте git stash, чтобы сохранить изменения.
  5. Используйте git checkout, чтобы снова проверить HEAD ветки. Если вы работали в основной ветке, используйте git checkout main:
    $ git checkout main
    Previous HEAD position was d555f66 Committing some lovely changes
    Switched to branch ‘main’
    Your branch is up to date with ‘origin/main’.
  6. Используйте git stash pop, чтобы применить изменения.

Вы можете продолжить работу над изменениями, а затем зафиксировать и нажать, когда будете готовы.

Более…

Обновление: я подумал, что Git не обязательно должен быть сложным, может быть достаточно интересной темой, чтобы написать об этом целую книгу. "Так я и сделал":

Если у вас нет времени прочитать книгу целиком, вы можете вместо этого посмотреть небольшой видеоролик: