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 "你的邮箱"
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 checkout -- test.txt
git checkout # 直接还原为最新版本
是用于丢弃工作区中对 txt
文件的所有未提交更改的命令。具体来说,它将 txt
文件恢复到最后一次提交时的状态。
版本回退
使用 git reset
回退版本
git reset
用于回退到某个特定的提交,并且可以选择性地影响暂存区和工作区。
常用选项:
--soft
:仅移动HEAD
,不影响暂存区和工作区。回退后的所有更改都保留在暂存区中。(HEAD为当前版本)--mixed
(默认选项):移动HEAD
,并重置暂存区,但保留工作区的更改。回退后的更改仍在工作区,但不在暂存区。--hard
:移动HEAD
,同时重置暂存区和工作区。回退后的所有更改都被删除,不可恢复。
假设你想回退到特定的提交 abc123
。
软回退:
git reset --soft abc123
这将把当前分支指针(
HEAD
)移到abc123
,但保持工作区和暂存区的所有更改。混合回退:
git reset --mixed abc123
这将回退到
abc123
,并将暂存区重置为该提交的状态,但保留工作区的更改。硬回退:
git reset --hard abc123
这将回退到
abc123
,并删除所有在abc123
之后的更改。这个操作不可逆,因此使用前请务必确认。
使用 git revert
进行安全回退
git revert
用于生成一个新的提交,该提交会撤销指定的历史提交,而不会改变项目的提交历史。git revert
是一种“安全”的回退方式,因为它保留了所有历史记录。
假设你想撤销提交 abc123
。
git revert abc123
这将生成一个新的提交,它的作用是撤销 abc123
所做的更改,而不会影响 abc123
之前或之后的其他提交。
使用 git checkout
回退到特定提交(仅查看)
git checkout
主要用于切换分支或查看特定提交。你可以暂时回退到某个提交,但不修改当前分支的状态。
假设你想查看 abc123
提交的状态。
git checkout abc123
这将把工作区和暂存区切换到 abc123
提交的状态,但不会更改当前分支的指针。如果你想回到最新的状态,可以使用:
git checkout master
(假设你在 master
分支上)
如何找到提交的哈希值
在执行版本回退前,你需要知道要回退到的提交的哈希值(类似 abc123
)。可以使用以下命令查看提交历史:
git log
git log --pretty=oneline # 显示一行
git reset --hard HEAD^ # 回退上一个版本
git reset --hard HEAD^^ # 同理
git reset --hard HEAD~10
这将显示所有提交的日志,包括提交哈希、作者、日期和提交信息。
删除文件
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-feature
这将把
feature/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