Article

Git 入门指南

安装指引

在 Windows 下安装

打开 Git 官网,下载会自动开始,运行下载的可执行文件跟随指引安装。

在 Linux 下安装

Debian/Ubuntu

用以下命令来安装最新的发布版 Git:

sudo apt-get install git

Ubuntu 系统还可使用以下命令来安装最新的稳定 Upstream 版 Git:

sudo add-apt-repository ppa:git-core/ppa
sudo apt update; apt install git

RedHat 企业版 Linux,Oracle Linux 等其他衍生版本可使用 dnf 命令来安装:

sudo dnf install git-all

在 Mac OS X 下安装

Homebrew

如果你安装了 Homebrew,可以通过以下命令来安装:

brew install git

安装包安装

从 Git官网 下载后根据提示安装。

Git 基础信息设置

初始化用户信息

在第一次安装并使用 Git 时,有可能会遇到无法推送的情况。那是因为还没有配置使用者信息。可以使用如下命令设置。

git config --global user.name "xxx"             # 配置用户名
git config --global user.email "xxx@xxx.com"    # 配置邮件(优先建议适用各代码托管平台的隐私邮箱,原因后续会说)

⚠️特别说明:
有些人可能会使用 "--system" 参数设置用户信息,个人使用一般情况下也是可以的。“system” 的设置的是系统所有用户的配置信息,“global” 的设置的是当前用户的配置信息。

隐私邮箱问题

如果你在 GitHub 开启了“Keep my email addresses private”(保持邮箱私有),并且勾选了“Block command line pushes that expose my email”(阻止暴露我邮箱的命令行推送),当你尝试 git push 时,终端会返回如下 GH007 错误:

remote: error: GH007: Your push would publish a private email address.
remote: You can verify your email address configuration here: https://github.com/settings/emails
To https://github.com/username/repo.git
 ! [remote rejected] main -> main (push declined due to email privacy restrictions)
error: failed to push some refs to 'https://github.com/username/repo.git'

解决方案: 登录 GitHub,点击头像 -> Settings,在左侧菜单选择 Emails,在 "Keep my email addresses private" 选项下方,会看到一个系统分配的隐私邮箱地址。通常格式为:ID+用户名@users.noreply.github.com。然后重新执行上面的邮箱设置命令即可。

换行符问题

当执行代码提交操作时,可能会遇到如下提示信息,这就是最常见的换行符问题。

简单解释就是,Git 发现文件里用的是 LF(Linux风格)。又因为是在 Windows 上干活,为了在本地编辑器里看着舒服,所以把本地文件变成了 CRLF。但是!当提交到仓库里时,Git 会自动帮你把它们都变回 LF。

warning: LF will be replaced by CRLF in file_name.txt.
The file will have its original line endings in your working directory.

解决方案: 让 Git 在提交时把 CRLF 转成 LF,在检出时把 LF 转成 CRLF(为了兼容 Windows 工具)。

git config --global core.autocrlf true

系统代理

在中国大陆使用代理软件(VPN/梯子)并且开了全局模式,Git 在执行部分操作时依旧报错。SSH 的进阶操作,这里不做展示。如有需要请自行修改相关配置文件。

# 查看当前 Git 全局代理信息 (HTTP/HTTPS 协议)
git config --global http.proxy
git config --global https.proxy

# 设置 Git 代理 (HTTP/HTTPS 协议)
# 端口号仅作示例展示,实际使用请替换为实际端口号。
git config --global http.proxy 'http://127.0.0.1:7890'  # 设置http代理
git config --global https.proxy 'socks5://127.0.0.1:7890' # 设置https代理

# 取消 Git 代理
git config --global --unset http.proxy
git config --global --unset https.proxy

# 只对 github.com 设置代理
git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global https.https://github.com.proxy http://127.0.0.1:7890

Git 基础命令

这里的命令一般是项目初始化阶段和日常的开发循环过程中会涉及的命令。

init:初始化

作用:在当前文件夹创建一个新的空 Git 仓库。

git init  # 完成项目的初始化

clone:克隆

作用:下载远程仓库 https://github.com/username/project.git 的所有内容(代码、历史记录)并将其同步到本地的当前目录下。

git clone https://github.com/username/project.git

remote:远程管理

作用:管理远程仓库的连接。

git remote -v                     # 查看当前的远程仓库地址
git remote add origin <URL>       # 添加一个新的远程地址,命名为 origin

add:添加/暂存

作用:将文件添加到“暂存区”。这是提交前的准备步骤。

git add .           # 添加当前目录下的所有变动(最常用)
git add file.txt    # 添加指定文件

commit:提交

作用:将“暂存区”的内容正式存入版本历史。必须写提交信息。

git commit -m "修复了登录页面的Bug"

push:推送

作用:将本地的 commit 上传到远程服务器。

git push origin main    # 将本地代码推送到远程的 main 分支

pull:拉取

作用:从远程获取更新并与本地代码合并(相当于 fetch + merge)。

git pull origin main

Git 进阶命令

branch:分支管理

作用:列出、创建或删除分支。

git branch                # 列出所有本地分支
git branch new-feature    # 创建一个名为 new-feature 的新分支
git branch -d old-branch  # 删除分支

checkout:切换/检出

作用:切换分支,或者丢弃本地修改。

git checkout main          # 切换回 main 分支
git checkout -b dev        # 创建并立即切换到 dev 分支
git checkout -- file.txt   # 危险操作:丢弃 file.txt 的所有修改,恢复到上一次提交的状态

⚠️特别说明:
新版 Git 推荐用 git switch 切换分支,但 checkout 依然通用)

merge:合并

作用:将指定分支的代码合并到当前分支。

git checkout main   # 从当前分支切换回 main 分支
git merge dev       # 将 dev 开发分支合并进 main 分支

log:日志

作用:查看提交历史列表。

git log            # 查看详细历史
git log --oneline  # 查看简洁的一行历史(推荐)

show:展示

作用:查看某一次提交的具体代码变动。

git show               # 查看最近一次提交的详情
git show <commit-hash> # 查看指定 ID 的提交详情

grep:搜索

作用:在项目的所有文件中搜索关键词(比普通搜索更快,因为它只搜 Git 跟踪的文件)。

git grep "password"  # 查找哪里写了 password 这个词

stash:暂存(隐藏)

作用:你正在写代码,突然需要切换分支修复 Bug,但现在的代码还不想提交。用 stash 把现场“藏”起来。

git stash       # 暂存当前所有修改(工作区瞬间变干净)

# ...去修其他 Bug...

git stash pop   # 恢复刚才暂存的修改,继续干活