占位符:在文档或教程中 < >、[ ]、{ } 这种括号, 一般都是“说明用途”,实际命令里不要输入括号本身。

🧩 一、配置命令(Config)

Git是分布式版本控制系统→每个机器都必须自报家门:名字和Email地址。


配置用户名:设置全局 Git 用户名

git config --global user.name “你的名字”

--global参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。


配置邮箱:设置全局 Git 用户邮箱

git config --global user.email “你的邮箱”


查看所有配置:列出当前生效的 Git 配置

git config --list


查看单个配置项:查看指定配置的值

git config user.name


设置默认编辑器:配置 Git 提交信息编辑器

git config --global core.editor “vim”


设置别名:给常用命令起别名

git config --global alias.st status

📦 二、仓库(版本库)操作(Repository)

初始化仓库:在当前目录创建 .git 文件夹

git init


克隆远程仓库:从远程服务器复制项目到本地

git clone < url >


克隆指定分支:只克隆远程仓库中的某个分支

git clone -b <分支> < url >

📝 三、文件与提交(Add & Commit)

查看状态:显示暂存区与工作区的变更

git status


添加文件到暂存区:将指定文件加入暂存区

git add <文件>


添加所有修改:将所有更改的文件加入暂存区

git add .


撤销暂存区文件:从暂存区移除文件但保留修改

git reset <文件>


提交更改:提交暂存区内容到版本库

git commit -m “提交说明”


提交更改(打开编辑器):不加 -m 手动输入提交信息

git commit


修改上一次提交:追加或修正文案

git commit --amend


删除文件:删除并提交记录删除操作

git rm <文件>


重命名文件:重命名并提交

git mv <旧文件> <新文件>

🔍 四、查看差异(Diff)

查看工作区与暂存区差异

git diff


查看暂存区与最新提交差异

git diff --staged


查看工作区与最新提交差异

git diff HEAD


比较两个分支差异

git diff <分支1> <分支2>

🌿 五、分支管理(Branch)

查看本地分支

git branch


查看远程分支

git branch -r


查看所有分支

git branch -a

创建新分支

git branch <分支名>


切换分支

git checkout <分支名>


创建并切换分支

git checkout -b <分支名>


使用 switch 切换分支

git switch <分支名>


使用 switch 创建并切换分支

git switch -c <分支名>


合并分支

git merge <分支名>


删除本地分支(安全删除)

git branch -d <分支名>


强制删除本地分支

git branch -D <分支名>

🌍 六、远程仓库(Remote)

查看远程仓库地址

git remote -v


添加远程仓库

git remote add origin


删除远程仓库

git remote remove origin


推送分支

git push origin <分支>


推送分支并建立跟踪

git push -u origin <分支>


删除远程分支

git push origin --delete <分支>


拉取更新并合并

git pull origin <分支>


获取远程更新(不合并)

git fetch origin


清理远程已删除的分支

git fetch -p

⏪ 七、撤销与回退(Reset & Revert)

回退到指定版本(软):保留修改

git reset --soft <版本号>


回退到指定版本(混合):重置暂存区但保留工作区

git reset --mixed <版本号>


回退到指定版本(硬):清空暂存区和工作区

git reset --hard <版本号>


撤销文件修改

git checkout -- <文件>


新版撤销文件修改

git restore <文件>


反向提交撤销

git revert <版本号>

📜 八、查看历史(Log & Show)

查看提交日志

git log


查看简洁日志

git log --oneline


图形化显示分支历史

git log --graph --oneline --decorate --all


查看操作记录(包括 reset/revert 等)

git reflog


查看提交详情

git show <版本号>


查看文件修改历史

git blame <文件>

🏷️ 九、标签管理(Tag)

查看所有标签

git tag


创建轻量标签

git tag <标签名>


创建附注标签

git tag -a <标签名> -m "说明"


查看标签详情

git show <标签名>


删除本地标签

git tag -d <标签名>


删除远程标签

git push origin :refs/tags/<标签名>


推送标签

git push origin <标签名>


推送所有标签

git push origin --tags

📥 十、Stash(临时保存)

临时保存当前修改

git stash


保存并添加说明

git stash save “说明”


查看所有保存记录

git stash list


应用指定保存

git stash apply stash@{0}


应用并删除保存

git stash pop


删除指定保存

git stash drop stash@{0}


清空所有保存

git stash clear

🧱 十一、子模块(Submodule)

添加子模块

git submodule add <路径>


初始化并更新子模块

git submodule update --init


遍历更新所有子模块

git submodule foreach git pull

十二、其他高级操作(Advanced)

复制指定提交

git cherry-pick <提交号>


二分查找问题提交(start)

git bisect start


标记错误提交

git bisect bad


标记正常提交

git bisect good <提交号>


变基操作

git rebase <分支>


交互式变基

git rebase -i HEAD~3


删除未跟踪文件

git clean -f


删除未跟踪文件和目录

git clean -fd


基础知识

  • Git 仓库: 用来保存项目的元数据和对象数据库的地方

  • 工作目录: 对项目的某个版本独立提取出来的内容

  • 暂存区域: 是一个文件,保存了下次将提交的文件列表信息(快照)

Git 有三种状态: 已提交(committed)、已修改(modified)、已暂存(staged)。

  • 已提交: 表示数据已保存在本地数据库中。 如果 Git 目录中保存着的特定版本文件,就属于已提交状态。

  • 已修改: 表示修改了文件,但还没保存到数据库中。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 (工作目录)

  • 已暂存: 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 如果作了修改并已放入暂存区域,就属于已暂存状态。


工作目录下的文件状态:已跟踪 或 未跟踪。

已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。

未跟踪文件: 除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。

初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。


通过 git add 命令来实现对指定文件的跟踪:

1、查看初始状态

$ git status 
nothing to commit, working directory clean:

当前目录下没有出现任何处于未跟踪状态的新文件;所有已跟踪文件在上次提交后都未被更改过

2、新建一个README文件,将看到一个新的未跟踪文件

未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

3、使用命令 git add 开始跟踪一个文件,会看到 README 文件已被跟踪,并处于暂存状态(Changes to be committed 下方)

git add : 可以用于开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。

$ git add README
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

4、修改一个已被跟踪的文件

如果修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,运行 git status 命令:

文件 CONTRIBUTING.md 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -\- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

5、运行 git add 将”CONTRIBUTING.md”放到暂存区,然后再看看 git status 的输出

$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

6、在 CONTRIBUTING.md 里再加注释,运行 git status

$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

Changes not staged for commit:(未暂存清单当前工作目录)
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -\- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

CONTRIBUTING.md 文件同时出现在暂存区和非暂存区:实际上 Git 只暂存了运行 git add 命令时的版本, 如果现在提交,CONTRIBUTING.md 的版本是你最后一次运行 git add 命令时的那个版本,而不是你运行 git commit 时,在工作目录中的当前版本。 所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来。


git diff : 比较工作目录中当前文件暂存区域快照之间的差异, 即修改之后还没有暂存起来的变化内容。(看暂存前后的变化:)

git diff --cached : 查看已经暂存起来的变化 (--staged 和 --cached 是同义词)


Fetch(获取) : 从远程仓库下载最新的变更到你的本地仓库,但不会自动合并到你的工作目录。

Push(推送) : 将你本地的提交上传到远程仓库。

fetch 远程 → 本地 下载更新信息 安全,只读

push 本地 → 远程 上传本地提交 可能被拒绝

pull 远程 → 本地 下载并合并更新 可能产生冲突


从远程仓库中抓取与拉取

$ git fetch [remote-name]

访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。


推送到远程仓库

git push [remote-name] [branch-name]。

当你想要将 master 分支推送到 origin 服务器时

git push origin master

只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。


分支

Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。

HEAD 指向当前所在的分支,初始默认master,随着提交操作(commit后生成一个指向当前分支的指针)自动向前移动

  • 分支创建 git branch { }

  • 分支切换 git checkout { }

  • 分支合并 git merge { }