Git Cheat Sheet
Git 基本概念回顾
- 工作区 (Workspace):你正在编辑的文件目录。
- 暂存区 (Index / Stage):一个临时的存储区域,用于存放你准备提交的更改。
- 本地仓库 (Local Repository):你本地机器上的完整项目历史记录。
- 远程仓库 (Remote Repository):托管在网络服务器上的项目仓库,用于团队协作。
- HEAD:一个指针,通常指向当前所在的分支的最新提交。
初始化与配置 (Initialization & Configuration)
| 命令 | 描述 |
|---|---|
git init | 在当前目录下创建一个新的 Git 仓库。 |
git init [project-name] | 创建一个名为 [project-name] 的新目录,并将其初始化为 Git 仓库。 |
git clone [url] | 克隆一个远程仓库到本地,并自动将其命名为 origin。 |
git clone [url] [new-name] | 克隆一个远程仓库到本地,并自定义本地仓库的目录名。 |
git config --global user.name "[name]" | 设置全局提交者姓名,所有本地仓库都会使用这个配置。 |
git config --global user.email "[email address]" | 设置全局提交者邮箱,所有本地仓库都会使用这个配置。 |
git config --local user.name "[name]" | 仅为当前仓库设置提交者姓名。 |
git config --list | 显示所有 Git 配置信息(包括全局和本地)。 |
git config -l --show-origin | 显示所有 Git 配置信息及其来源文件。 |
日常工作流程 (Staging & Committing)
| 命令 | 描述 |
|---|---|
git status | 显示工作区和暂存区的状态,查看哪些文件被修改、暂存或未被跟踪。 |
git status -s 或 git status --short | 以简短的格式显示状态。 |
git add [file] | 将指定文件的更改添加到暂存区。 |
git add . | 将当前目录下所有更改(新增、修改、删除)添加到暂存区。 |
git add -u | 将所有已跟踪文件的修改和删除操作添加到暂存区,但不包括新文件。 |
git add -p | 进入交互模式,逐块选择要暂存的更改。 |
git commit -m "[message]" | 将暂存区的内容提交到本地仓库,并附上提交信息。 |
git commit -am "[message]" | 将所有已跟踪文件的更改先添加到暂存区,然后一次性提交。相当于 git add -u && git commit -m。 |
git commit --amend | 修改最后一次的提交。可以修改提交信息,或将新的暂存更改合并到上一次提交中。 |
分支管理 (Branching & Merging)
| 命令 | 描述 |
|---|---|
git branch | 列出所有本地分支,当前分支会用 * 标记。 |
git branch -r | 列出所有远程分支。 |
git branch -a | 列出所有本地和远程分支。 |
git branch [branch-name] | 创建一个新分支,但不会切换过去。 |
git checkout [branch-name] | 切换到指定分支,并更新工作区。 |
git checkout -b [branch-name] | 创建一个新分支,并立即切换到该分支。 |
git checkout -b [branch-name] [remote-name]/[remote-branch-name] | 基于远程分支创建一个新的本地分支,并切换过去。 |
git merge [branch-name] | 将 [branch-name] 分支的历史合并到当前分支。这会创建一个新的合并提交。 |
git merge --no-ff [branch-name] | 使用“非快进”(Non-Fast-Forward)模式合并,即使可以快进也会创建一个新的合并提交,以保留分支历史。 |
git merge --squash [branch-name] | 将 [branch-name] 上的所有提交合并成一个单一的提交放在当前分支,但不会自动提交。 |
git branch -d [branch-name] | 删除一个已经完全合并到当前分支的分支。 |
git branch -D [branch-name] | 强制删除一个分支,即使它还没有被合并。 |
git branch -m [old-name] [new-name] | 重命名一个本地分支。 |
变基 (Rebasing)
变基是合并分支的另一种方式,它可以使提交历史更整洁。
| 命令 | 描述 |
|---|---|
git rebase [base-branch] | 将当前分支的提交“变基”到 [base-branch] 之上,即把当前分支的提交在 [base-branch] 的最新提交之后重放一遍。 |
git rebase -i [commit-hash] 或 git rebase -i HEAD~N | 进入交互式变基模式,可以对最近的 N 个提交进行编辑、合并、拆分或重新排序。 |
git rebase --continue | 在解决完变基冲突后,继续执行变基操作。 |
git rebase --abort | 取消当前的变基操作,回到变基之前的状态。 |
git rebase --skip | 跳过当前导致冲突的提交,继续变基。 |
远程协作 (Remotes & Syncing)
| 命令 | 描述 |
|---|---|
git remote -v | 显示所有配置的远程仓库及其 URL。 |
git remote add [name] [url] | 添加一个新的远程仓库,并为其指定一个名称(通常是 origin)。 |
git remote remove [name] | 删除一个远程仓库的配置。 |
git remote rename [old-name] [new-name] | 重命名一个远程仓库。 |
git fetch [remote] | 从远程仓库下载最新的对象和引用,但不会自动合并到你的本地分支。 |
git fetch --prune | 在下载前,删除远程仓库中已经不存在的远程跟踪分支。 |
git pull [remote] [branch] | 从远程仓库拉取最新的变动,并尝试合并到当前分支(相当于 git fetch + git merge)。 |
git pull --rebase | 使用变基的方式来合并远程更改,而不是创建合并提交。 |
git push [remote] [branch] | 将本地分支的提交推送到指定的远程仓库分支。 |
git push -u [remote] [branch] | 首次推送一个新分支时使用,它会设置本地分支跟踪对应的远程分支。 |
git push [remote] --delete [branch] | 删除一个远程分支。 |
git push [remote] --force | 强制推送,会覆盖远程仓库的历史。慎用! |
git push [remote] --force-with-lease | 更安全的强制推送,如果远程分支在你上次拉取后有新的提交,则会推送失败。 |
检查历史与撤销操作 (Inspection & Undoing)
| 命令 | 描述 |
|---|---|
git log | 显示从最新到最旧的提交历史。 |
git log --oneline | 以简洁的单行格式显示提交历史。 |
git log --graph | 以图形化的方式显示分支合并历史。 |
git log --stat | 显示每次提交的文件变更统计。 |
git log -p | 显示每次提交的详细差异。 |
git log --author="[name]" | 查找特定作者的提交。 |
git log --grep="[pattern]" | 在提交信息中搜索匹配特定模式的提交。 |
git show [commit-hash] | 显示某次提交的详细信息和变更内容。 |
git diff | 显示工作区和暂存区之间的差异。 |
git diff --staged 或 git diff --cached | 显示暂存区和上次提交之间的差异。 |
git diff [branch1]..[branch2] | 显示两个分支之间的差异。 |
git reset [file] | 将文件从暂存区移出,但保留工作区的修改。 |
git reset [commit-hash] | (mixed 模式) 撤销到指定的提交,保留工作区的修改,但将这些修改移出暂存区。 |
git reset --soft [commit-hash] | (soft 模式) 撤销到指定的提交,保留工作区的修改,并将这些修改保留在暂存区。 |
git reset --hard [commit-hash] | (hard 模式) 彻底回退到指定的提交,丢弃之后的所有提交以及工作区和暂存区的所有更改。慎用! |
git revert [commit-hash] | 创建一个新的提交,内容与指定提交相反,用于“撤销”某次提交,是一种更安全的回退方式。 |
git checkout -- [file] | 丢弃工作区中对指定文件的修改,恢复到上次提交时的状态。 |
git clean -fd | 删除所有未被跟踪的文件和目录。慎用! -n 选项可以预览将要删除的内容。 |
储藏 (Stashing)
当你需要临时切换分支,但又不想提交当前不完整的代码时,可以使用储藏功能。
| 命令 | 描述 |
|---|---|
git stash | 将当前工作区的修改(已跟踪文件)和暂存区的修改储藏起来,让工作区变干净。 |
git stash save "[message]" | 储藏并附带一条描述信息。 |
git stash list | 列出所有储藏的记录。 |
git stash apply | 应用最近一次的储藏,但不会从储藏列表中删除它。 |
git stash pop | 应用最近一次的储藏,并从储藏列表中删除它。 |
git stash drop stash@{n} | 删除指定的储藏。 |
git stash clear | 删除所有储藏。 |
高级命令 (Advanced Commands)
| 命令 | 描述 |
|---|---|
git tag [tag-name] | 在当前提交上创建一个轻量标签。 |
git tag -a [tag-name] -m "[message]" | 创建一个带附注的标签,包含作者、日期和信息。推荐使用此方法。 |
git tag | 列出所有标签。 |
git push [remote] [tag-name] | 将指定标签推送到远程仓库。 |
git push [remote] --tags | 将所有本地标签一次性推送到远程仓库。 |
git reflog | 显示 HEAD 的移动历史记录,包括被删除的提交和分支切换。是恢复误操作的强大工具。 |
git cherry-pick [commit-hash] | 将指定的提交应用到当前分支,生成一个新的提交。 |
git bisect start | 启动二分查找,用于快速定位引入 bug 的提交。 |
git bisect good [commit] / git bisect bad [commit] | 在二分查找过程中标记“好”的提交和“坏”的提交。 |
git bisect reset | 结束二分查找。 |
git submodule add [repository-url] [path] | 将一个 Git 仓库作为子模块添加到你的项目中。 |
git blame [file] | 逐行显示指定文件的每一行是由谁在哪次提交中最后修改的。 |
