Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
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.
В это время вам также необходимо создать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
Запись восстанавливается на прежнее место.
Результат выполнения этого процесса такой же, как на рисунке выше.Это сравнение между измененной текущей ветвью и удаленной ветвью.Сообщение записи, на которое указывает стрелка, является измененным сообщением.
Если вы хотите синхронизировать измененные записи с удаленным хранилищем, просто выполнитеgit push -f
Вот и все.
второй способ
- использовать
git checkout -b <branchName> c
Взять ветку из указанной записи - использовать в новой ветке
git commit --amend
Изменить сообщение фиксации - использовать
git cherry-pick
Будуb a
запись, добавить в новую ветку (Уведомление,здесьb a
Запись фиксации относится к фиксации в исходной ветке, то есть к выбору фиксации в исходной ветке.b a
Запись добавляется в новую ветку, так что запись в новой ветке становитсяa b c
, а сообщение фиксации, записанное c, было изменено на втором шаге) - использовать
git checout 原分支名
Переключитесь обратно в исходную ветку и выполнитеgit rebase <branchName>
Слейте новую ветку и, наконец, нажмите на удаленную ветку
4. Выберите указанный коммит для слияния
Предположим, вы разветвляете bugFix, чтобы исправить онлайн-ошибку, и через некоторое время тяжелой работы ошибка, наконец, исправлена. Но для отладки (добавление большого количества кода отладки) или по другим причинам на bugFix есть много бесполезных сообщений логирования.
commit3: 修复登录 bug
commit2: 添加 debug 语句
commit1: 添加 console 语句
Например, три записи выше, первые две записи добавляют много кода отладки, и, наконец, ошибка исправлена в последней записи, а код отладки удален. В это время, если вы напрямую объедините ветку bugFix с основной веткой, записи отладки также будут объединены.
В это время вы можете использоватьgit cherry-pick
Объедините только последнюю запись в ветку master. или использоватьgit rebase
Дамп двух других записей из ветки bugFix, а затем слияние.
5. ^
а также ~
разница
оператор^
а также ~
Как и символ, за ним также может следовать число.~
Указывает на необходимость вернуться к нескольким поколениям записей.
Но число после оператора такое же, как~
Последнее различие используется не для указания нескольких поколений для резервного копирования, а для указания количества родительских записей объединенной записи фиксации.
Git по умолчанию выбирает «первую» родительскую запись коммита слияния в операторе^
За которым следует число, чтобы изменить это поведение по умолчанию.
Это может быть нелегко понять, просто взглянув на текст. Давайте рассмотрим несколько примеров.
Выполнение заказаgit checkout main^
Вернитесь к первой родительской записи (где HEAD указывал на c3, теперь он указывает на c1).
Выполнение заказа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
.
использованная литература
- Один компьютер связывает две учетные записи git (GitHub и GitLab)
- Git-tools-переписать историю
- learngitbranching
Добро пожаловать для обсуждения в области комментариев, официальный представитель Nuggets будет вПроект «Звезда раскопок»После мероприятия в области комментариев будет разыграно 100 штук Наггетсов Подробности розыгрыша читайте в статье о мероприятии.