MyTetra Share
Делитесь знаниями!
Short List
Время создания: 31.08.2017 09:30
Раздел: Computer - Git

В принципе, для полноценной рабоыт с GIT достаточно следующих команд:

  • git add <path>
  • git commit
  • git checkout <path/branch>
  • git checkout -b <new branch>

И дополнительно:

  • git push/pull
  • git merge <branch>
  • git rebase master (да, можно еще и на другие ветки ребейзить)

Автодополнение

Скрипт git_completion


Вывод текущей ветки в строке bash

Данный код нужно добавить в .bashrc


function git-current-branch {

    git branch --no-color 2> /dev/null | grep \* | colrm 1 2
}

function set_prompt_line {
    local        BLUE="\[\033[0;34m\]"

    # OPTIONAL - if you want to use any of these other colors:
    local         RED="\[\033[0;31m\]"
    local   LIGHT_RED="\[\033[1;31m\]"
    local       GREEN="\[\033[0;32m\]"
    local LIGHT_GREEN="\[\033[1;32m\]"
    local       WHITE="\[\033[1;37m\]"
    local  LIGHT_GRAY="\[\033[0;37m\]"
    # END OPTIONAL
    local     DEFAULT="\[\033[0m\]"
    export PS1="$BLUE\w $LIGHT_RED[\$(git-current-branch)]$DEFAULT \$ "
}

set_prompt_line

Для справки: за внешний вид командной строки баша отвечает переменная PS1. Have fun.


Алиасы

Если через bash:


#

# Git
#
alias current-branch='git-current-branch'
alias git-uncommit='git reset --soft $(git log --format=%H -2 | tail -1)'
alias gst='git status'
alias glog='git log'
alias gcheck='git checkout'
alias gamend='git commit --amend'
__git_complete gcheck _git_checkout
alias gcom='git commit'
__git_complete gcom _git_commit
alias gdiff='git diff'
__git_complete gdiff _git_diff
alias gadd='git add'
__git_complete gadd _git_add


Сменить ветку, не теряя текущих незакоммиченных правок

Иногда можно просто сменить ветку, но иногда возникают конфликты. Я знаю два варианта:

1) Сделать временный коммит
2) git stash, сменить ветку, ..., вернуть ветку, git stash pop

Первый вариант надежнее, второй удобнее (имхо).


Отменить последний коммит

Алиас для bash:


alias git-uncommit='git reset --soft $(git log --format=%H -2 | tail -1)'


git reset --soft <commit/branch/tag> переносит ветку на коммит, но код не меняет. Разница заносится в stage.

$(<whatever>) — баш выполняет содержимое скобочек и подставляет результат выполнения вместо всего выражения. Например, cat $(ls | tail -1) выдаст содержимое последнего файла из ls.

git log --format=%H -2 выдаст хеши двух последних коммитов.


В общем, вся команда сводится к тому, что текущая ветка переносится на один коммит назад, а изменения, внесенные коммитом, попадают в stage

Того же результата можно добиться намного проще: git reset --soft HEAD~ — данная команда берет предыдущий коммит от "головы" и "ресетит" гит на него.


Объединение нескольких коммитов

Интерактивный rebase!


git rebase -i master


Это откроет текстовый редактор, в котором списком будут указаны коммиты. При этом можно:

- менять их порядок;

- "сквошить" - объединять несколько коммитов в один;

- редактировать;

- менять сообщение;

- не применять коммит в принципе.


В данной ситуации нужно взять нужные коммиты, расставить их друг за другом и всем, кроме первого, поставить пометку squash.

Вообще я после каждой фичи делаю интерактивный ребейз и смотрю, какие коммиты я хочу объединить, какие переставить для красоты, какие поправить. Это позволяет сохранять красоту в версионировании.


Добавить в предыдущий коммит


git add <forgotten changes>

git commit --amend

Так же стоит упомянуть:


git commit --amend --no-edit # Не редактировать сообщение

git commit --amend -m 'my commit message' # работает так, как вы ожидаете 

































 
MyTetra Share v.0.53
Яндекс индекс цитирования