Git FAQ – часто задаваемые вопросы по Git

Вопрос: Как перейти (check out) на конкретную ветвь (branch)?
Ответ:
Используйте команду git checkout ...

Вопрос: Как не скачивать весь репозиторий, а скачать только последние n коммитов?
Ответ:
Пример:
git clone --depth=14 https://github.com/angular/angular-phonecat.git

Вопрос: Как настроить автора коммитов?
Ответ:
git config --global user.name "John Smith"
git config --local user.name "John Smith"
git config --global user.email "john.smith@gmail.com"
git config --local user.email "john.smith@gmail.com"
git config -l

Вопрос: Как изменить автора последнего коммита?
Ответ:
git commit --amend --author="John Smith <john.smith@gmail.com>"

Вопрос: Как после установки Git  помощью Homebrew вызывать git-gui просто по имени, а не по полному пути /usr/local/Cellar/git/2.4.1/libexec/git-core/git-gui?
Ответ:
$ cd /usr/local/bin/

$ ln -s ../Cellar/git/2.4.1/libexec/git-core/git-gui git-gui

Вопрос: Как настроить Git на работу с Assembla.com?
Ответ:
How to configure SSH keys with git?

Вопрос: Как изменить удаленный источник подмодуля?
Ответ:
$ nano .gitmodules
$ git submodule sync
$ git submodule foreach -q git config remote.origin.url

Вопрос: Как поменять автора всех commit-ов?
Ответ:
OS X, Linux:
git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Windows:
git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD


Вопрос: Как сделать stash при сообщении "Please, commit your changes or stash them before you can merge."?
Ответ:
$ git status
$ git stash list

$ git stash -u

$ git stash list
$ git status

$ git pull

$ git stash pop
$ git stash list

Вопрос: Как просмотреть список ветвей в удаленном источнике?
Ответ:
git branch -r

Вопрос: Как подправить последний коммит?
Ответ:
git add .
git commit --amend

Вопрос: Как удалить коммит?
Ответ:
git log
git reset --hard <sha1-commit-id>

Вопрос: Как изменить commit?
Ответ:
git stash
git log
git rebase --interactive bbc643cd^
Меняем pick на edit у нужного коммита, для этого в Vim даем команду i (insert at current location). Далее команды :w и :q
Если нужно отменить изменения то даем команду u (undo last change)
git commit --amend
git rebase --continue
git stash apply
git push -f

Вопрос: Как игнорировать файлы типа ._ которые создаются Mac OS X?
Ответ:
Добавить в .gitignore:
# Thumbnails
._*

Вопрос: Как переименовать удаленный источник?
Ответ:
git remote rename origin destination

Вопрос: Как внести изменения локальной ветви в другую ветвь на удаленном источнике?
Ответ:
git push <remotename> <local_branch_name>:<remote_branch_name>

Вопрос: Как изменить адрес удаленного источника?
Ответ:
git remote -v
git remote set-url origin git://github.com/chief/global.git
git remote set-url --push origin git@github.com:User/forked.git

Вопрос: Как узнать адрес удаленного источника?
Ответ:
git config --get remote.origin.url
или
git remote show origin
или

git remote -v

Вопрос: Как отменить изменения файла, которые не были еще staged?
Ответ:
git checkout file.ext 

Вопрос: Как скачать репозиторий не в папку с именем репозитория, а в свою папку?
Ответ: git clone git://github.com/schacon/grit.git mygrit

Вопрос: В локальных настройках был неправильно сконфигурирован автор и вследствие этого commit на GitHub ушел с неверным автором, как изменить автора в последнем commit-e?
Решение:
git commit --amend --author="Author Name <email@address.com>"
git push -f

Вопрос: Как присоединиться к работе над веткой?
Ответ:
Предполагается, что вы уже склонировали себе репозитарий.
Главное здесь — правильно подключить удалённую ветку. Сделать это можно с помощью ключа --track команды git checkout. Команда, приведённая ниже, создаёт локальную ветку feature и подключает её к удалённой ветке origin/feature, после чего переключается в эту ветку.

$ git checkout --track -b feature origin/feature
Branch feature set up to track remote branch refs/remotes/origin/feature.
Switched to a new branch "feature"

Это важно на данном этапе, поскольку просто команда pull смержит удалённую ветку к нам в master, а это не то, что нам нужно.

--

Вопрос: Как установить Git на Ubuntu?
Ответ:
sudo apt-get install git
sudo apt-get install git-gui
Для того чтобы запустить git-gui надо дать команду git citool.
--

Вопрос: Как сделать нормальное отображение русских имен файлов в консоли Git Bash под Windows?
Ответ: Нужно создать файл по пути C:\Users\JohnSmith\.gitconfig и прописать в него:
[core]
  quotepath = false 
То же самое можно сделать локально для репозитория:
$ git config --local core.quotepath false
--

Вопрос: Как удалить пока еще не отслеживаемые изменения в репозитории?
Ответ:
git clean -fxd {dir_path}

Вопрос: Как изменить дату коммита?
Ответ:
git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'

Вопрос: Как узнать количество измененных (unstaged) файлов?
Ответ:
$ git status -s | egrep "^ M" | wc -l

Вопрос: Как изменить сообщение коммита?
Ответ:
$ git rebase -i HEAD~n
n - количество последних коммитов среди которых находится нужный
Откроется текстовый файл в котором нужно изменить pick на reword у коммита сообщение которого вы хотите поменять. Сохранить и закрыть файл.
Далее откроется файл с сообщением коммита. Нужно его изменить и тоже сохранить и закрыть файл.
$ git push --force

Вопрос: Как коммитить без указания почтового адреса?
Ответ: Для всех репозиториев по умолчанию:
git config --global user.name 'Snail Mail'
git config --global user.email '<>'
или для конкретного репозитория:
git config user.name 'Snail Mail'
git config user.email '<>'

Вопрос: Как верифицировать свои коммиты?
Ответ:
Если добавить свой ключ на GitHub и коммитить с `-S`, то коммиты будут иметь бейджики "verified".

$ gpg --list-secret-keys --keyid-format LONG
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot 
ssb   4096R/42B317FD4BA89E7A 2016-03-10

$ gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format

Выведенный ключ нужно добавить у себя в настройках аккаунта.

Далее  нужно настроить репозиторий на работу с GPG и потом можно коммитить.

$ git config commit.gpgsign true
$ git config user.signingkey 3AA5C343

$ git commit -S -m your commit message
$ git push

См. также: как пользоваться GPG.


Вопрос: Как удалить папку из под мониторинга Git?
Ответ:
1) Добавьте папку в .gitignore
path_to_your_folder/
2) Удалите папку из вашего local git tracking, но оставьте её на диске:
git rm -r --cached path_to_your_folder/
3) Сделайте push ваших изменений в Git-репозиторий.


Вопрос: Как удалить (отменить) последний коммит?
Ответ:
git reset HEAD~


Вопрос: Как удалить папку из всех коммитов?
Ответ:
git filter-branch -f --tree-filter 'rm -rf node_modules' --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git gc


Вопрос: Как переименовать ветку?
Ответ:
git branch -m <oldname> <newname>


Вопрос: Как создать новую ветку?
Ответ:
Создать новую ветку и перейти на неё:
git checkout -b newbranchname a9c146a09505837ec03b

Просто создать новую ветку:
git branch newbranchname a9c146a09505837ec03b


Вопрос: Как создать новую чистую ветку?
Ответ:
git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'


Вопрос: Как закоммитить файл частично?
Ответ:

git add --patch <filename> (или -p в качестве краткого варианта)

Git будет спрашивать насчет каждой порции:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Описание каждой опции:
  • y stage this hunk for the next commit
  • n do not stage this hunk for the next commit
  • q quit; do not stage this hunk or any of the remaining hunks
  • a stage this hunk and all later hunks in the file
  • d do not stage this hunk or any of the later hunks in the file
  • g select a hunk to go to
  • / search for a hunk matching the given regex
  • j leave this hunk undecided, see next undecided hunk
  • J leave this hunk undecided, see next hunk
  • k leave this hunk undecided, see previous undecided hunk
  • K leave this hunk undecided, see previous hunk
  • s split the current hunk into smaller hunks
  • e manually edit the current hunk
  • ? print hunk help

Если файл еще не проиндексирован:

git add -N <filename>
git add -p <filename>


Вопрос: Как изменить заданный коммит?
Ответ:

git rebase -i [COMMIT BEFORE THE FIRST YOU WANT TO EDIT]

Далее нужно выставить edit тем коммитам, которые требуется изменить.
Далее нужно внести необходимые изменения в коммит.

Если нужно только изменить сообщение коммита, то надо выолнить:
git commit --amend -m 'new message'

После завершения изменений нужно выполнить:

git rebase --continue



Вопрос: Где посмотреть список языков, которые можно вставлять в Markdown блоки кода?
Ответ: GitHub использует Linguist для распознавания языков. Для подсветки используются третьесторонние грамматики. Валидные ключевые слова можно найти в YAML файле языков. См. также:


Вопрос: Как изменить самый первый коммит?
Ответ:
git rebase -i --root


Вопрос: Как изменить дату последнего коммита?
Ответ:
git commit --amend --date="Sat Sep 13 01:33:14 2014 +0600"