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

задняя часть внешний интерфейс Git

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.

1. На одном компьютере есть несколько учетных записей Git.

Предположим, у нас есть несколько учетных записей Git на одном компьютере.Например, компания использует Gitlab для внутренних целей, а в личных целях используется Github или Gitee. Тогда вы столкнетесь с ситуацией, когда вы хотите отправить код в личный проект с открытым исходным кодом на работе, но Git привязан к учетной записи компании.

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

Сгенерируйте первый ключ ssh:

ssh-keygen -t rsa -C "xxx@xxx.xx"

Сгенерируйте второй ключ ssh:

ssh-keygen -t rsa -f path/to/file  -C "xxx@xxx.xx"

параметр-fУказывает указанное сгенерированное имя файла,path/to/fileэто путь к файлу, например.~/.ssh/id_rsa_github.

После выполнения двух вышеуказанных команд вы получите две пары ключей ssh.

image.png

В это время вам также необходимо создатьconfigдокумент. Напишите следующее:

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github # 私钥文件路径
                                                            
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa

Host gitee.com
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_github

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

Затем мы можем настроить первый ключ для сервера Gitlab компании и установить соответствующую учетную запись Git и адрес электронной почты как глобальные.

git config --global user.name "xxx"
git config --global user.email "xxx@xxx.xx"

Затем настройте другую пару ключей ssh ​​для Github и отдельно настройте имя пользователя Git и адрес электронной почты в проекте Github на компьютере.

git config user.name "xxx"
git config user.email "xxx@xxx.xx"

Пока что мы закончили. Теперь можно одновременно коммитить код в разных проектах Gitlab и Github.

2. Измените имя пользователя и адрес электронной почты записи git commit.

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

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

git commit --amend --author="username <yyy@ccc.com>" --no-edit

usernameэто имя пользователя, рядом с электронной почтой пользователя<>Символы не могут быть удалены. Выполнить после модификацииgit push -fОтправить в удаленный репозиторий.

Что делать, если вы хотите изменить информацию о пользователе нескольких коммитов? Его можно изменить с помощью следующего кода:

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "tanguangzhi@shiqiao.com" ];
    then
            GIT_AUTHOR_NAME="woai3c";
            GIT_AUTHOR_EMAIL="411020382@qq.com";
            git commit-tree "$@";
    else
            git commit-tree "$@";
    fi' HEAD

После изменения имени пользователя и адреса электронной почты в приведенном выше коде сохраните его как.shфайл форматирования, напримерedit.sh. Затем выполните в корневом каталоге проектаsh edit.sh(Щелкните правой кнопкой мыши под окнами ->Git Bash Here -> sh edit.sh), а затем выполнитьgit push -fНажмите это трудно.

3. Изменить сообщение записи истории

Предположим, что текущая ветвь имеетa b c dЧетыре записи фиксации:

a
b
c
d

если вы хотитеcЗарегистрированное сообщение изменено. можно использоватьgit rebaseБудуcПереместите запись на передний план, затем используйтеgit commit --amendИзмените его сообщение.

Конкретные шаги операции

Выполните следующую команду для записиdОтредактируйте предыдущие три коммита:

git rebase -i d

После интерфейса редактирования vim подведите курсор к записи c, нажмитеddОбрежьте запись, затем подведите курсор к первой строке, нажмитеpвставить и ввести:wqспасти.

воплощать в жизньgit commit --amendПосле смены порядкаcЗаписи изменены. После входа в интерфейс редактирования vim нажмитеiчтобы внести изменения, затем нажмитеESC, затем введите:wqспасти.

Наконец, используйте ранее упомянутоеgit rebaseоперация будетcЗапись восстанавливается на прежнее место.

image

Результат выполнения этого процесса такой же, как на рисунке выше.Это сравнение между измененной текущей ветвью и удаленной ветвью.Сообщение записи, на которое указывает стрелка, является измененным сообщением.

Если вы хотите синхронизировать измененные записи с удаленным хранилищем, просто выполнитеgit push -fВот и все.

второй способ

  1. использоватьgit checkout -b <branchName> cВзять ветку из указанной записи
  2. использовать в новой веткеgit commit --amendИзменить сообщение фиксации
  3. использоватьgit cherry-pickБудуb aзапись, добавить в новую ветку (Уведомление,здесьb aЗапись фиксации относится к фиксации в исходной ветке, то есть к выбору фиксации в исходной ветке.b aЗапись добавляется в новую ветку, так что запись в новой ветке становитсяa b c, а сообщение фиксации, записанное c, было изменено на втором шаге)
  4. использоватьgit checout 原分支名Переключитесь обратно в исходную ветку и выполнитеgit rebase <branchName>Слейте новую ветку и, наконец, нажмите на удаленную ветку

4. Выберите указанный коммит для слияния

Предположим, вы разветвляете bugFix, чтобы исправить онлайн-ошибку, и через некоторое время тяжелой работы ошибка, наконец, исправлена. Но для отладки (добавление большого количества кода отладки) или по другим причинам на bugFix есть много бесполезных сообщений логирования.

commit3: 修复登录 bug
commit2: 添加 debug 语句
commit1: 添加 console 语句

Например, три записи выше, первые две записи добавляют много кода отладки, и, наконец, ошибка исправлена ​​в последней записи, а код отладки удален. В это время, если вы напрямую объедините ветку bugFix с основной веткой, записи отладки также будут объединены.

В это время вы можете использоватьgit cherry-pickОбъедините только последнюю запись в ветку master. или использоватьgit rebaseДамп двух других записей из ветки bugFix, а затем слияние.

5. ^ а также ~разница

оператор^ а также ~Как и символ, за ним также может следовать число.~Указывает на необходимость вернуться к нескольким поколениям записей.

Но число после оператора такое же, как~Последнее различие используется не для указания нескольких поколений для резервного копирования, а для указания количества родительских записей объединенной записи фиксации.

Git по умолчанию выбирает «первую» родительскую запись коммита слияния в операторе^За которым следует число, чтобы изменить это поведение по умолчанию.

Это может быть нелегко понять, просто взглянув на текст. Давайте рассмотрим несколько примеров.

image.png

Выполнение заказаgit checkout main^Вернитесь к первой родительской записи (где HEAD указывал на c3, теперь он указывает на c1).

image.png

Выполнение заказаgit checkout main^2Вернитесь ко второй родительской записи (где HEAD указывал на c3, теперь он указывает на c2).

Наконец, более сложный пример:

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     |/    |
      B     C
       \   /
        \ /
         A
A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

С помощью этих примеров мы также можем найти~nравно n подряд^.

6. git revertа такжеgit resetразница

git resetИсторию Git можно откатить. Например, текущая ветка имеет три записи, и HEAD указывает на запись c:

c <- HEAD
b 
a

Если мы хотим вернуться к записи b, просто запуститеgit reset bПросто хорошо:

b <- HEAD 
a

Затем используйтеgit push -fФорсируйте ветку после версии отката в удаленный репозиторий, чтобы локальная ветка и удаленная ветка синхронизировались.

git push -f

git revertВы также можете отозвать записи, но отозванные записи не исчезнут, что согласуется сgit reset Разные.git resetОтозванная запись приравнивается к исчезновению.

Теперь мы используемgit revertДавайте еще раз продемонстрируем то, что мы только что сделали:

c
b 
a

Если мы выполнимgit revert b, в текущей ветке будет сгенерирована новая запись коммита, которая станетa b c b',это b'Статус и записиb это то же самое.

То есть выполнитьgit reset b, текущая запись ветки станетa b. воплощать в жизнь git revert b, текущая запись ветки станетa b c b'.

Если вы хотите, чтобы другие знали, что вы отзываете запись, используйтеgit revert, потому что он оставляет запись об отзыве, в противном случае используйтеgit reset.

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

Добро пожаловать для обсуждения в области комментариев, официальный представитель Nuggets будет вПроект «Звезда раскопок»После мероприятия в области комментариев будет разыграно 100 штук Наггетсов Подробности розыгрыша читайте в статье о мероприятии.