Полезные ссылки, bash, git

С удовольствием приму от вас уточнения, исправления, tools & hacks на: zabrosov[at]gmail.com


Пингвин тут не нужен, не зоопарк. Немного о кое чем

http://htmlbook.ru/              # секреты html и CSS с примерами
http://www.worldtimebuddy.com/   # международное время, очень удобно для тех кто работает с другими временными поясами
http://www.commandlinefu.com/    # мини скрипты на все случаи жизни
http://mirror.yandex.ru/         # все дистрибутивы и репозитории в одном месте

2.1 Про git

git clone --bare hello hello.git                # создали чистый репозиторий для удаленной работы
git clone                                       # рабочая копия
git init                                        # инициализация репо

git rm --cached readme.txt    # это удалить файл из индекса, оставив его при этом в вашем рабочем каталоге
git rm grit.gemspec           # удаление из под индекса
git rm grit.gemspec -f        # принудительное удаление
git rm log/\*.log             # обратный слэш (\) перед*, регексп для удаления
git mv file_from file_to      # переименование\перемещение файла

git log -p -2                 # история изменений +2 строки изменений из файла
git log --pretty=oneline      # список в одну строку
log — --graph                 # вывод графа веток

git log --since=2.weeks       # показать за 2 недели
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t 

git hist --max-count=1        # поиск последнего коммита
git cat-file -t         # смотрим что за операция |git type
git cat-file -p         # смотрим иформацию по хешу | git dump

git commit --amend    # изменение комментария к коммиту или добавление изменений к коммиту (исползуется последний хеш)
git reset HEAD             # отмен последнего индекса (только индекс, не коммит)
git checkout -- filename   # отмеение последних изменений в файле (перезапись файла файлом из предыдущего коммита)
git reset --hard v1        # отменяем коммиты и переносим мастер, чистим историю
git reset HEAD hello.html  # сброс индекса файла к предыдущему коммиту, чистим истрию
git revert HEAD            # возврат к предыдущий версии (отменяющий коммит), сохраняем историю
git checkout master        # отменять изменения в рабочем каталог

git remote -v              # просмотр удаленных URL репозиториев; 
                           # origin — это единственный удалённый сервер прописанный как SSH ссылка,
                           # поэтому он единственный, в который я могу помещать свои изменения

git clone git://github.com/paulboone/ticgit.git         # склонировали удаленный репо
git remote add pb git://github.com/paulboone/ticgit.git # Добвление удаленных репозиториев 
git remote rm paul                                      # удаление удаленных репозиториев
git fetch pb               # добавляем все данные из удаленного рпозитрия. которых нет у нас в отдельную ветку
git pull [remote-name]     # добавляем и сливаем с нашей веткой
git push [удал. сервер] [ветка], git push origin master # складываем наши данные на удаленный сервер origin в ветку master

git branch --track style origin/style # добавляем и трекаем ветку удаленного репо у себя локально

git remote show [удал. сервер]        # смотрим ветки репозитория

git remote rename pb paul             # переименовать для себя и у себя
git tag -l 'v1.4.2.*'                 # поиск по шаблону тегов
git tag -a v1.4 -m 'my version 1.4'   # добовляем тяжелую метку (создается вся мето информация)
git tag v1.4-lw
git push origin --tags                # отправляем метки на сервер
git branch name                       # создание ветки
git checkout testing                  # переход в ноыую ветку
git checkout -b testing               # создать  ветку и перейти на неё
git branch -d hotfix                  # удалить ветку

2.2 gitconf

Вывод branch имени репозитория git (hack чтобы не путаться)

cat << 'MEME' >> ~/.bashrc  # удобно дописывать в файл  
function parse_git_branch {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
 
PS1="[\u@\h \W]\$ " 
PS1="${PS1}$YELLOW\$(parse_git_branch)$WHITE"
alias g="git "
alias gf="git fetch "
alias gst="git status "
alias gs='git status '
alias ga='git add '
alias gb='git branch '
alias gc='git commit'
alias gd='git diff'
alias go='git checkout 
MEME

.gitconf

cat .gitconfig

[core]
    autocrlf = input
    safecrlf = true
excludesfile = /home/zabrosov/.gitignore_global
[user]
    name = zabrosov
    email = zabrosv[at]gmail.com
[alias]   # набор алиасов для вывода history, '\'-обозначил перенос строки
    co = checkout
    ci = commit
    st = status
    br = branch
    hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short 
    lall = log --pretty=format:\"%h %ad | %s%d [%an]\" --all --graph
    lof = log --pretty=format:'%C(cyan)%ar %C(yellow)%C(bold)%an%C(reset) %C(cyan)committed%C(reset) \
                          [%h]%C(yellow)%C(bold)%d:%n%C(green)%s%C(reset)' --name-only
    tree = log --graph --abbrev-commit --decorate --date=relative \ 
           --format=format:'-> %C(cyan)%ar%C(reset) %C(green)%an%C(reset) %C(cyan)committed%C(reset) \
           %C(yellow)%h%C(reset) %C(cyan)saying%C(reset):%C(yellow)%d%C(reset) %C(white)%s%C(reset)' --all
    ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
    type = cat-file -t
    dump = cat-file -p
[color]
    ui = true
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path =
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true

3.1 if-else

if [[ ! -f ~/.bashrc && ! -f ~/.env ]]; then echo "ERROR: no  profile"; exit 1; fi
[[ ! -f ~/.bashrc && ! -f ~/.env ]] && (echo "ERROR: no  profile"; exit 1)
[[ ! -f ~/.bashrc && ! -f ~/.env ]] || (echo "YES: profile is here";)

# -a file  Правда, если file существует
# -b file  Правда, если file существует и это специальный блоковый файл
# -c file  Правда, если file существует и это специальный знаковый файл
# -d file  Правда, если file существует и это директория
# -e file  Правда, если file существует
# -f file  Правда, если file существует и это регулярный файл
# -g file  Правда, если file существует и установлен SGID бит
# -h file  Правда, если file существует и это символический ссылка
# -k file  Правда, если file существует и второй промежуточный бит округления установлен
# -p file  Правда, если file существует и это named pipe (FIFO)
# -r file  Правда, если file существует и он доступен на чтение
# -s file  Правда, если file существует и больше нуля
# -u file  Правда, если file существует и SUID (set user ID) бит установлен
# -w file  Правда, если file существует и он доступен на запись
# -x file  Правда, если file существует и он доступен на исполнение
# -O file  Правда, если file существует принадлежит существующему пользователю
# -G file  Правда, если file существует принадлежит существующей группе
# -L file  Правда, если file существует и это символический ссылка
# -N file  Правда, если file существует и был изменен с тех пор как был прочитан
# -S file  Правда, если file существует и это сокет
# file1 -nt file2  Правда, если файл file1 изменялся чаще чем file2, или есои file1 существует, а file2 нет
# file1 -ot file2  Правда, если файл file1 старше чем file2, или file1 существует, а file2 нет
# file1 -ef file2  Правда, если file1 и file2 относятся к одному устройству и номеру инода
# -o OPTIONNAME    Правда, если shell опция "OPTIONNAME" включена
# -z string        Правда, если длинна "string" равна 0 (пустая строка)
# -n string or string Правда, если длинна "string" не равна 0 (не пустая строка)
# string1 == string2  Правда, если выражения эквивалентны
# string1 != string2  Правда, если выражения не эквивалентны
# string1 < string2   Правда, если "string1" лексикографически упорядоченно до "string2"
# string1 > string2   Правда, если "string1" лексикографически упорядоченно после "string2"

if [ $? -ne 0 ];then
    usage
    exit 1
fi


Результат true если "ARG1" к "ARG2":
-eq: эквивалентен
-ne: не эквивалентен
-lt: меньше чем
-le: меньше или равно
-gt: больше
-ge: больше или равно

# [ ! EXPR ]   Правда, если выражение EXPR не справедливо
# [ ( EXPR ) ] Возвращает значение EXPR. Это может быть использовано для изменения приоритета операторов
# [ EXPR1 -a EXPR2 ] Правда, если оба выражения EXPR1 и EXPR2 справедливы
# [ EXPR1 -o EXPR2 ] Правда, если хотя бы одно выражение EXPR1 или EXPR2 справедливы


# Базы данных