git使用
1. 安装 Git
Windows
- 从 Git 官方网站 下载 Git 安装程序。
- 双击安装程序并按照提示完成安装。
Linux
- 使用包管理器安装 Git(以 Ubuntu 为例):
sudo apt update sudo apt install git
2. 配置 Git
安装完成后,配置用户名和邮箱:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
配置代理前,先确认代理软件实际的 HTTP / mixed 或 SOCKS 端口。Git 的 HTTP 和 HTTPS 传输都使用 http.proxy 配置,不需要另设 https.proxy。
下面先演示只影响一次 Git 命令的 HTTP 代理;地址和端口按实际配置替换:
git -c http.proxy=http://127.0.0.1:7890 ls-remote https://github.com/git/git.git HEAD
需要让目标仓库持续使用该代理时,在仓库目录内设置:
git config --local http.proxy http://127.0.0.1:7890
git config --show-origin --get-all http.proxy
只有明确要影响当前用户的所有仓库时,才改用 --global。SOCKS 入口可以使用 socks5h://127.0.0.1:10808,前提是该端口确实提供 SOCKS 服务;socks5h 让支持它的工具把域名交给代理解析。不要同时把同一个端口假设为 HTTP 和 SOCKS。
修改前记录原值;恢复时还原原值。如果原来没有该配置,才移除本次在对应作用域添加的键,例如:
git config --local --unset http.proxy
环境变量是另一种方式,不同 shell 的写法不同。
Bash / Zsh 当前终端:
export http_proxy="http://127.0.0.1:7890"
export https_proxy="$http_proxy"
PowerShell 当前终端:
$env:http_proxy = "http://127.0.0.1:7890"
$env:https_proxy = $env:http_proxy
这些变量只影响采用它们的当前终端及子进程,不等于已写入 Git 配置。已有 http.proxy 还可能覆盖环境设置,排查时先看配置来源。git@github.com:... 这类 SSH 仓库地址需要单独配置 SSH 连接,不采用这里的 HTTP 代理设置。
3. 创建 SSH Key
如果需要使用 SSH 方式连接 GitHub,生成 SSH key 并添加到 GitHub。
生成 SSH Key
ssh-keygen -t rsa -C "你的邮箱"
按提示操作,默认保存位置即可。生成完成后,使用以下命令查看公钥:
cat ~/.ssh/id_rsa.pub
添加 SSH Key 到 GitHub
- 登录 GitHub,进入 SSH and GPG keys 页面。
- 点击 “New SSH key”,粘贴上一步生成的公钥内容,点击 “Add SSH key”。
4. 创建 Git 仓库
本地仓库
- 创建一个新的目录并进入:
mkdir my_project cd my_project - 初始化 Git 仓库:
git init
远程仓库
- 登录 GitHub,点击右上角 “+”,选择 “New repository”。
- 填写仓库名和描述,点击 “Create repository”。
.gitignore文件用于告诉 Git 哪些文件或目录不应该被添加到版本控制中。它在 Git 项目中非常重要,特别是当你的项目包含一些不需要共享的文件,如编译后的二进制文件、临时文件、或包含敏感信息的配置文件。.gitignore文件通常放在项目的根目录下,但你也可以在子目录中添加.gitignore文件,作用范围仅限于该目录及其子目录。.gitignore文件的语法- 忽略特定文件或目录:在
.gitignore中直接写上文件名或目录名。# 忽略文件 secret.txt # 忽略目录 /logs/ - 通配符:使用
*代表任意字符,?代表单个字符,[abc]代表匹配集合中的任意一个字符。# 忽略所有 .log 文件 *.log # 忽略以 "temp" 开头的文件 temp* # 忽略名为 "backup" 或 "bak" 的文件 *.[bB][aA][kK] - 排除规则:以
!开头的行用于排除某些文件或目录,这些文件即使符合前面的忽略规则也不会被忽略。# 忽略所有 .log 文件,但不忽略 important.log *.log !important.log - 指定路径:使用斜杠
/来表示目录路径。以斜杠开头表示从根目录开始匹配。# 只忽略根目录下的 "config.json",不忽略其他目录中的 "config.json" /config.json
- 忽略特定文件或目录:在
5. 关联本地仓库与远程仓库
在本地仓库中,执行以下命令:
git remote add origin git@github.com:你的用户名/仓库名.git
git remote add 是一个 Git 命令,用于向你的本地仓库添加一个远程仓库。一个远程仓库是一个托管在某个服务器上的 Git 仓库,你可以将本地的更改推送到远程仓库,也可以从远程仓库拉取更新。
origin 是这个远程仓库的名字。你可以把它理解为远程仓库的一个别名,便于你以后引用这个远程仓库。在大多数情况下,origin 是默认的名字,用于指向你克隆的或第一次关联的远程仓库。
通过执行这条命令,你告诉 Git:**这个本地仓库的远程仓库是位于 GitHub 上的 git@github.com:你的用户名/仓库名.git 这个位置,并且将它命名为 origin**。
之后,你可以使用类似 git push origin master 的命令将本地的代码推送到 GitHub 上的远程仓库,或者使用 git pull origin master 从 GitHub 上拉取更新。
6. 基本 Git 操作
添加文件并提交
提交前的工作目录是工作区(文件操作的区域)
添加文件到暂存区:
git add 文件名
这条命令用于将指定的文件添加到 Git 的暂存区(Stage)。暂存区是一个临时区域,你可以在其中暂时存放那些你准备提交到仓库的更改。文件在添加到暂存区之前,可以进行修改,而这些修改不会立即提交到仓库中。
或添加所有文件:
git add .
提交到本地仓库:
git commit -m "提交信息"
这条命令用于将暂存区中的所有内容提交到本地 Git 仓库,并为此次提交添加一条消息。-m "提交信息" 选项允许你在命令行中直接输入一条提交信息,而不需要进入编辑器。
查看暂存区的文件
git status 命令会显示工作区和暂存区的状态,包括哪些文件被修改但尚未添加到暂存区,以及哪些文件已经被添加到暂存区。
git status
输出中,暂存区中的文件会显示在 Changes to be committed 部分。例如:
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: index.html
new file: style.css
这意味着 index.html 文件已被修改并添加到暂存区,而 style.css 是一个新文件,也已经被添加到暂存区。
使用 git diff --cached 查看暂存区的更改
git diff --cached 命令会显示暂存区中的更改细节。这个命令的输出与 git diff 类似,但只显示暂存区中的内容,而不包括工作区中尚未添加到暂存区的修改。
git diff --cached
或者你也可以使用 git diff --staged,效果是一样的。
这个命令将显示具体的代码差异,即哪些行被修改、添加或删除。例如:
diff --git a/index.html b/index.html
index 83b2d7e..e39a4ff 100644
--- a/index.html
+++ b/index.html
@@ -12,7 +12,7 @@
<title>My Website</title>
</head>
<body>
- <h1>Hello, World!</h1>
+ <h1>Welcome to My Website</h1>
</body>
</html>
从 Git 暂存区移除文件
使用 git restore --staged
用于将文件从暂存区移除,并恢复到工作区的状态。
git restore --staged 文件名
使用 git reset
用于回滚或取消更改。使用 git reset 也可以将文件从暂存区移除。
git reset 文件名
移除所有文件
git reset
这将把暂存区中的所有文件全部移除,同时保留它们在工作区中的修改。
恢复工作区文件
git restore --worktree -- test.txt
该命令丢弃 test.txt 的未暂存修改,默认从暂存区恢复,并不一定等于最后一次提交。若明确要从当前提交恢复这一个文件,可使用 git restore --source=HEAD --worktree -- test.txt;执行前先查看差异并保留需要的修改。单独运行 git checkout 不能作为“还原全部文件”的命令。
版本回退
使用 git reset 回退版本
git reset 用于回退到某个特定的提交,并且可以选择性地影响暂存区和工作区。
常用选项:
--soft:仅移动HEAD,不影响暂存区和工作区。回退后的所有更改都保留在暂存区中。(HEAD为当前版本)--mixed(默认选项):移动HEAD,并重置暂存区,但保留工作区的更改。回退后的更改仍在工作区,但不在暂存区。--hard:移动HEAD,同时重置暂存区和工作区。会覆盖受影响的已跟踪工作区和暂存区内容,也可能覆盖妨碍写入的未跟踪文件。未提交内容可能无法恢复;已有提交仍可能通过 reflog 找回。
假设你想回退到特定的提交 abc123。
- 软回退:
这将把当前分支指针(git reset --soft abc123HEAD)移到abc123,但保持工作区和暂存区的所有更改。 - 混合回退:
这将回退到git reset --mixed abc123abc123,并将暂存区重置为该提交的状态,但保留工作区的更改。 - 硬回退:
这会移动当前分支并把暂存区、工作区重置到目标提交。它不是删除所有后续提交对象;已提交历史可能通过 reflog 找回,但未提交内容没有这种保证。先核对目标、差异并保留需要的修改,再决定是否硬回退。git reset --hard abc123
使用 git revert 进行安全回退
git revert 用于生成一个新的提交,该提交会撤销指定的历史提交,而不会改变项目的提交历史。git revert 是一种“安全”的回退方式,因为它保留了所有历史记录。
假设你想撤销提交 abc123。
git revert abc123
这会尝试用一个新提交撤销 abc123 引入的改动,保留既有历史。它可能与后续修改冲突,也可能改变后续代码依赖的行为;不能保证对其他提交的效果完全没有影响。
使用 git checkout 回退到特定提交(仅查看)
git checkout 主要用于切换分支或查看特定提交。你可以暂时回退到某个提交,但不修改当前分支的状态。
假设你想查看 abc123 提交的状态。
git checkout abc123
这将把工作区和暂存区切换到 abc123 提交的状态,但不会更改当前分支的指针。如果你想回到最新的状态,可以使用:
git checkout master
(假设你在 master 分支上)
如何找到提交的哈希值
在执行版本回退前,你需要知道要回退到的提交的哈希值(类似 abc123)。可以使用以下命令查看提交历史:
git log
git log --pretty=oneline # 每个提交显示为一行
这将显示所有提交的日志,包括提交哈希、作者、日期和提交信息。
删除文件
git rm <file>和git add<file>效果是一样的
推送到远程仓库
git push origin master
git remote -v #查看远程库信息
git remote rm origin # 删除关联
克隆远程仓库
git clone git@github.com:你的用户名/仓库名.git
拉取更新
git pull origin master
Git标签
给某个提交打标签(通常用于发布版本):
git tag -a v1.0 -m "版本1.0"
推送标签到远程仓库:
git push origin --tags
7. 分支管理
1. 创建分支
要创建一个新的分支,使用 git branch 命令。新分支会基于你当前所在的分支创建。
git branch feature/new-feature
这会创建一个名为 feature/new-feature 的新分支,但不会切换到该分支。
2. 切换分支
使用 git checkout 或 git switch 来切换到其他分支。在 Git 2.23 之后,Git 引入了 git switch,它专门用于切换分支,更加直观和安全。
git checkout feature/new-feature
或者使用:
git switch feature/new-feature
这将切换到 feature/new-feature 分支,并更新工作区和暂存区以匹配该分支的状态。
3. 创建并切换到新分支
可以使用 git checkout -b 或 git switch -c 在创建新分支的同时切换到该分支。
git checkout -b feature/new-feature
或者使用:
git switch -c feature/new-feature
这将创建 feature/new-feature 分支并立即切换到该分支。
4. 查看分支
要查看所有分支,可以使用 git branch 命令。当前所在的分支会以 * 标记。
git branch
输出示例:
develop
* feature/new-feature
master
这表明你当前在 feature/new-feature 分支上。
5. 合并分支
当你完成了在某个分支上的工作并希望将其合并回主分支(例如 master 或 develop),你可以使用 git merge 命令。
合并分支的步骤:
- 切换到目标分支(通常是 master 或 develop):
git checkout master - 合并工作分支
这将把git merge feature/new-featurefeature/new-feature分支的更改合并到master分支中。如果没有冲突,Git 会自动完成合并。如果有冲突,需要手动解决后再完成合并。
6. 处理合并冲突
当 Git 无法自动合并两个分支时,会提示合并冲突。此时,需要手动编辑冲突的文件,解决冲突后再继续合并。
- 打开冲突文件,找到冲突标记:
<<<<<<< HEAD 当前分支的代码 ======= 被合并分支的代码 >>>>>>> feature/new-feature - 手动解决冲突,编辑文件使其符合预期。
- 标记冲突为已解决并提交:
git add 冲突文件 git commit
7. 删除分支
当一个分支的工作完成且不再需要时,可以将其删除。
删除本地分支:
git branch -d feature/new-feature
如果分支尚未合并,Git 会阻止删除,以防丢失更改。要强制删除,可以使用 -D 选项:
git branch -D feature/new-feature
删除远程分支:
git push origin --delete feature/new-feature
这将删除远程仓库中的 feature/new-feature 分支。
8. 远程分支
远程分支是托管在远程仓库中的分支,例如 GitHub、GitLab 上的分支。通常,当你推送分支到远程仓库时,该分支会自动在远程仓库中创建。
查看远程分支:
git branch -r
这将列出所有远程分支。
推送本地分支到远程:
git push origin feature/new-feature
这会将 feature/new-feature 分支推送到远程仓库的 origin(默认远程名称)上。
9. 跟踪远程分支
你可以将本地分支与远程分支关联,使推送和拉取更方便。
创建跟踪分支:
git checkout -b feature/new-feature origin/feature/new-feature
或者,如果分支已经存在:
git branch --set-upstream-to=origin/feature/new-feature
10. 更新远程分支
要同步本地仓库与远程仓库的状态,使用 git fetch 或 git pull。
拉取更新并合并:
git pull origin master
这将从远程 master 分支拉取最新的更改并合并到当前分支。
仅获取更新(不合并):
git fetch origin
这将更新本地的远程分支信息,但不合并更改。
8.存储进度
git stash 允许你将当前的工作进度(包括工作区和暂存区的更改)暂时存储起来,以便可以在一个干净的工作区中进行其他操作。之后,你可以随时恢复这些存储的更改。
1. 基本命令:git stash
1.1 存储当前工作区和暂存区的更改
git stash
这会将当前分支的工作区和暂存区的所有更改存储起来,工作区将恢复到最后一次提交时的状态。存储的更改会被放入一个“栈”中,供以后恢复使用。
1.2 存储时添加描述信息
你可以为存储的更改添加描述信息,以便更容易区分多个存储。
git stash save "描述信息"
2. 查看存储:git stash list
git stash list
这会列出所有的存储记录,每一条记录都有唯一的索引和描述信息。输出示例:
stash@{0}: WIP on master: 5d1e76a 修复首页布局
stash@{1}: WIP on master: 2a7b8d9 添加新功能
stash@{0} 是最顶部的存储记录,stash@{1} 是次存储记录,依此类推。
3. 恢复存储:git stash pop 和 git stash apply
3.1 git stash pop
git stash pop
这会将最近存储的更改恢复到工作区和暂存区,并将该存储记录从列表中删除。如果有冲突,Git 会提示手动解决冲突。
3.2 git stash apply
git stash apply
这会将最近的存储恢复到工作区和暂存区,但不会删除该存储记录。如果你需要多次应用存储,使用 apply 比 pop 更合适。
3.3 恢复特定存储
如果有多个存储记录,你可以指定恢复某个特定的存储。
git stash apply stash@{1}
这会恢复索引为 stash@{1} 的存储,并保留存储记录。
9.常见的Git Hooks
- pre-commit:在
git commit命令执行之前触发。可以用来执行代码风格检查或静态分析,防止不合格的代码提交。 - commit-msg:在提交信息编辑完成后触发。用于检查提交信息是否符合团队规范(如强制使用特定格式)。
- post-commit:在提交完成后触发。可以用于执行通知或部署任务。
示例:自动检查代码风格
假设你使用pre-commit钩子来检查Python代码的风格是否符合PEP8标准。以下是一个简单的脚本:
#!/bin/sh
files=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$')
if [ -z "$files" ]; then
exit 0
fi
unformatted=$(pycodestyle $files)
if [ ! -z "$unformatted" ]; then
echo "Python代码风格检查失败:"
echo "$unformatted"
exit 1
fi
exit 0
将这个脚本保存为.git/hooks/pre-commit并赋予可执行权限:
chmod +x .git/hooks/pre-commit
评论将在接近此处时加载,也可点击立即加载。