Git 配置与使用

I. 注册账户以及创建仓库

要想使用 GitHub 第一步当然是注册 GitHub 账号了, GitHub 官网地址: https://github.com/ 。 之后就可以创建仓库了,Create a New Repository,填好名称后 Create,之后会出现一些仓库的配置信息,这也是一个 Git 的简单教程。

II. 配置Git

2.1 修改默认 HOME 目录

2.1.1 打开环境变量设置

  1. 按下 【Win + R】,输入 sysdm.cpl,回车。

  2. 进入“系统属性” -> 高级 -> 环境变量。

2.1.2 添加或修改 HOME 环境变量

  1. 在“系统变量” 中,点击“新建”或“编辑”。

  2. 变量名:

1
HOME
  1. 变量值,填写你想设置的路径,比如:
1
C:\Users\[UserName]\Git

2.1.3 验证修改

设置完成后,关闭并重新打开 Git Bash 或其他终端工具。输入以下命令验证:

1
echo $HOME

2.2 修改窗口大小

在新的 Git Home 目录下,新建 .minttyrc 文件,内容如下:

1
2
3
4
5
Language=zh_CN
Font=Maple Mono SC NF
FontHeight=12
Columns=120
Rows=40

📌 包含如下手动设置内容:

  • 界面语言
    Git Bash » 标题栏 » Options » Window –> UI language –> zh_CN
  • 字体
    Git Bash » 标题栏 » 选项 » 文本 –> 字体 –> Hack, 12pt
  • 窗口
    Git Bash » 标题栏 » 选项 » 窗口 –> 默认大小 –> 列数:120,行数:40

2.3 本地创建项目目录

1
E:\Codes\Java

2.4 配置 vim

在创建的项目目录下右键 Git Bash Here

1
2
3
4
5
# 先备份 vim
cp /etc/vimrc /etc/vimrc.bak

#配置 vim 
vim vimrc

添加自定义配置文件:

1
curl https://gitee.com/zanxj/vimrc/raw/main/vimrc > ~/.vimrc

2.5 Git 基础配置

1
2
3
4
5
6
git config --global user.name "userName"
git config --global user.email userName@example.com
git config --global core.editor vim
git config --global color.ui true
git config --global core.autocrlf input
git config --global core.safecrlf true

换行符配置( 参考文档 ):

📌 换行符说明:
提交时把 CRLF 转换为 LF,检出时把 LF 转换为 CRLF(适用 Windows)
git config --global core.autocrlf true
提交时转换为 LF,检出时不转换(适用 macOS/Linux)
git config --global core.autocrlf input
提交检出均不转换
git config --global core.autocrlf false
拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
允许提交包含混合换行符的文件
git config --global core.safecrlf false
提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

查看配置信息

1
git config --list

指定检查 Git 某一项配置

1
git config user.name

置空(删除)某一项配置

1
git config --global --unset core.editor vim

获取帮助

1
git help config

2.6 统一换行符

参考: 解决不同系统换行符号导致的Git同步问题

1、在 Git Home 目录创建 .gitattributes 文件:

1
touch ~/.gitattributes

插入以下内容:

1
2
3
4
5
6
# Auto detect text files and perform LF normalization * text=auto eol=lf
* text=auto eol=lf

# To use only for specific files, such as .sh or .py, you can use:
# *.sh text eol=lf
# *.py text eol=lf

2、配置全局生效

1
git config --global core.attributesfile ~/.gitattributes

3、重新规范化(可选)

1
2
3
4
5
6
7
# 1. 首先提交当前的更改(如果有的话)
git add .
git commit -m "Save current changes"

# 2. 然后重新规范化文件
git add --renormalize .
git commit -m "Normalize line endings"

III. 创建版本库

1、版本库又名仓库,英文名repository,可以简单理解成一个目录:

1
2
mkdir repo
cd repo

⚠️ 警告:
如果你使用 Windows 系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

2、通过 git init 命令把这个目录变成Git可以管理的仓库

1
git init

3、编写文件 readme.txt ,放入 git 仓库

1
git add readme.txt

4、用命令 git commit 告诉 git,把文件提交到仓库

1
 git commit -m "wrote a readme file"

可以多次 add 不同文件,比如:

1
2
3
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files"

修改仓库文件后,用命令 git status 命令查看结果:

1
git status

用命令 git diff 查看修改内容

1
git diff readme.txt

IV. 版本控制

4.1 版本回退

查看最近到最远的提交日志

1
git log

如果嫌输出信息太多,可以加上 --pretty=oneline

1
git log --pretty=oneline

要退回上一个版本,Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,也就是最新的提交的版本,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100

现在,我们要把当前版本回退到上一个版本,就可以使用 git reset 命令:

1
git reset --hard HEAD^

查看回退版本的内容

1
cat readme.txt

回退到指定版本

1
git reset --hard 1094a

1094a 为 commit id ,查找 commit id 命令

1
git reflog

4.2 工作区和暂存区

工作区就是你在电脑里能看到的目录,比如前面创建的 repo 文件夹就是一个工作区。

版本库(Repository)
工作区有一个隐藏目录 .git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有Git为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD

Pic_2024-08-26_224910.png

4.3 管理修改

查看工作区和版本库里面最新版本的区别

1
git diff HEAD -- readme.txt 

4.4 撤销修改

4.4.1 撤销工作区的修改

使用命令:git checkout -- file

1
git checkout -- readme.txt

命令 git checkout -- readme.txt 意思就是,把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:

  • 一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次 git commitgit add 时的状态。

⚠️ 警告:
git checkout -- file 命令中的 -- 很重要,没有 -- ,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到 git checkout 命令。

4.4.2 撤销暂存区修改

使用命令:git reset HEAD <file>

1
git reset HEAD readme.txt

git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示最新的版本。

丢弃工作区修改

1
2
git checkout -- readme.txt
git status

4.5 删除文件

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用 rm 命令删了:

1
rm test.txt

一种情况确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit

1
2
git rm test.txt
git commit -m "remove test.txt"

💡 Tips:
先手动删除文件,然后使用 git rm <file>git add<file> 效果是一样的。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

1
git checkout -- test.txt

git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

⚠️ 警告:
从来没有被添加到版本库就被删除的文件,是无法恢复的!

V. 远程仓库

5.1 SSH Key 配置

使用 SSH 连接到 GitHub:点 这里

5.1.1 检查现有 SSH 密钥

在生成 SSH 密钥之前,您可以检查是否有任何现有的 SSH 密钥

📢 注意:
DSA 密钥 (SSH-DSS) 不再受支持。 现有密钥将继续运行,但您不能将新的 DSA 密钥添加到您的 GitHub 帐户。

a. 打开 Git Bash

b. 输入 ls -al ~/.ssh 以查看是否存在现有 SSH 密钥

1
2
ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

c. 检查目录列表以查看是否已经有 SSH 公钥。 默认情况下,公钥的文件名是以下之一

  • id_rsa.pub
  • id_ecdsa.pub
  • id_ed25519.pub

d. 若第三方导入的密钥应注意其权限

1
2
cd ~/.ssh/
chmod 644 id_ed25519

5.1.2 生成新 SSH 密钥

1
ssh-keygen -t ed25519 -f ./your_host_name_ed25519 -C "your_email@example.com"
  • Linux 实例:
1
ssh-keygen -o -a 512 -t ed25519 -f ~/.ssh/aliyun_ed25519 -C "your_email@example.com"
  • Windows 实例
1
ssh-keygen -t ed25519 -f /e/path/yx_ed25519 -C "your_email@example.com"

📢 注意:
如果您使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:
ssh-keygen -t rsa -b 4096 -f server-name_id_rsa -C "your_email@example.com"

📌 参数说明:
-o:(小写)使用新的 OpenSSH 格式(而不是 PEM 格式)保存私钥。实际上,当您将密钥类型指定为 ed25519 时,就隐含了此选项;
-a:保存私钥时,该选项指定了所使用的 KDF(密钥生成函数,目前为 bcrypt_pbkdf(3))轮数。 轮数越多,口令验证速度越慢,密码被盗时的暴力破解能力越强。 默认值为 16 轮。
-t:指定要创建的密钥类型。 可能的值有 ecdsaecdsa-sked25519ed25519-skrsa
-C:用于指定注释的选项。它是纯粹的信息,可以是任何东西。但它通常填充<login>@<hostname>谁生成了密钥;
-f:指定生成的密钥文件的文件名。如果您希望 SSH 代理自动发现它,则必须将它存储在主目录中的默认 .ssh 目录中;
-i:读取未加密的 ssh-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示 openssh 兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;

后面的 your_email@example.com 改为你在 GitHub 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在 Git 家目录下生成 .ssh 文件夹,进去打开 id_ed25519.pub,复制里面的 key 到剪切板。

1
clip < ~/.ssh/your_host_name_ed25519.pub

5.1.3 添加 SSH key 到 Github

回到 GitHub 上,进入 Account Settings(账户配置),左边选择 SSH and GPG keys –> New SSH key , Title 随便填,粘贴 id_ed25519.pub 的内容到 Key。

Pic_2024-08-26_225010.png

为了验证是否成功,在git bash下输入:

1
2
3
4
5
6
7
8
# Github 测试
ssh -T git@github.com 

# Gitee 测试
ssh -T git@gitee.com

# Coding.net 测试
ssh -T git@e.coding.net

📌 参数说明:
-T :不显示终端,只显示连接成功信息。

ℹ️ 信息:
如果是第一次的会提示是否 continue,输入 yes 就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上 GitHub 。

若测试连接不成功,可用如下命令来调试连接:

1
ssh -v git@github.com

📢 注意:
认证私钥与 Git 家目录下 .ssh 目录中私钥文件名是否一致,若不一致可参考 Git 多账号配置。

Git 多账户共存

5.2 添加远程库

5.2.1 创建远程库(略)

5.2.2 本地仓库关联远程库

1
2
3
4
5
6
7
8
cd repertory
git init -b main
git remote add origin git@github.com:user/repo.git
git pull --rebase origin main
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin master

📢 注意:
user/repo.git 替换为正确的账户名仓库名
添加后,远程库的名字就是 origin,这是 Git 默认的叫法。

把本地库的内容推送到远程,用 git push 命令,实际上是把当前分支 master 推送到远程。

由于远程库是空的,我们第一次推送 master 分支时,加上了 -u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。

1
git push origin master

5.2.3 删除远程库

如果添加的时候地址写错了,或者就是想删除远程库,可以用 git remote rm <name> 命令。使用前,建议先用 git remote -v 查看远程库信息:

1
git remote -v

然后,根据名字删除,比如删除 origin

1
git remote rm origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。

5.3 从远程库克隆

使用命令 git clone 克隆一个本地库:

1
git clone git@github.com:account/repo.git

VI. 分支管理

6.1 创建与合并分支

6.1.1 创建并切换到 dev 分支

1
git switch -c dev

git checkout 命令加上 -b 参数表示创建并切换,相当于以下两条命令:

a. 创建 dev 分支

1
git branch dev

b. 切换到 dev 分支

1
git switch dev

然后,用 git branch 命令查看当前分支:

1
git branch

6.1.2 合并分支

dev 分支与 master 分支合并(当前在 master 分支)

1
git merge dev

合并完成后,就可以放心地删除 dev 分支了:

1
git branch -d dev

删除后,查看 branch,就只剩下 master 分支了:

1
git branch

6.1.3 提交本地分支到远程仓库

语法:git push origin 本地分支名

下面这条命令表示把本地 dev 分支提交到远程仓库,即创建了远程分支 dev

1
git push origin dev

6.1.4 删除远程分支

1
git push --delete origin dev

6.2 解决冲突

参考样例:点 这里 使用 git log 命令查看分支合并情况:

1
git log --graph --pretty=oneline --abbrev-commit

git log 的常用选项:

选项说明
-p按补丁格式显示每个提交引入的差异。
–stat显示每次提交的文件修改统计信息。
–shortstat只显示 –stat 中最后的行数修改添加移除统计。
–name-only仅在提交信息后显示已修改的文件清单。
–name-status显示新增、修改、删除的文件清单。
–abbrev-commit仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
–relative-date使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
–graph在日志旁以 ASCII 图形显示分支与合并历史。
–pretty使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
–oneline–pretty=oneline –abbrev-commit 合用的简写。

6.3 多人协助

查看远程仓库信息,用 git remote

1
git remote

或者,用 git remote -v 显示更详细的信息:

1
git remote -v

6.3.1 推送分支

把本地分支推送到远程远程仓库对应分支:

1
git push origin master

如果要推送到其它分支,比如 dev ,就改成:

1
git push origin dev

6.3.2 抓取分支

克隆远程分支

1
git clone git@github.com:account/repo.git

创建远程 origindev 分支到本地

1
git switch -c dev origin/dev

指定本地 dev 分支与远程 origin/dev 分支的链接

1
 git branch --set-upstream-to=origin/dev dev

VII. 标签管理

7.1 创建标签

查看当前所在分支

1
git branch

切换到需要打标签的分支上:

1
git switch master

使用命令 git tag <name> 就可以打一个新标签:

1
git tag v1.0

📢 注意:
标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么在这两个分支上都可以看到这个标签。

7.2 操作标签

如果标签打错了,可以删除:

1
git tag -d v1.0

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

如果要推送某个标签到远程,使用命令 git push origin <tagname>

1
git push origin v1.0

或者,一次性推送全部尚未推送到远程的本地标签:

1
git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

1
git tag -d v0.9

然后,从远程删除。删除命令也是push,但是格式如下:

1
git push origin :refs/tags/v0.9

看看是否真的从远程库删除了标签,可以登陆远程仓库查看。

VIII. 参考文档

参考文档:点 这里