Удалить коммиты, которые еще не запушены:
git reset --hard HEAD^Возврат к коммиту:
git reset --hard 4f49cc580d3624db19ce8b055becc26a7d5c1b2bОткат локального мастера в состояние удаленного мастера:
git checkout -B master origin/masterтоже самое но с обычной веткой:
git checkout -B feature/SS-758 origin/feature/SS-758Сделал неправильный коммит и запушил, но хочу откатиться
1. откатываемся на нужный коммит (переключает локальный HEAD)
$ git reset remote origin 88f06ac7b0fbda3d2b994970547871c921319926
2. пушим локальные изменения и переключаем удаленный HEAD
$ git push origin +master
* здесь + означает force
Изменить commit message последнего коммита:
git commit --amend -m "my new message"Заставим гит игнорировать изменения в определенном файле
git update-index --assume-unchanged <file>
а если вдруг снова понадобится следить за изменениями в этом файле, то:
git update-index --no-assume-unchanged <file>
Другое
Отмена изменений файла: git checkout -- <file>
Отмена индексации файла: git reset HEAD
Revert мержа: git revert -m 1 <SHA-1>
1. Объединяем коммиты (минимально можно объединить только 2 коммита):
git rebase -i HEAD~22. git откроет нам текстовый редактор со списком коммитов, где первому коммиту мы должны оставить слово pick, а остальным squash:
pick f7f3f6d Change my name a bit
squash 310154e Update README
...3. сохраняем файл, закрываем, и git нам открывает еще один файл со описанием коммита, для объединенных коммитов:
# This is a combination of 2 commits.
# The first commit's message is:
Change my name a bit
# This is the 2nd commit message:
Update README4. удаляем ненужные комментарии, оставляем или пишем свое описание и сохраняем файл. Если сейчас посмотреть, что происходит с гитом, то мы увидим приблизительно следующее:
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 6 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean5. теперь осталось только обновить основную ветку в удаленном репозитории:
git push -f origin HEADНо, если вы после шага 4 увидели следующее:
$ git status
interactive rebase in progress; onto 27axc09
Last commands done (2 commands done):
pick f7f3f6d Change my name a bit
squash 310154e Update README
No commands remaining.
You are currently rebasing branch 'master' on '27axc09'.
(all conflicts fixed: run "git rebase --continue")
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .gitignore
modified: README.md
...то Вы должны подтвердить свое намеренье о продолжении, для этого вводим команду:
git rebase --continueи получаем сообщение:
[detached HEAD 5e12f84] improved
Date: Fri Mar 8 17:31:24 2020 +0300
25 files changed, 506 insertions(+), 159 deletions(-)
create mode 100644 .gitignore
rewrite README.md (100%)
...теперь осталось только обновить основную ветку в удаленном репозитории:
git push -f origin HEAD7. готово.
export GIT_AUTHOR_NAME=Bob
export GIT_AUTHOR_EMAIL=bob@ya.ru
export GIT_COMMITTER_NAME=Bob
export GIT_COMMITTER_EMAIL=bob@ya.ru
git commit --amend --reset-author
git push -fНадо добавить удаленную ветку, чтобы она синхронизировалась через pull/push.
Сначала надо создать удаленную ветку:
git push origin origin:refs/heads/newbranch
притянуть ее
git pull origin
посмотреть появилась ли в списке удаленных веток:
git branch -r
создать локальную ветку и закрепить ее за удаленной
git checkout --track -b newbranch origin/newbranch
На других рабочих компьютерах надо посмотреть удаленные ветки
git branch -r
и сделать checkout
git checkout --track -b newbranch origin/newbranch
Удалить удаленную ветку можно так
git push origin :heads/newbranch
Находясь на ветки, которую нужно переименовать: git branch -m new_branch_name
вариант 1: git checkout .
вариант 2: git reset --hard
git reset --hard && git clean -fd --exclude="vendor"
git clean -fпосмотрет на то, что будет удалено: git clean -n
To remove directories, run git clean -f -d or git clean -fd
To remove ignored files, run git clean -f -X or git clean -fX
To remove ignored and non-ignored files, run git clean -f -x or git clean -fx
Свой удаленный репозиторий:
$ git init
$ git remote add origin yapro@yapro.ru:/var/www/project
$ git pull origin
$ git checkout master
$ git config receive.denyCurrentBranch ignoreДобавление удаленного гит-репозитария:
git remote add origin git@git.ilook.ru:ilook_botsПринудительный пуш: git push --force
Пуш нового репозитория: git push -u origin --all
Пуш текущей ветки в поток, параметр -u аналогичен: --set-upstream
git push -u originОшибка с ребейзом:
You are currently rebasing branch 'dt-760-configurations-into-one-file' on '1e4e128'.
(all conflicts fixed: run "git rebase --continue")решается так: git rebase --abort
Находим ветки в которых есть определенный коммит:
git branch -r --contains e35d47c | grep release-Просмотр списка всех коммитов во всех ветках, в которых был изменен определенный файл:
git log --all vendor/Bootstrap.phpКакая текущая ветка: git branch
Находим все ветки (в том числе удаленные):
git branch -a | headПоиск коммита, который содержит определенный текст:
ситуация: когда-то был метод enableDatravel в файле Х, кто-то удалил, вопрос: как найти коммит, в котором этот метод был удален
git grep <regexp> $(git rev-list --all)пример:
git grep enableDatravel $(git rev-list --all)аналог с подробным выводом diff-ов:
git log -p -SenableLoggingПоиск ветки среди всех веток, в том числе удаленных:
git branch -r | grep 463Показать историю и какие файлы участвовали в коммитах: git log --stat
Последний коммит на каждой из веток: git branch -v
Поиск коммита в котором содержался указанный текст
ситуация: когда-то был метод enableDatravel в файле Х, кто-то удалил, вопрос: как найти коммит, в котором этот метод был удален?
git grep <regexp> $(git rev-list --all)
пример:
git grep enableDatravel $(git rev-list --all)
аналог с подробным выводом diff-ов:
git log -p -SenableLogging
| git tag -l | Посмотреть все теги |
| git show <tag> | Просмотр данных по тегу |
| git tab <tag> | Создание легковесного тега |
| git tag -a <tag> -m "comment" | Создание аннотированного тега |
| git tag -a <tag> <hash> | Создание тега к определенному коммиту (например старому коммиту) |
| git checkout tags/1.7-rc2 | Переключаюсь на тег 1.7-rc2 |
| git push <remote> --tags | Отправка всех тегов за один раз |
| git push <remote> <tag> | Обмен метками? |
Обычно я делаю так:
git checkout master
git tag -a 1.1.19 -m "comment"
git push --tagsФайл .gitignore необходимо добавить в корень проекта и в нем указать список исключений.
| # | Комментарий |
| /file.a | Игнорировать файл file.a в текущем каталоге |
| *~ | Игнорировать все файлы, заканчивающиеся на тильду «~» |
| *.[ab] | Игнорировать файлы, заканчивающиеся на .a или .b |
| *.a | Игнорировать все файлы, заканчивающиеся на .a |
| !file.a | Но, не игнорировать файл file.a |
| !dir/ | Но не игнорировать каталог dir/ Если файл или каталог находятся не в корне, нужно писать !dir1/dir2/dir/ |
| /*.a | Игнорировать все файлы, заканчивающиеся на .a в текущем каталоге |
| dir/ | Игнорировать все файлы в каталоге dir/ |
| /dir/ | Игнорировать каталог /dir и все его содержимое |
Есть несколько подходов для анализа сбора статистики коммитов/авторов/строк т.п.: 1 - 2
Проверка настроек: git config --list
Создание локальной ветки: git checkout -b branch-name
Пушим ветку в репу: git push origin task-957
Rebase + объединение коммитов в PhpStorm:
Rebase в ручном режиме:
git fetch origin
git rebase master
# с интерактивом (не использую): git rebase -i master
# пушим ветку в репу:
git push origin Вариант с удаленной веткой:
# создаем удаленную ветку:
git checkout -b origin/my-branch
# пушим удаленную ветку в репозиторий
git push origin origin/my-branchУдаляем remote ветку:
git checkout master
git branch -d origin/my-branchСвой хук:
#!/usr/bin/env sh
print 1;Информация об удаленном репозитории: git remote show <remote>
Просмотр изененных, но непроиндексированных файлов: git diff
Просмотр проиндексированных файлов, котороые войдет в коммит: git diff --staged
Перемещение файла: git mv <old file> <new file>
Удаление файла с индексацией: git rm <file>
Удаление файла из индекса (при этом файл остается в рабочем каталоге): git rm --cached <file>
Если перестало пускать в репозиторий, например:
$ git pull
git@git.site.ru: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.то чтобы понять истинную причину, лучше всего попробовать подключиться в ручном режиме:
$ ssh -v -p 7999 -T -i /home/lebnik/.ssh/id_rsa git@git.site.ru
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
debug1: Reading configuration data /home/lebnik/.ssh/config
debug1: /home/lebnik/.ssh/config line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to git.site.ru [172.16.52.50] port 7999.
debug1: Connection established.
debug1: identity file /home/lebnik/.ssh/id_rsa type 0
debug1: identity file /home/lebnik/.ssh/id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.9p1 Ubuntu-3
debug1: Remote protocol version 2.0, remote software version APACHE-SSHD-2.4.0
debug1: compat_banner: no match: APACHE-SSHD-2.4.0
debug1: Authenticating to git.site.ru:7999 as 'git'
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: rsa-sha2-512
debug1: kex: server->client cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ssh-rsa SHA256:+NKsInRExMmvGsQ7SX6Z/hljU/UAmcwJNjJwOaDXvTY
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
debug1: checking without port identifier
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such file or directory
Warning: Permanently added '[git.site.ru]:7999' (RSA) to the list of known hosts.
debug1: rekey out after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 4294967296 blocks
debug1: get_agent_identities: bound agent to hostkey
debug1: get_agent_identities: agent returned 2 keys
debug1: Will attempt key: /home/lebnik/.ssh/id_rsa RSA SHA256:hESygHq20snMRs2FLgiYJsr2r0kysvhqjhElKcOhwfs explicit agent
debug1: Will attempt key: lebnik@pc RSA SHA256:ZZZNx6XwwLuStEPiLZj6fcPXrRQgAc/02/YDYm96m2Y agent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/lebnik/.ssh/id_rsa RSA SHA256:hESygHq20snMRs2FLgiYJsr2r0kysvhqjhElKcOhwfs explicit agent
debug1: send_pubkey_test: no mutual signature algorithm
debug1: Offering public key: lebnik@pc RSA SHA256:ZZZNx6XwwLuStEPiLZj6fcPXrRQgAc/02/YDYm96m2Y agent
debug1: send_pubkey_test: no mutual signature algorithm
debug1: No more authentication methods to try.
git@git.site.ru: Permission denied (publickey).Ага, в коне выдало интересную ошибку: send_pubkey_test: no mutual signature algorithm
Гуглим ее и в настоящий момент оказывается, что проблема образовалась из-за обновления ubuntu до 22.04 и решается таким содержимым файла ~/.ssh/config
Host *
ForwardAgent yes
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
LogLevel ERROR
KexAlgorithms +diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-dss
PubkeyAcceptedAlgorithms +ssh-rsaВот и все, проблема решена.
p.s. если не знаете, что такое stash, то советую почитать про него и всем удачки! :)