1. Переименовываем локальную ветку

Если вы сделали опечатку, когда вводили имя ветки, вам поможет вот такая команда.

// Примечание: опустите символы < и >, а слова разделите дефисом (-)

git branch -m <new_name>
eg:- git branch -m new-new-branch

2. Изменяем upstream-ветку

Эта команда позволяет отправить локальную ветвь в новую удаленную ветку.

git push origin -u <new_name>

3. Приводим локальную ветку в соответствие с удаленной

Иногда внесешь массу изменений в локальную ветку, а в итоге понимаешь, что от них стало только хуже. Знакомо? Не переживайте, с этим многие сталкивались. В такой ситуации вам поможет вот эта команда.

// замените staging именем ветки, до которой хотите сбросить

git reset --hard origin/staging

4. Удаляем последний коммит с сохранением сделанной работы

Удивительно, как мало программистов знают об этой команде. Она помогает избавиться от глупых опечаток, которые иногда закрадываются в коммиты.

git reset --soft HEAD~1

5. Удаляем последний коммит вместе со сделанной работой

Используйте эту команду, если напортачили по полной. Не переживайте — не ошибается лишь тот, кто ничего не делает.

git reset --hard HEAD~1

6. Откладываем изменения

Если вам нужно поработать с другой веткой, но вы не хотите коммитить изменения в текущей, вам пригодится команда stash.

git stash

7. Восстанавливаем отложенные изменения: возвращаемся к ветке и используем команду...

git stash apply

Имейте в виду, что команда 

git stash apply

не удаляет запись из списка отложенных командой stash. Если вы хотите восстановить работу и сразу удалить ее из списка, используйте команду 

git stash pop

8. Возвращаемся к предыдущему коммиту, отменяем перебазирование

Ошибки при перебазировании (rebase) — обычное дело. Если вы допустили такую ошибку, вам помогут команды ниже. Используйте reflog, чтобы найти указатель HEAD нужного коммита.

// Сначала найдите нужный указатель HEAD

git reflog 

// Замените 5 на нужный вам номер указателя HEAD 
// Будьте очень внимательны, не перепутайте номера

git reset --hard "HEAD@{5}"

Материал подготовлен в рамках курса "PHP Developer. Basic".

Всех желающих приглашаем на двухдневный интенсив «Пишем форму авторизации с нуля». На интенсиве мы:
- Сверстаем форму регистрации по макетам;
- Научимся работать с позиционированием, шрифтами, флексбоксами- Напишем обработчик формы регистрации с сохранением данных в БД и их валидацией;
- Сделаем страницу для просмотра зарегистрированных пользователей.


РЕГИСТРАЦИЯ

Комментарии (28)


  1. CrazyAlex25
    14.07.2021 16:49
    +4

    Да, reset`ом частенько пользуюсь, полезно.


    Наверное каждый кто только начинал работать с git следовали другими командами:


    • скопировать папку с репозиторием куда-нибудь
    • удалить исходную папку
    • git clone ...
    • вернуть изменения с помощью copy-paste



  1. Sklott
    14.07.2021 17:05
    +7

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

    От глупых опечаток в коммите помогает избавиться команда "git commit --amend". А такой ресет часто полезен когда надо слить 2 или более коммитов на одной ветке в один.

    А вместо экзотической "git reset --hard HEAD~1" проще использовать обычный checkout, если конечно workspace чистый... Гораздо чаще используется команда "git reset --hard HEAD" чтобы как-раз этот workspace почистить от изменений. Ну "git clean" с флажками по вкусу тоже иногда бывает нужен.


    1. kukovik
      14.07.2021 18:37
      +4

      Про аменд соглашусь, но вот слить несколько коммитов в один лучше через "git rebase -i ...", а не через reset --soft. Тем более это совсем не обязательно нескольо последних коммитов.

      Про то, что проще использовать обычный checkout не соглашусь. Проще запомнить, что "git reset --hard COMMIT" гарантированно приводит рабочее пространство к определенному состоянию, а запоминать разные способы уже как бы лишнее. Тем более вы не противник ресета, а просто ограничиваете область его применения.


      1. kay
        15.07.2021 10:26
        +1

        Часто пользуюсь `rebase -i`. Он не только слить коммиты может, но и отредактировать комментарий, изменить порядок коммитов, удалить определенный коммит, squash и многое другое.

        Еще одна команда, которая недооценена - `cherry-pick`.


    1. fshp
      14.07.2021 19:21
      +1

      checkout на коммит сделает "detached head", а ветку не тронет.


  1. gohan
    14.07.2021 20:39
    +3

    Что делать, если удалённая ветка оказывается удалённой?

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


    1. Balling
      14.07.2021 22:51
      +1

      git branch --set-upstream-to=upstream/foo foo

      git fetch upstream


  1. Zamuka
    14.07.2021 20:55
    +1

    стешить стоит и с новыми файлами

    git stash --include-untracked

    которые не удаляет git reset --hard

    но можно удалить их

    git clean -df

    предварительно проверив, ничего ли лишнего не удаляем с помощью

    git clean -dfn


    1. senatus
      19.07.2021 01:18

      Вроде как последняя удаляет всё, что не относится к репозиторию. Потому будьте осторожны. У нас сторонние библиотеки, которые собираются с бубном, лежат как директория в проекте (помечена как игнорируемая). И вот такая команда почистила и их. Собирал неделю потом. Приходится, когда нет никого с такой же архитектурой процессора.


      1. Sklott
        19.07.2021 18:53

        Вообще-то нет. Чтобы почистились игнорируемые файлы надо еще добавить ключ -x.


  1. Balling
    14.07.2021 22:53

    Полезная команда для обновления git clone --mirror репозиториев. Там git pull не работает.

    git remote update


  1. tarekd
    14.07.2021 22:53
    +4

    ожидал увидеть git bisect, по факту git reset и git stash растянуты на 5 команд


  1. saidelman
    14.07.2021 23:14

    Кажется, хаб PHP стоит поменять на хаб Git


  1. titbit
    14.07.2021 23:27
    +1

    Для новичков может быть полезной git push --dry-run — она позволяет эмулировать push не производя никаких действий, помогает получить уверенность в своих действиях и/или проверить все ли правильно настроено и сделано перед собственно push'ем. Если все прошло гладко, можно убрать --dry-run.


  1. aamonster
    15.07.2021 00:55

    3-5 доставили.

    3 – "как я в первый раз сломал git репозиторий" (hg не ломался вообще, а тут в первую же неделю). Не надо этому учить новичков. Пусть вначале разберутся с reflog... А тогда они уже сами будут знать про reset --hard.

    Вообще git reset – это как во времена DOS файлы Disk Editor-ом восстанавливать... Можно восстановить, а можно всё сломать. А может оказаться, что уже и не восстановить (gc прошёл).


  1. ciubotaru
    15.07.2021 03:37
    +2

    Отменить перебазирование

    git rebase --abort


  1. mSnus
    15.07.2021 05:38
    -1

    Как вообще всё это можно выучить, если постоянно этим не пользуешься?((


    1. fshp
      15.07.2021 10:15
      +2

      Не нужно учить. Нужно прочитать документацию/книгу что бы иметь общее представление о возможностях. Что бы знать что гуглить.

      А вот когда они понадобятся, вот тогда уже разбираться.


    1. JustDont
      15.07.2021 13:04

      Использовать GUI, чтоб ничего не учить, очевидно. И даже не гуглить.


      1. fshp
        16.07.2021 07:56

        Покажите мне хотя бы один gui, который может например смержить 3 ветки через octopus?

        Я думаю вы даже не слышали о таком. Да и не услышите, пока продолжаете пользоваться gui.


        1. JustDont
          16.07.2021 09:09

          Если вы запускаете octopus вручную на машине разработчика — у вас очень насыщенная и интересная жизнь. С такой жизнью не до GUI, конечно.


          1. fshp
            16.07.2021 09:28

            Вот видите, вы даже не поняли о чем речь. Я не про сервис для деплоя. Я про мерж-стратегию говорю, коих в гите штук 20 есть.
            Собрать монорепозиторий с сохранением истории? Пожалуйста - subtree.
            Удалить секреты при публикации проекта? Пожалуйста - filter-branch.
            И куча всего, о чем в GUI нет даже упоминания.
            Мне приходилось за 10 лет 2 раза использовать subtree merge. Но я бы и не подумал что это вообще возможно, если б не вычитал в книге. Я бы просто грохнул всю историю, копипастнув код.

            На картинке octopus merge. У коммита 4 родителя.


            1. JustDont
              16.07.2021 09:44

              Вот видите, вы даже не поняли о чем речь.

              Пардон, не владею телепатией.


              Я про мерж-стратегию говорю, коих в гите штук 20 есть.

              Всё еще не подразумевает необходимость сливания многих веток на машине разработчика. Для этого есть пулл реквесты и CI.
              Ну и не говоря уж о том, что Git Extensions это прекрасно делает. Из GUI.


              Собрать монорепозиторий с сохранением истории? Пожалуйста — subtree.

              Это определенно то, что надо знать, ага.
              За 12 лет работы с гитом это мне пригодилось ровно 0 раз, хотя прочитал об этом я в рамках начального погружения в git.


              Удалить секреты при публикации проекта? Пожалуйста — filter-branch.

              Секреты сразу не надо хранить, это во-первых. А во-вторых — я считаю filter-branch откровенно небезопасной вещью, и совершенно правильно, что её нет в нормальных GUI.


              И куча всего, о чем в GUI нет даже упоминания.

              С примерами у вас, правда, не очень задалось. Но я конечно вам и так поверю — куча так куча.


        1. DaneSoul
          16.07.2021 10:06

          Покажите мне хотя бы один gui, который может например смержить 3 ветки через octopus?
          Почему бы просто не заменить такую экзотику на два последовательных слияния?


          1. fshp
            16.07.2021 10:12

            Это было выбрано лишь для наглядности.


  1. shaggyone
    15.07.2021 06:50

    Ключ -p для всех команд, которые его поддерживают.

    p.s. Надо бы сваять бота, который бы оставлял подобные комментарии в то и дело появляющихся постах про команды git.


  1. fishHook
    15.07.2021 09:01
    +6

    Опять каждый программист кому-то что-то задолжал. Какие долги навесили за последние пару недель? Каждый программист должен использовать <вот эти команды> bash, знать <вот эти команды> vim, <вот эти команды> git… Вот прям должен! Какая-то, товарищи авторы постов, у вас творческая импотенция. Очень это напоминает кликбейтные статьи на говноресурсах аля «Десять способов борьбы с похмельем» или «Как похудеть на 12 килограмм всего за четыре дня». Нижеплинтусный шлак, одним словом