Фиксирование изменений всех файлов в папке одной командой
Если вы хотите добавить в коммит изменения сразу всех файлов в папке (в данном примере папка называется test-dir
), то для этого используем следующую команду:
git add test-dir/
Переименовывание/перемещение файла
git mv name.txt new-name.txt
Отмена изменений в файле до последнего коммита
git restore name.file
Отмена коммита опубликованного в удаленном репозитории
Самая простая ситуация — отмена изменений. Фактически она сводится к созданию ещё одного коммита, который выполняет изменения противоположные тому коммиту, который отменяется. Руками создавать подобный коммит довольно сложно, поэтому в git добавили команду, автоматизирующую откат. Эта команда называется git revert
:
git revert ИДЕНТИФИКАТОР
Команда revert может "отменять" не только последний коммит, но и любой другой коммит из истории проекта. Согласитесь, это очень круто. Без системы контроля версий о таком нельзя было и мечтать.
Удаление последнего коммита
Иногда удалить нужно только что сделанный по ошибке коммит. Конечно, и в этом случае подходит git revert
, но так загрязняется история. Если этот коммит сделан был только сейчас и ещё не отправлялся на Github, то лучше сделать так, как будто бы этого коммита не существовало в принципе.
Git позволяет удалять коммиты. Это опасная операция, которую нужно делать только в том случае, если речь идет про новые коммиты, которых нет ни у кого, кроме вас.
Если коммит был отправлен во внешний репозиторий, например, на Github, то менять историю ни в коем случае нельзя, это сломает работу у тех, кто работает с вами над проектом.
Для удаления коммита используется команда git reset
. Делается это так:
git reset --hard HEAD~
Последнего коммита больше не существует, но изменения, сделанные в нём, не пропали. Они находятся в рабочей директории для дальнейшей доработки.
git reset
— мощная команда, имеющая множество различных флагов и способов работы. С её помощью удаляются или отменяются (без удаления) коммиты, восстанавливаются файлы из истории и так далее. Работа с ней относится к продвинутому использованию git, здесь же мы затрагиваем только самую базу.
Флаг --hard
означает полное удаление. Без него git reset
отменит коммит, но не удалит его, а поместит все изменения этого коммита в рабочую директорию, так что с ними можно будет продолжить работать. HEAD~
означает "один коммит от последнего коммита". Если бы мы хотели удалить два последних коммита, то могли бы написать HEAD~2
.
Откат изменений в файле к определенному коммиту
Просматриваем историю коммита файла и копируем идентификатор нужного коммита
git log name.file
Вместо ИДЕНТИФИКАТОР
вставляем идентификатор нужного коммита
git checkout ИДЕНТИФИКАТОР name.file
Скачать изменения с сервера из ветки master в текущую ветку
git branch test-branch # переключаемся на нужную вертку (в данном примере test-branch)
git fetch origin # получаем изменения из удаленного репозитория origin
git merge origin/master # сливаем в текущую ветку изменения из master
Если есть конфликты, то правим их и выполняем git add конфликтующие_файлы
, затем git rebase --continue
При этом коммиты вашей ветки окажутся наверху истории изменений.
Изменения, сделанные в заданном коммите:
git show d8578edf8458ce06fbc5bb76a58c5ca4a58c5ca4
Посмотреть, кем в последний раз правилась каждая строка файла:
git blame file.txt
Просмотр изменений (суммарных, а не всех по очереди, как в «git log»):
git diff
Как правильно отправить PullRequest в чужой проект
- Сделайте форк репозитория, а затем клонируйте его в свою локальную среду разработки
git clone git@example.com:username/original-repo.git
- Добавьте основой репозиторий как удаленный (remote) с названием "upstream"
Перейдите в директорию куда вы сделали клон на первом шаге и выполните следующую команду:
git remote add upstream git://example.com/username2/original-repo.git
- Получите последние изменения кода из основного репозитория
git fetch upstream
Вы должны начинать с этого шага для каждого нового патча, чтобы быть уверенными, что работаете с кодом содержащим последние изменения.
- Создайте новую ветку основанную на текущей master ветке оригинального репозитория
git checkout upstream/master
git checkout -b 999-название-вашей-ветки
- Пишем код
Убеждаемся, что он работает :)
- Cделайте коммит изменений
Добавляем файлы c изменениями:
один файл
git add путь/до/вашего/файла.php
все измененные файлы
git add .
Если добавить в описание коммита номер тикета #XXX, тогда Git автоматически свяжет его с тикетом над которым вы работаете:
git commit -m "Описание коммита для тикета #42"
- Получите последние изменения кода из upstream (добавили на втором шаге)
git pull upstream master
Опять же таким образом убеждаемся, что ваша ветка содержит последние изменения. Если возникли конфликты, исправляем и снова комитим.
- Имея код без конфликтов отравьте изменения на git
git push -u origin 999-название-вашей-ветки
- Пришлите pull request в основной репозиторий
Перейдите в свой репозиторий на GitHub'e и нажмите "Pull Request", выберите свою ветку справа и добавьте описание вашего "Pull Request'a", чтобы GitHub автоматически связал его с тикетом добавьте в комментарий номер тикета '#999'.
- Ожидайте рассмотрения вашего кода
Кто-то рассмотрит ваш код и может быть попросит внести изменения, если это произошло возвращайтесь к 5 шагу.
- Удаление ветки
После того как ваш код приняли или отклонили вы можете удалить ветку из локального репозитория и GitHub'a
git checkout master
git branch -D 999-название-вашей-ветки
git push origin --delete 999-название-вашей-ветки
Все шаги кратко
git clone git@github.com:ваше-имя-пользователя/DocLister.git
git remote add upstream git://github.com/AgelxNash/DocLister.git
git fetch upstream
git checkout upstream/master
git checkout -b 999-название-вашей-ветки
### пишем код
### пишем код
### пишем код
### пишем код
### пишем код
git add путь/до/вашего/файла.php
git commit -m "Описание коммита для тикета #42"
git pull upstream master
git push -u origin 999-название-вашей-ветки
Как сообрать последние 3 коммита в один
Работает и на уже push-нутых ветках, если потом делать git push --force. Последняя команда заменят ветку целиком, так что с ней надо быть особо осторожным.
git reset --soft HEAD~3
git commit -m 'new commit message'
Возможен еще вариант
D появившемся окне оставить p
у тех комитов которые должны остаться, а s
у тех которые должны приклеиться к верхним
git rebase -i HEAD~3
Как откатить изменений до коммита dd61ab23
git revert dd61ab23
git reset HEAD^ --hard
git push origin -f
Как преименовать уже пушнутый тег
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags
Как переместить незакоммиченые изменения в новую ветку
git stash
git checkout -b название-новой-ветки
git stash pop
git push -u origin название-новой-ветки
Другие комманды связанные с прятаньем
git stash save "киллер-фитча" # спрятать с именем киллер-фитча
git stash list # показать все спрятанные блоки
git stash apply stash@{1} # применить предпоследнее спрятанное изменение
git stash drop stash@{0} # удалить последнее спрятанное изменение
Изменить автора последнего коммита
git commit --amend --author "AgelxNash <iam@agel-nash.ru>" --no-edit && git rebase --continue
git push origin master --force
Добавление файла к последнему коммиту
git add filename
git commit --amend --no-edit
git push -f
Если нужно просто изменить текст последнего коммита
git commit --amend
git push -f
Если изменения еще не запушены, то git push -f
выполнять не нужно
Как создать ветку на основе PullRequest (вместо $id подставить номер PR)
git fetch origin pull/$id/head:pr-$id
git checkout pr-$id