To include in what will be committed перевод

To include in what will be committed перевод

Отмена изменений в рабочей директории — Введение в Git

Одна из ключевых возможностей Git — «откат» любых сделанных изменений буквально одной командой. Такое практически невозможно сделать без использования системы контроля версий. Только если помнить все изменения наизусть. В этом уроке мы поговорим про откат изменений, которые сделаны в рабочей директории, но ещё не попали в коммит.

Важно! Откат незакоммиченных изменений безвозвратен. Не существует никакой физической возможности получить эти изменения обратно, поэтому будьте крайне осторожны.

Неотслеживаемые файлы

Самая простая ситуация. Вы добавили новые файлы в репозиторий (или сгенерировали их как-то) и поняли, что они вам не нужны. В этом случае можно выполнить очистку:

Забавный факт: про эту команду знает не так много программистов. Вы можете удивить даже опытных ребят.

Изменённые файлы в рабочей директории

Изменения, подготовленные к коммиту

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

И здесь снова помогает Git. При выводе статуса он показывает нужную нам команду для перевода изменений в рабочую директорию:

Теперь, если нужно, можно выполнить git restore и окончательно отменить изменения в выбранных файлах.

Самостоятельная работа

Выполните все шаги из урока

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Малоизвестные Git-команды

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

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

git please

Каждому разработчику приходилось хотя бы раз общаться со своим тимлидом на тему принудительного пуша (force pushing) в общую ветку (не делайте этого). Ребейз (rebasing), внесение правок и squash — всё это забавно до тех пор, пока вы не перезапишете часть общей истории и не раскидаете дублирующиеся коммиты по всему репозиторию. К счастью, Git не позволит вам невольно перезаписать историю на сервере. Вам придётся явным образом передать в git push опцию —force, чтобы доказать серьёзность своих намерений. Но принудительный пуш — это грубый подход: вы затаптываете локальной версией вышерасположенную ветку, и все изменения, которые вы к тому моменту не подтянули (fetch), будут стёрты из истории.

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

git commend

Бывало так, что вы закоммитили и тут же сообразили, что забыли проиндексировать (stage) файл? Больше не нужно об этом беспокоиться! Алиас git commend тихо прикрепляет к последнему созданному вами коммиту все проиндексированные файлы, повторно используя уже имеющееся сообщение о коммите.

git it

Первому коммиту в репозитории нельзя сделать ребейз, как обычному. Поэтому рекомендуется в качестве корневого создавать пустой коммит. Алиас git it инициализирует ваш репозиторий и за одну операцию создаёт пустой корневой коммит. И когда вы в следующий раз запустите проект, то не надо просто добавлять его в систему управления версиями: выполните git it!

git staaash

git stash — одна из самых восхитительных и полезных Git-команд. Она регистрирует все изменения, вносимые в отслеживаемый файл в вашем рабочем дереве, и скрывает их для последующего использования, а вам показывает чистое дерево, чтобы вы могли спокойно работать с другой его частью. Но если вы создали новые файлы и ещё не проиндексировали их, то по умолчанию git stash их не тронет, поэтому у вас будет неопрятное рабочее дерево. Соответственно, по умолчанию не скрывается и содержимое неотслеживаемых или игнорируемых файлов.

Я сделал несколько удобных алиасов для разных вариантов git stash, в зависимости от того, какие биты вашего рабочего дерева нужно скрыть:

Если сомневаетесь в выборе, то самый длинный алиас (git staaash) всегда сможет восстановить рабочее дерево состояния свежего клона вашего репозитория.

git shorty

Я запускаю git status чаще любой другой Git-команды. Встроенная помощь в Git за последние годы стала куда удобнее, что очень хорошо для начинающих, но для более опытных пользователей информация слишком многословна. Например, git status объясняет мне в 12 строках, что у меня пара индексированных, неиндексированных и неотслеживаемых изменений:

Всё то же самое git shorty говорит мне тремя строками:

Для краткости я сделал это в виде алиаса git st, не смог остановиться.

git merc

Если вы используете обычный рабочий процесс ветвления без ребейза, то будет не лучшим решением запускать стандартный git merge для слияния веток с фичами с мастер-веткой. Если не добавить к этой команде опции, то по умолчанию станет использоваться стратегия слияния —ff, при которой новый коммит слияния будет создан только в том случае, если в мастер-ветке нет новых изменений. В противном случае мастер-ветка просто «перемотается» до места последнего коммита в вашей ветке. Лишь иногда, создавая коммит слияния, при просмотре Git-истории бывает непросто сказать, какой код был разработан в какой ветке.

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

git merc использует стратегию —no-ff, при которой всегда создаётся коммит слияния.

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Между прочим, —no-ff всегда используется по умолчанию в ходе слияния pull request’ов в Bitbucket.

git grog

Мой алиас git grog (или graphical log) в последние годы разросся настолько, что я больше не уверен, будто точно знаю, что он делает. Но выглядит красиво:

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Для сравнения, вот стандартный git log:

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Там доступны все виды удобных форматов, так что форкайте вышеуказанную команду и пользуйтесь на здоровье!

Для поклонников GUI

Если вы поклонник Git GUI и работаете под Mac или Windows, то, возможно, вы используете наш бесплатный Git-клиент Atlassian SourceTree. Если да, то примените описанные в этой статье алиасы, создав новое кастомное действие — можно назначить комбинацию клавиш — в настройках SourceTree:

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Это действие запускается с помощью меню (Actions → Custom Actions) или клавиатурной комбинации:

Запись изменений в репозиторий

Итак, у вас имеется настоящий Git-репозиторий и рабочая копия файлов для некоторого проекта. Вам нужно делать некоторые изменения и фиксировать «снимки» состояния (snapshots) этих изменений в вашем репозитории каждый раз, когда проект достигает состояния, которое вам хотелось бы сохранить.

Запомните, каждый файл в вашем рабочем каталоге может находиться в одном из двух состояний: под версионным контролем (отслеживаемые) и нет (неотслеживаемые). Отслеживаемые файлы — это те файлы, которые были в последнем снимке состояния проекта; они могут быть неизменёнными, изменёнными или подготовленными к коммиту. Если кратко, то отслеживаемые файлы — это те файлы, о которых знает Git.

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

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

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Определение состояния файлов

Отслеживание новых файлов

Индексация изменённых файлов

Теперь оба файла проиндексированы и войдут в следующий коммит. В этот момент вы, предположим, вспомнили одно небольшое изменение, которое вы хотите сделать в CONTRIBUTING.md до коммита. Вы открываете файл, вносите и сохраняете необходимые изменения и вроде бы готовы к коммиту. Но давайте-ка ещё раз выполним git status :

Сокращенный вывод статуса

Игнорирование файлов

Первая строка предписывает Git игнорировать любые файлы заканчивающиеся на «.o» или «.a» — объектные и архивные файлы, которые могут появиться во время сборки кода. Вторая строка предписывает игнорировать все файлы заканчивающиеся на тильду (

Стандартные шаблоны являются глобальными и применяются рекурсивно для всего дерева каталогов.

Чтобы избежать рекурсии используйте символ слеш (/) в начале шаблона.

Чтобы исключить каталог добавьте слеш (/) в конец шаблона.

Можно инвертировать шаблон, использовав восклицательный знак (!) в качестве первого символа.

Просмотр индексированных и неиндексированных изменений

Чтобы увидеть, что же вы изменили, но пока не проиндексировали, наберите git diff без аргументов:

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

Важно отметить, что git diff сама по себе не показывает все изменения сделанные с последнего коммита — только те, что ещё не проиндексированы. Такое поведение может сбивать с толку, так как если вы проиндексируете все свои изменения, то git diff ничего не вернёт.

Другой пример: вы проиндексировали файл CONTRIBUTING.md и затем изменили его, вы можете использовать git diff для просмотра как проиндексированных изменений в этом файле, так и тех, что пока не проиндексированы. Если наше окружение выглядит вот так:

Используйте git diff для просмотра непроиндексированных изменений

Коммит изменений

Эта команда откроет выбранный вами текстовый редактор.

В редакторе будет отображён следующий текст (это пример окна Vim):

Вы можете видеть, что комментарий по умолчанию для коммита содержит закомментированный результат работы команды git status и ещё одну пустую строку сверху. Вы можете удалить эти комментарии и набрать своё сообщение или же оставить их для напоминания о том, что вы фиксируете.

Итак, вы создали свой первый коммит! Вы можете видеть, что коммит вывел вам немного информации о себе: на какую ветку вы выполнили коммит ( master ), какая контрольная сумма SHA-1 у этого коммита ( 463dc4f ), сколько файлов было изменено, а также статистику по добавленным/удалённым строкам в этом коммите.

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

Игнорирование индексации

Удаление файлов

Если вы просто удалите файл из своего рабочего каталога, он будет показан в секции «Changes not staged for commit» (измененные, но не проиндексированные) вывода команды git status :

В команду git rm можно передавать файлы, каталоги или шаблоны. Это означает, что вы можете сделать что-то вроде:

Эта команда удаляет все файлы, имена которых заканчиваются на

Перемещение файлов

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

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

и это отлично сработает. На самом деле, если вы выполните что-то вроде этого и посмотрите на статус, вы увидите, что Git считает, что произошло переименование файла:

Однако, это эквивалентно выполнению следующих команд:

Рабочий процесс — Введение в Git

Перед тем как погружаться в детали, пройдём поверхностно весь путь от создания проекта в git до начала отслеживания изменений. Затем, в следующих уроках поговорим подробнее про все этапы. В процессе изучим большое количество новых терминов и команд, которые нужны для понимания работы git.

Команда git init создает репозиторий — директорию .git, которая содержит все необходимые для работы git файлы.

С помощью команды git status можно посмотреть статус репозитория:

В этом выводе указано, что репозиторий пустой (No commits yet) и в него нечего добавить, так как нет новых или изменённых файлов. Давайте попробуем добавить несколько файлов:

Теперь снова смотрим на статус:

Git увидел, что в проекте появились новые файлы, о которых ему ничего не известно. Они помечаются как неотслеживаемые (untracked files). Git не следит за изменениями в таких файлах, так как они не добавлены в репозиторий. Добавление в репозиторий происходит в два шага. Первым шагом выполняется команда подготовки файлов git add :

Смотрим что произошло:

Файл README.md теперь находится в состоянии «подготовлен к коммиту» или, другими словами, файлы попадают в индекс. Под коммитом понимается окончательное добавление в репозиторий, когда git запоминает файл навсегда и следит за всеми последующими изменениями.

Коммит — это операция, которая берёт все подготовленные изменения (они могут включать любое количество файлов) и отправляет их в репозиторий как единое целое. Вот, как он выполняется:

Может возникнуть вопрос: зачем так сложно, зачем отдельно нужен индекс (куда попадают файлы после git add ), и почему нельзя добавлять все изменённые файлы сразу в коммит? Как ни странно, такой процесс создан как раз для удобства программистов. Дело в том, что во время разработки может меняться и добавляться много файлов. Но это не значит, что мы хотим добавить все эти изменения в один коммит.

Со смысловой точки зрения, коммит — это какое-то логически завершённое изменение внутри проекта. Его размер бывает очень маленьким, например, исправлением опечатки в одном файле, а иногда и большим, например, при внедрении новой функциональности. Главное в коммите — его атомарность, то есть он должен выполнять ровно одну задачу.

Теперь файл README.md находится внутри репозитория. Убедиться в этом можно, запустив команду git status :

git status не выводит файлы, которые добавлены в репозиторий и не содержат изменений. При этом сам файл README.md находится внутри директории hexlet-git.

Самостоятельная работа

Добавьте файл PEOPLE.md в репозиторий. После добавления команда git status покажет такой вывод:

Дополнительные материалы

To include in what will be committed перевод. Смотреть фото To include in what will be committed перевод. Смотреть картинку To include in what will be committed перевод. Картинка про To include in what will be committed перевод. Фото To include in what will be committed перевод

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Вы не завершили свое слияние (существует MERGE_HEAD)

ОТВЕТЫ

Ответ 1

ХОРОШО. Проблема в том, что ваше предыдущее извлечение не удалось автоматически объединить и перешло в конфликтное состояние. И конфликт не был решен должным образом до следующей попытки.

Отмените объединение и потяните снова.

Чтобы отменить слияние:

Не забудьте добавить и зафиксировать слияние.

git pull теперь должен работать нормально.

Ответ 2

Если вы уверены, что уже разрешили все конфликты слияний:

И ошибка исчезнет.

Ответ 3

git status всегда является полезной отправной точкой.

Если вы уже объединили содержимое в соответствии с вашими пожеланиями и все еще получаете это сообщение, это может быть так же просто, как сделать

Ответ 4

Ответ 5

Я разрешил конфликты и также зафиксировал, но все еще получаю это сообщение об ошибке git push

Все конфликты исправлены, но вы все еще слияния.
(используйте «git commit», чтобы завершить слияние)

Я сделал следующие шаги для устранения ошибки:

Ответ 6

Я не знаю, как и почему это работает. Это было связано с каким-то коммитом, который я сделал, который заставлял мои запросы на слияние выполнять слияние.

Ответ 7

Попробуйте изменить любой временный файл. Например, просто удалите пробел или добавьте пробел, а затем зафиксируйте и отправьте этот файл.

Git добавить ‘временный_обмен_файл’

мерзавец происхождение развивается

А затем попробуйте Git Pull,

мерзавец происхождение развивается

Надеюсь, это поможет вам.

Ответ 8

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

Вы не завершили свое слияние (существует MERGE_HEAD

Чтобы устранить проблему, я выполнил следующую команду git, которая устранила проблему.

Ответ 9

Если вы пытаетесь вытащить из другой ветки в свою ветку. Если вы видите эту ошибку.

Сначала вы должны попытаться выполнить git commit, а затем перетащить другую ветку в вашу.

Ответ 10

Итак, отмените это и снова слейте.

Убедитесь, что у вас есть соответствующая настройка инструментов для вашей среды. Я нахожусь на mac и использую DIFFMERGE. Я думаю, что DIFFMERGE доступен для всех сред. Инструкции здесь: Установить слияние DIFF на MAC

У меня есть это, чтобы разрешить мои конфликты: Git Основные слияния-конфликты

Ответ 11

Я думаю, что это правильный путь заключается в следующем:

Затем у вас есть два варианта:

ИЛИ Если вы находитесь в другой ветке:

Ответ 12

Источники информации:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *