GIT

Система контроля версий
На главную

Общее


Учебник

Читать всем


РЕПОЗИТОРИИ

Адреса репозиториев:

git remote -v

Изменение адреса репозитория:

git remote set-url <имя_репозитория> <url_репозитория>

ВЕТКИ

Основы ветвления и слияния

Создание ветки:

git branch <имя_ветки>

git checkout <имя_ветки>

или кратко с ключом -b

git checkout -b <имя_ветки>

Переключение на ветку:

git checkout <имя_ветки>

Просмотр списка веток:

git branch

Слияние:

ВАЖНО!!! Перед слиянием надо переключится туда куда надо слить данные

git checkout <имя_ветки_назначения>

git merge <имя_ветки>

Удаление ветки:

git branch -d <имя_ветки>

Переименование ветки

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

git branch -m <старое_название> <новое_название>

git push <имя_репозитория> :<старое_название> <новое_название>

ВАЖНО!!! Во второй строчке стоит двоеточие перед старым именем ветки — это команда для удаления ветки на сервере!!!


КОММИТЫ

Добавить в

git add <имя|маска> // git add . -Добавит все отслеживаемые файлы

Создать коммит

git commit -m "<текст_комментария>"

Изменение последнего коммита

ВАЖНО! Коммит не должен быть запушен на удаленный репо (если нет, то ничего не сломается, но гемор потом будет)

git --amend -m "<текст_комментария>"

Записать в репозиторий (в основную ветку)

git push

Записать в репозиторий в ветку

git push <имя_репозитория> <имя_ветки> // git push origin dev

Отмена операций


Отмена коммита

Для отмены последнего коммита, если изменения ещё не опубликованы на сервер (не сделан git push) воспользоваться командой:

git reset --soft HEAD^

При этом изменённый код удалён не будет (будет зелёным цветом в git status). Вы можете подправить код и повторить коммит.

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

Пример:

--soft - отменит коммит, но сохранит изменения в файлах

--hard - отменит коммит и удалит изменения, сделанные коммитом.

git reset --soft HEAD~2 - отменит 2 последних коммита, сохранив изменения. Будут видны в git status.

Для отмены опубликованного коммита:

git revert <хеш код>

Хеш смотрим в git log.


Отмена отслеживания

Отменить отслеживание файла:

git rm --cached <имя файла>

Важно! Это так же поможет если надо убрать файл из индекса.

Отменить отслеживание папки:

git rm --cached -r <имя папки>

Отмена изменения в файле

git checkout <имя фала>

Как восстановить файл

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


Восстановление удаленного файла или отмена изменений

Если вы еще не добавили файл в индекс (не выполнили git add), то для восстановления файла можно воспользоваться командой (вместо myfile необходимо указать файл, который вы восстанавливаете):

git checkout -- myfile

Просмотреть список удаленных файлов можно командой: git ls-files --deleted


Восстановление удаленного файла, если он уже добавлен в индекс (git add)

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

git reset -- myfile

git checkout -- myfile

источник

Скорая помощь, если "беда" уже пришла

Документация Git - это хорошо,но чтобы найти решение, тебе заранее надо знать название фишки, которая вернёт всё на место.


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

git reflog

# вы увидите список всего,

# что сделали в git, во всех ветках!

# у каждого элемента есть индекс HEAD@{индекс}

# найдите тот, перед которым всё сломалось

git reset HEAD@{index}

# волшебная машина времени

Используйте это чтобы вернуть случайно удалённые штуки, или убрать то чем Вы всё сломали, или восстановиться после неудачного слияния, или просто вернуться туда, когда всё работало. Я ОЧЕНЬ ЧАСТО использую reflog. Снимаю шляпу перед теми, кто предложил добавить это.

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

# сделайте своё изменение

git add . # или добавьте файлы по отдельности

git commit --amend --no-edit

# теперь ваш последний коммит содержит это изменение!

# ПРЕДУПРЕЖДЕНИЕ: никогда не меняйте опубликованные коммиты!

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

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

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

git commit --amend

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

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

# создаст новую ветку из текущего состояния мастера

git branch какое-то-имя-новой-ветки

# удалит последний коммит из мастера

git reset HEAD~ --hard

git checkout какое-то-имя-новой-ветки

# ваш коммит теперь живёт в этой ветке :)

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

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

Я пытаюсь открыть diff, но ничего не происходит?!

Если вы уверены, что изменили файлы, но diff пуст, возможно вы индексировали изменения (add) и нужно добавить специальный флаг.

git diff --staged

¯\_(ツ)_/¯ (да, я знаю, что это не баг, а фича, но это неочевидно с первого раза!)

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

# найдите коммит, который нужно отменить

git log

# используйте стрелочки, чтобы прокрутить историю

# сохраните хеш нужного коммита

git revert [сохранённый хеш]

# git создаст новый коммит, отменяющий выбранный

# отредактируйте сообщений коммита

# или просто сохраните

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

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

# найти хеш коммита, до которого нужно откатиться

git log

# используйте стрелочки, чтобы прокрутить историю

# сохраните хеш нужного коммита

git checkout [сохранённый хеш] -- путь/к/файлу

# старая версия файла окажется в вашем индексе

git commit -m "Ого, теперь не придётся копипастить, чтобы отменить изменения!"

Если серьезно, то где в этой вселенной checkout -- лучший способ отменять изменения?

К чёрту всё, я сдаюсь.

cd ..

sudo rm -r чёртов-репозиторий-git

git clone https://some.github.url/чёртов-репозиторий-git.git

cd чёртов-репозиторий-git

Вообще говоря, если ваша ветка настооолько загажена, что нужно вернуться к удалённому состоянию в "git-корректном стиле" попробуйте это, но это необратимо!

# получить последнее состояние origin

git fetch origin

git checkout master

git reset --hard origin/master

# удалить неиндексированные файлы

git clean -d --force

# повторить checkout/reset/clean для каждой испорченной ветки