1.GIT核心概念回顾
工作目录 (Working Directory):您在电脑上能看到的文件和文件夹,是您进行代码修改的地方。
暂存区 (Staging Area / Index):一个位于 .git 目录下的文件,它记录了您下次要提交(commit)的文件快照。git add 命令就是将工作目录的修改添加到这里。
本地仓库 (Local Repository):您本地电脑上存储项目历史记录的地方。当您运行 git commit 时,GIT 会将暂存区的文件快照永久性地保存到您的本地仓库中。
远程仓库 (Remote Repository):托管在网络服务器上的项目仓库,用于团队协作和数据备份(例如 GitHub、GitLab)。
2.初始化与配置
这类命令用于开始一个新项目或配置您的 Git 环境。
|-----------------------------------------|------------------------------------------------------------------------------|
| 命令 | 解释与修正 |
| git init <目录> | 在指定目录中创建一个新的、空的 Git 仓库。如果省略目录,则在当前目录创建。 |
| git clone <仓库地址> | 克隆一个远程仓库到本地,自动设置好远程连接。 |
| git config --global user.name <名字> | (修正) 设置全局的用户名,所有本地仓库都会使用这个配置。 |
| git config --global user.email <邮箱> | (修正) 设置全局的用户邮箱。PDF 中有一处误写为 user.name <email>。 |
| git config --global alias.<别名> <命令> | 为 Git 命令设置别名,提高效率。例如 git config --global alias.glog "log --graph --oneline"。 |
| git config --global core.editor <编辑器> | 配置 Git 默认使用的文本编辑器,例如 vim 或 vscode。 |场景: 你想开始一个名为 my-project 的新项目,并配置好你的个人信息。
解释: 这会在 my-project 文件夹中创建一个新的 .git 子目录,你的项目现在就是一个 Git 仓库
bashmkdir my-project cd my-project git init
场景: 你想参与一个 GitHub 上的开源项目。
解释: 这会将远程的 Git 项目完整地复制到你本地的 git 文件夹中。
bashgit clone https://github.com/git/git.git
场景: 第一次使用 Git,你需要设置你的名字和邮箱,这样你的提交才会被正确标识。
解释: 设置了全局的用户名和邮箱。现在你在这台电脑上的所有 Git 操作都会使用这个身份。
bashgit config --global user.name "Your Name" git config --global user.email "youremail@example.com"
3.日常基本工作流程
这是您每天都会用到的核心命令。
|---------------------------------------|---------------------------------------------------------------------------------|
| 命令 | 解释与补充 |
| git status | 显示工作目录和暂存区的状态,查看哪些文件被修改、暂存或未被跟踪。 |
| git add <文件/目录> | 将工作目录中指定文件/目录的修改添加到暂存区。 |
| git add -p | (交互模式) 逐个代码块地将修改添加到暂存区,非常适合用于拆分提交。 |
| git commit -m "<提交信息>" | 将暂存区的所有内容生成一次新的提交,并附上提交信息。 |
| git commit -a -m "<信息>" | (补充) 将所有已跟踪文件的修改自动暂存,然后提交。相当于 git add . 和 git commit 的结合,但不会添加新创建的(未跟踪的)文件。 |
| git diff | 查看工作目录 和暂存区之间的差异。 |
| git diff --cached 或 git diff --staged | 查看暂存区 和上一次提交 (HEAD) 之间的差异。 |
| git diff HEAD | 查看工作目录 和上一次提交 (HEAD) 之间的差异。 |场景 : 你在项目中创建了一个新文件 index.html 并添加了一些内容,现在你想把它提交到仓库。
命令: git status
解释: Git 告诉你有一个 "未跟踪" 的文件 index.html。
bashOn branch main Untracked files: (use "git add <file>..." to include in what will be committed) index.html
命令: git add index.html
解释 : 将 index.html 文件添加到暂存区,准备提交。再次运行 git status 会看到文件状态变成了 "Changes to be committed"。
命令: git commit -m "feat: Create initial index.html"
解释: 将暂存区中的所有内容(也就是 index.html)创建成一次新的提交,并附上提交信息。
命令: git diff
场景 : 你修改了 index.html 但还没有 git add。
解释: 显示你当前工作目录的修改与暂存区内容的区别。
命令: git diff --cached
场景 : 你修改了 index.html 并且已经 git add 了,但又在工作区做了新的修改。
解释 : 显示暂存区的内容和上一次提交 (HEAD) 的区别。
4.查看历史与状态
用于浏览和检查项目的提交历史。
|----------------------------|------------------------------------------------------------------|
| 命令 | 解释与补充 |
| git log | 显示从最近到最远的提交历史。 |
| git log --oneline | 以单行简洁模式显示提交历史。 |
| git log --graph | 以图形化方式显示分支的合并历史。 |
| git log -<数量> | 仅显示最近指定数量的提交,例如 git log -5。 |
| git log --author="<作者名>" | 按作者搜索提交。 |
| git show <提交ID> | 显示某次提交的详细信息,包括元数据和代码变动。 |
| git reflog | (非常重要) 显示 HEAD 的所有移动记录。当您错误地重置(reset)或修改了历史时,可以用它来找回"丢失"的提交。 |场景 : 项目已经进行了一段时间,你想看看提交历史。
命令: git log
解释: 显示详细的提交历史,包括提交 ID、作者、日期和完整的提交信息。
命令: git log --oneline --graph
解释: 以简洁的单行格式显示历史,并用 ASCII 图形画出分支的合并情况,非常直观。
命令: git show a1b2c3d4 (这里的 a1b2c3d4 是某次提交 ID 的前几位)
解释: 显示某次特定提交的详细元数据和代码变动。
命令: git reflog
场景: 你用 git reset --hard 错误地删掉了一次提交,现在想找回来。
解释: reflog 会显示 HEAD 的所有移动记录。你可以从中找到误删操作之前的提交 ID,然后用 git reset --hard <找回的ID> 来恢复。
5.分支管理
分支是 Git 的核心功能之一,用于并行开发。
|--------------------------|---------------------------------------|
| 命令 | 解释与补充 |
| git branch | 列出所有本地分支,并标识出当前所在分支。 |
| git branch <分支名> | 创建一个新分支,但不会自动切换过去。 |
| git checkout <分支名> | 切换到指定分支。 |
| git checkout -b <新分支名> | 创建一个新分支并立即切换过去。 |
| git switch <分支名> | (推荐使用) 这是较新的命令,专门用于切换分支。 |
| git switch -c <新分支名> | (推荐使用) 创建并切换到新分支,功能同 checkout -b。 |
| git merge <分支名> | 将指定分支的历史合并到当前分支。 |场景 : 你要开发一个新功能 "user-login",但不想影响主分支 main 的稳定性。
命令: git switch -c feature/user-login (等同于旧的 git checkout -b feature/user-login)
解释: 创建一个名为 feature/user-login 的新分支,并立即切换到这个分支上。
命令: git switch main
解释 : 切换回 main 主分支。
命令: git merge feature/user-login
解释 : 在 main 分支上,将 feature/user-login 分支的所有提交合并进来。现在 main 分支也拥有了登录功能。
6.撤销工作区或暂存区的修改
|-----------------------------|----------------------------------------------------------|
| 命令 | 解释与补充 |
| git restore <文件> | (新增&推荐) 撤销工作目录中对文件的修改,恢复到暂存区或上一次提交的状态。 |
| git restore --staged <文件> | (新增&推荐) 将文件从暂存区移出,但保留工作目录中的修改。效果同 git reset <文件>。 |
| git checkout -- <文件> | (旧命令) 功能同 git restore <文件>,丢弃工作目录的修改。 |
| git reset <文件> | (旧命令) 功能同 git restore --staged <文件>,取消暂存。 |命令 : git restore index.html (撤销工作区修改)
场景: 你把 index.html 改乱了,想撤销所有修改,回到上次提交时的状态。解释 : 丢弃工作目录中对 index.html 的所有修改。
命令 : git restore --staged config.log (取消暂存)
场景: 你不小心用 git add 把一个不想提交的文件 config.log 加入了暂存区。
解释 : 将 config.log 从暂存区移出,但文件在工作目录的修改内容仍然保留。
7.修改提交历史记录(重置,恢复,修正)
|----------------------------|----------------------------------------------------------------------------|
| 命令 | 解释与补充 |
| git commit --amend | 修改最后一次提交 。将暂存区的修改合并到 HEAD 提交中,可以用来修改提交内容或仅仅修改提交信息。注意:这会生成一个新的提交ID。 |
| git revert <提交ID> | "反转"一次提交。它会创建一个新的提交,其内容正好与指定提交的内容相反,用于安全地撤销已推送到远程仓库的提交。 |
| git reset <提交ID> | 移动当前分支的指针。它有三种模式,这是理解的关键: |
| git reset --soft <提交ID> | 最轻量 :仅将 HEAD 指针移动到目标提交。您的暂存区和工作目录 的修改都保留。常用于合并多个提交。 |
| git reset --mixed <提交ID> | 默认模式 :移动 HEAD 指针,并重置暂存区 。您的工作目录 的修改保留。常用于拆分提交。 |
| git reset --hard <提交ID> | 最彻底 :移动 HEAD 指针,并重置暂存区和工作目录 。所有未提交的修改都会被永久删除,请谨慎使用! |命令 : git commit --amend -m "feat: Create initial index.html" (修改最后一次提交)
场景: 你刚提交完,发现提交信息里有个错别字。
解释: 这会用新的提交信息覆盖掉上一次的提交。如果你在运行此命令前 git add 了新文件,这些文件也会被一并添加到上一次提交中。
命令: git revert a1b2c3d4
场景: 你推送了一个有 Bug 的提交 a1b2c3d4 到远程仓库,团队其他人已经拉取了。直接 reset 会搞乱别人的历史,所以需要安全地撤销。
解释 : Git 会创建一个新的提交 ,这个新提交的内容刚好与 a1b2c3d4 的修改完全相反,从而抵消了它的影响。
命令: git reset --soft HEAD~3
场景: 你在本地连续做了 3 次提交,但觉得它们其实应该合并成一个。
解释 : 将 main 分支的指针退后 3 次提交,但所有的代码修改都保留在暂存区 。现在你只需要运行一次 git commit -m "feat: Implement the whole feature" 就可以将这 3 次提交合并成一次了。
8.交互式基础(变基 -i)
git rebase -i <基底提交> 是一个强大的历史编辑工具,可以用来实现您笔记中提到的"交换提交顺序"和"修改非头部提交"。
在交互界面中,您可以对每个提交执行以下操作:
pick: 保留该提交。
reword: 保留该提交,但修改提交信息。
edit: 保留该提交,但暂停 rebase 过程,让您可以修改提交内容(例如拆分提交)。
squash: 将该提交与前一个提交合并,并合并提交信息。
fixup: 同 squash,但丢弃该提交的提交信息。
drop: 删除该提交。
通过拖动行的顺序,可以交换提交的先后顺序。
9.远程仓库协作
|-------------------------------|------------------------------------------------------------------------------------|
| 命令 | 解释与补充 |
| git remote -v | 显示所有远程连接的详细信息。 |
| git remote add <别名> <URL> | 添加一个新的远程仓库连接。 |
| git fetch <远程别名> | 从远程仓库下载最新的历史记录,但不会自动合并到您当前的工作分支。 |
| git pull <远程别名> <分支> | 从远程仓库拉取最新历史并自动合并 (merge) 到当前分支。相当于 git fetch + git merge。 |
| git pull --rebase | 使用 rebase 而不是 merge 来合并远程更改,可以保持提交历史的线性整洁。 |
| git push <远程别名> <分支> | 将本地分支的提交推送到远程仓库。 |
| git push --force | (危险) 强制推送,会覆盖远程仓库的历史。强烈建议使用 --force-with-lease 作为更安全的选择,它能确保您不会覆盖团队成员的新提交。 |场景 : 你在本地 main 分支完成了新功能,现在要把它推送到 GitHub。
命令: git remote add origin https://github.com/your-username/my-project.git
解释 : 添加一个名为 origin 的远程仓库地址。origin 是一个普遍使用的别名。
命令 : git fetch origin
场景: 在推送前,你想看看远程仓库有没有你不知道的更新。
解释: 从 origin 下载所有最新的分支和提交历史到你的本地,但它不会修改你当前的工作代码。
命令 : git pull origin main
场景: 你的同事更新了 main 分支,你需要将这些更新同步到你的本地。
解释: 从远程的 main 分支拉取最新代码,并自动与你的本地 main 分支合并。
命令: git push origin main
解释: 将你本地 main 分支上的所有新提交推送到名为 origin 的远程仓库的 main 分支上。
10.补充重要命令
|-----------------|---------------------------------------------------|
| 命令 | 解释与补充 |
| git stash | 暂存工作。将您当前工作目录和暂存区中未提交的修改临时保存起来,让您可以切换到其他分支工作。 |
| git stash pop | 恢复最近一次暂存的工作。 |
| git stash list | 查看所有暂存的列表。 |
| git tag <标签名> | 为某次提交打上一个有意义的标签,通常用于标记版本发布,如 v1.0.0。 |