Основы Git Fu для технических писателей

Нет, это не очередной учебник по Git. Я хочу поделиться с вами некоторыми приемами, которые я использую, чтобы спастись от ада Git.

В моем предыдущем посте Обращение ко всем разработчикам: нам нужны более совершенные инструменты документации я затронул вопрос о том, как Git становится проблематичным для писателей. Здесь я поделюсь с вами некоторыми Git fu, которые люди используют, и как я адаптировал его в своем повседневном рабочем процессе. Использование этих приемов позволяет мне сэкономить время и снизить вероятность ошибки вручную.

Это также полезно, если вы или кто-то из вашей команды новичок в Git или у вас проблемы с запоминанием всех связанных с Git команд из вашего рабочего процесса. Я представил это как доклад на linux.conf.au 2020 # lca2020

Смотрите слайды беседы здесь.

TL; DR Используйте эти псевдонимы Git https://bit.ly/gitfu-aliases

Что такое Git Fu?

К сожалению, никто не может сказать, что такое «Матрица». Вы должны увидеть это сами.

В основном это псевдонимы Git и функции bash, которые я использую несколько раз в день. Он позволяет сопоставить простые английские термины для команд Git, которые вы используете каждый день. Например, чтобы создать новую ветку, вы можете выполнить следующую команду:

git newbranch <branch-name>

вместо того

git checkout -b <branch-name>

Для меня это более логично и избавляет меня от запоминания фактической команды. Это была простая операция, для сложных задач вы также можете запускать анонимную функцию bash с псевдонимами git. Примером этого может быть загрузка удаленной ветки (запрос на вытягивание или запрос на слияние) для проверки. Итак, вот мой список удобных псевдонимов git. Хотя вы можете использовать один алфавит для псевдонимов, я считаю, что полное слово имеет больше смысла.

См. также:  Почему git не может видеть мое удаленное репо, которое, как я уверен, существует?

Вариант использования

Рассмотрим руководство по редактированию контента для openshift-docs. Прежде чем редактировать контент, первым делом нужно убедиться, что ваш локальный репозиторий синхронизирован с удаленным, выполнив следующие команды:

$ git checkout master
$ git fetch upstream
$ git rebase upstream/master
$ git push origin master

Вы должны делать это каждый раз, когда создаете новую ветку для редактирования контента.

Теперь это ручной процесс, люди небрежны и иногда забывают выполнить эти шаги, что может привести к конфликтам слияния на более позднем этапе. Чтобы свести к минимуму вероятность ошибки и поддержать рабочий процесс, вы можете иметь новый псевдоним ветки, который будет делать все это каждый раз, когда вы создаете новую ветку, например:

[alias]
newbranch = "!f() { \
            git checkout master; \
            git fetch upstream; \
            git rebase upstream/master; \
            git push origin master; \
            git checkout -b \"$1\"; \
            }; f"

Теперь, когда писатели используют этот псевдоним для создания новой ветки, они фактически следуют указанным процессам рабочего процесса.

$  git newbranch test-branch
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
remote: Enumerating objects: 4979, done.
remote: Counting objects: 100% (4979/4979), done.
remote: Total 125270 (delta 4979), reused 4979 (delta 4979), pack-reused 120291
Receiving objects: 100% (125270/125270), 96.45 MiB | 5.51 MiB/s, done.
Resolving deltas: 100% (85396/85396), completed with 875 local objects.
From github.com:openshift/openshift-docs
 * [new branch]          dedicated-3.1          -> upstream/dedicated-3.1
 * [new branch]          dedicated-3.2          -> upstream/dedicated-3.2
 * [new branch]          enterprise-3.0         -> upstream/enterprise-3.0
 * [new branch]          enterprise-3.1         -> upstream/enterprise-3.1
 * [new branch]          enterprise-3.10        -> upstream/enterprise-3.10
 * [new branch]          enterprise-3.11        -> upstream/enterprise-3.11
 * [new branch]          enterprise-3.2         -> upstream/enterprise-3.2
   6551b4bd8..af48688cf  master                 -> upstream/master
 * [new branch]          master-3               -> upstream/master-3
 * [new branch]          online                 -> upstream/online
 * [new branch]          revert-15425-BZ1644512 -> upstream/revert-15425-BZ1644512
First, rewinding head to replay your work on top of it...
Fast-forwarded master to upstream/master.
Everything up-to-date
Switched to a new branch 'test-branch'

Псевдонимы Git

… Один небольшой совет, который может сделать вашу работу с Git проще, проще и более знакомой: псевдонимы (ИСТОЧНИК: GIT DOCUMENTATION)

Псевдонимы Git позволяют создавать собственные команды Git. Вы можете использовать его, чтобы указать псевдоним и указать команду Git sb или функцию bash при вызове этого псевдонима.

См. также:  Как использовать «yield» в Python?

Подкоманды Git

Вы можете использовать команду git config для создания псевдонима следующим образом:

git config --global alias.newbranch 'checkout -b'

В этой команде мы создаем псевдоним «newbranch» для создания новой ветки. Вы можете использовать псевдоним следующим образом:

git newbranch <branch-name>

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

[user]
        email = …
...
[alias]
        unstage = reset HEAD --
...

Функции Bash

Вы также можете запускать внешние команды, добавляя команды псевдонимов с помощью `!`.

$ git config --global alias.visual '!gitk'

И вы также можете запускать сценарии bash, используя следующий формат:

[alias]
your_alias = "!f() { <your-complex-commands> }; f"

Некоторые псевдонимы Git, которые я использую

Ниже приведены некоторые из псевдонимов git, которые я использую каждый день, вы также можете просмотреть полный список. Чтобы использовать их, просто скопируйте и вставьте псевдонимы в ваш глобальный .gitconfig файл или файл конфигурации локального репозитория .git/config

Синхронизация с удаленным репозиторием

[alias]
syncorigin = "!f() { \
git fetch origin master && git rebase origin/master; \
}; f"
syncupstream = "!f() { \
git fetch upstream master && git rebase upstream/master; \
}; f"

Создать новую ветку

[alias]
newbranch = checkout -b

Удалять, переименовывать и находить ветки

[alias]
deletebranch = "!f() { git branch -D \"$1\"; }; f"
renamebranch = "!f() { git branch -m \"$1\"; }; f"
findbranch = !git branch | grep -i

Я нахожу псевдоним findbranch очень полезным, вы можете использовать его для перечисления всех ветвей, соответствующих вашему запросу.

$ git findbranch <few-characters-of-branch-name>
$ git fundbranch bug-22
gn/bug-2235
sh/bug-2261
sh/bug-2234

Перейти к предыдущей ветке

[alias]
previousbranch = checkout @{-1}

Добавить изменения в предыдущую фиксацию

[alias]
addtolastcommit = "!git add -A && git commit --amend --no-edit"

Отменить коммит

[alias]
undotillcommit = "!f() { git reset --soft \"$1\" && git status; };f"
undolastcommit = !git reset --soft HEAD^

Незавершенная фиксация

[alias]
wip = "!f() { \
git add -A; \
if [ \"$(git log -1 --pretty=%B)\" = \"WIP:Do not merge\" ]; then git commit --amend --no-edit; else git commit -m \"WIP:Do not merge\"; fi; \
}; f"
unwip = "!f() { \
if [ \"$(git log -1 --pretty=%B)\" = \"WIP:Do not merge\" ]; then git reset HEAD^; else echo \"No work in progress commit\"; fi; \
}; f"

Подтолкнуть изменения

[alias]
pushbranch = "!f() { \
git push origin $(git rev-parse --abbrev-ref HEAD); \
}; f“
forcepushbranch = !git pushbranch -f

Получите удаленный филиал

[alias]
getremotebranch = "!f() { \
read -p \"Enter remote branch name: \" branchname;
echo \"==== Syncing with origin ====\";
git fetch origin;
echo \"==== Getting the remote branch ====\";
git checkout -t origin/$branchname;
}; f"

Просмотр списка измененных файлов в последней фиксации

showmodifiedfiles = "!f() { \
echo \"==== Modified files in last commit ====\"; \
git diff-tree --no-commit-id --name-status -r $(git rev-parse HEAD); \
}; f"

Узнать больше

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: