Git

Удалить коммиты, которые еще не запушены:

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>

Squash

1. Объединяем коммиты (минимально можно объединить только 2 коммита):

git rebase -i HEAD~2

2. 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 README

4. удаляем ненужные комментарии, оставляем или пишем свое описание и сохраняем файл. Если сейчас посмотреть, что происходит с гитом, то мы увидим приблизительно следующее:

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 clean

5. теперь осталось только обновить основную ветку в удаленном репозитории:

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 HEAD

7. готово.

Заменить автора последнего коммита

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

Создание и синхронизация удаленной ветки в git

Надо добавить удаленную ветку, чтобы она синхронизировалась через 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

Файл .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:

  1. в IDE -> VCS -> Git -> rebase в мастер (origin/master)
  2. выбираю, какие комменты нужно pick (squash - объединить с предыщущим) и какие нужно skip 
    *при squash - IDE попросит ввести коммент, который будет описывать результат объединения

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, то советую почитать про него и всем удачки! :)

Источник: 1 - 2 - 3 - 4 - 5


19.05.2013 07:47