Я многое узнал о git, обычно в спешке после того, как запутался и должен был это исправить. Вот некоторые основные приемы, которые я изучил, которые могут помочь новичку в git.
Исправление вашего плохого кода
Допустим, вы клерк, работающий в министерстве правды Оруэлла, и вы узнаете, что новый шоколадный рацион составляет 20 граммов. Вы посмотрите на транскрипт выпусков новостей, newscast.txt , который гласит:
… и в других новостях министерство изобилия объявило, что шоколадные рационы будут оставаться стабильными на уровне 40 граммов в предстоящем квартале …
Ну, это не подойдет. Мы модифицируем расшифровку транскрипта, чтобы сказать:
… и в других новостях Министерство изобилия объявило, что шоколадные пайки будут сокращены до 20 граммов в следующем квартале …
И мы обязуемся:
$ git add newscast.txt $ git commit -m "Fixed chocolate ration" [master 9772a49] Fixed chocolate ration 1 files changed, 1 insertions(+), 1 deletions(-)
Когда ты собираешься толкнуть, твой начальник, который завис, кричит: «Ты хочешь быть безличным? Не говори, что они понизили рацион!
Итак, мы изменим файл снова:
… и в других новостях Министерство изобилия объявило, что шоколадные пайки будут увеличены до 20 граммов в следующем квартале …
Теперь мы добавим это изменение, как будто мы собираемся сделать новый коммит:
$ git add newscast.txt $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: newscast.txt #
Запуск git commit —amend подметает все в нашей промежуточной области в последний коммит:
$ # this opens your text editor, in case you want to change the message $ git commit --amend [master 04ce65d] Fixed chocolate ration 1 files changed, 1 insertions(+), 1 deletions(-)
Теперь у вас есть только один коммит с «правильными» изменениями.
Мы всегда были в состоянии войны с Eastasia
Иногда ваша ошибка настолько серьезна, что вы даже не хотите, чтобы она больше существовала в истории хранилища. Если вы еще не нажали, вы можете использовать git reset, чтобы переписать любую историю, которая произошла после данного коммита.
Допустим, мы что-то напутали и хотим вернуться к 72ecbbda47c0712846312849bab1fb458cd9fffb:
$ git reset --hard 72ecbbda47c0712846312849bab1fb458cd9fffb
И вы вернулись к 72ecbbda47c0712846312849bab1fb458cd9fffb, как и то, что никогда не происходило.
git reset не только хорош для истории ревизионистов, но и хорош, когда у вас конфликт слияния, некоторые удаленные файлы, странная вещь с ветками, и вы даже не знаете, что происходит: вы просто хотите вернуться домой. Хард ресет может избавить вас почти от любой проблемы.
Тем не менее, после того, как вы нажали, сброс не является вариантом. Если вы сбросите общедоступное репо в «реальном» проекте, вы останетесь без посторонней помощи, так что ваша голова будет крутиться.
Когда вы уже столкнулись с преступным мышлением
Допустим, вы допустили ошибку (как указано выше), но уже отправили в удаленный репозиторий. Теперь вы должны либо исправить коммит, либо удалить его.
В приведенном выше примере это достаточно легко исправить: замените «разрезать шоколадный рацион» на «поднял шоколадный рацион», и все готово, так что вы можете просто нажать новый коммит с исправлением.
Однако иногда исправление занимает больше времени (например, вам нужно исследовать правдоподобную историю, чтобы объяснить несоответствия). Вы не хотите, чтобы кто-то запутался в это время, поэтому, если вы не можете сразу исправить историю, вы должны вежливо от нее отказаться. Это где Git Revert приходит.
Сначала найдите хеш коммита, который вы хотите отменить.
$ git log -1 # -1 means only show the latest 1 commit commit 72ecbbda47c0712846312849bab1fb458cd9fffb Author: Kristina <[email protected]> Date: Thu Feb 23 09:07:58 2012 -0500 Airplane was now invented by the Party
Теперь вернем этот хеш:
$ git revert 72ecbbda47c0712846312849bab1fb458cd9fffb
В вашем редакторе появится git revert, и вы можете, если хотите, связываться с сообщением об отмене.
Changing airplane's invention date is going to take more work than anticipated This reverts commit 72ecbbda47c0712846312849bab1fb458cd9fffb. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: newscast.txt #
Сохраните, выйдите и нажмите на удаленное хранилище.
$ git revert 72ecbbda47c0712846312849bab1fb458cd9fffb [master 84e6f13] Changing airplane's invention date is going to take more work than anticipated 1 files changed, 0 insertions(+), 1 deletions(-)
Вы можете отменить любой коммит из любого времени в истории. Обратите внимание, что это создает «uncommit» в дополнение к исходному коммиту: по сути, это создает «противоположный diff» для отмены исходного коммита. Таким образом, оригинальный коммит все еще там.
Невежество — это сила, но на всякий случай …
Некоторые ресурсы, которые вы можете найти полезными при изучении git:
- git gui: неоценим для постановки коммитов
- gitk: легче читать, чем git log при изучении истории коммитов
- GitReady : самый полезный сайт, который я нашел для рецептов общих задач.
И помните, используйте полное предложение, описывающее ваши изменения в сообщениях коммитов. Большой Брат смотрит.