基础配置与初始化
用户信息
-
设置(全局)
arduinogit config --global user.name "你的名字" git config --global user.email "你的邮箱" -
查看
arduinogit config user.name git config user.email
别名配置
-
设置别名 (以
st代替status为例)csharpgit config --global alias.st status -
常用别名示例
perlgit config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
其他全局配置
-
启用颜色输出
arduinogit config --global color.ui true -
全局忽略文件配置
可以创建一个全局的
.gitignore_global文件,忽略所有仓库都通用的文件(如编辑器临时文件、操作系统生成的文件等)。luagit config --global core.excludesfile ~/.gitignore_global然后在
~/.gitignore_global中写入忽略规则。
初始化仓库
-
将当前目录变为 Git 仓库
csharpgit init -
查看当前目录
bashpwd
生成 SSH Key(用于远程连接)
perl
ssh-keygen -t rsa -C "your_email@example.com"
文件操作:添加、删除、移动
添加文件到暂存区(git add)
| 命令 | 说明 |
|---|---|
git add <file> |
添加指定文件 |
git add . |
添加当前目录所有变更(包括新增、修改、删除) |
git add -A |
等同于 git add --all,添加所有变更(工作区根目录下所有变更) 注 :在 Git 2.x 中无论当前目录位置都会添加全部变更,旧版行为略有不同,推荐直接使用 --all 避免歧义。 |
git add -u |
只添加已跟踪文件的修改(不处理未跟踪文件) |
git add -p |
交互式选择部分修改添加 |
git add -i |
进入交互式添加模式 |
git add -f |
强制添加被 .gitignore 忽略的文件 |
删除文件(git rm)
-
删除工作区文件并暂存删除操作
bashgit rm <file> -
仅从 Git 中删除(保留本地文件)
bashgit rm --cached <file> -
递归删除目录
bashgit rm -r <dir> -
强制删除(文件有未提交修改时)
bashgit rm -f <file>
移动或重命名文件(git mv)
bash
git mv <old-name> <new-name> # 重命名文件并自动暂存
git mv <file> <destination>/ # 移动文件到其他目录
该命令相当于运行了 mv 命令后执行了 git add 和 git rm,简化了操作。
提交与查看历史
提交暂存区内容(git commit)
-
标准提交(打开编辑器输入信息)
sqlgit commit -
直接提交带消息
sqlgit commit -m "提交说明" -
跳过暂存区,直接提交已跟踪文件的修改
sqlgit commit -a -m "提交说明" -
修改最近一次提交(可修改信息或补充文件)
sqlgit commit --amend -
指定作者/日期
inigit commit --author="作者名 <email>" --date="YYYY-MM-DD HH:MM:SS"
查看状态(git status)
-
详细状态
luagit status -
简洁输出
luagit status -s -
显示被忽略的文件
luagit status --ignored
查看提交历史(git log)
-
完整日志
bashgit log -
单行简洁显示
luagit log --oneline -
图形化显示分支合并图
cssgit log --graph --pretty=oneline --abbrev-commit -
显示最近 N 条
bashgit log -n 5 -
显示每次提交的差异:
bashgit log -p -
显示统计信息:
bashgit log --stat -
高级筛选
-
按提交信息关键词过滤
inigit log --grep="关键词" -
按代码变更内容搜索(pickaxe)
bashgit log -S"要搜索的代码片段"
-
其他查看命令
-
逐行追溯文件(谁在什么时候修改了哪一行)
xmlgit blame <file> -
生成简短的提交统计(用于快速发布日志)
bashgit shortlog git shortlog -sn # 按提交数量排序显示贡献者 -
在版本库中搜索文本 (比系统
grep更快,且只搜索 tracked 文件)perlgit grep "要搜索的文字" git grep -n "文字" # 显示行号
查看操作历史(git reflog)
-
记录所有 HEAD 移动历史,可用于找回丢失的提交
git reflog提示 :
@是 HEAD 的简写,例如git show @{yesterday}可查看昨天 HEAD 指向的提交。
比较差异(git diff)
| 命令 | 作用 |
|---|---|
git diff |
工作区 vs 暂存区 |
git diff --staged 或 --cached |
暂存区 vs 最新提交(HEAD) |
git diff HEAD |
工作区 vs 最新提交(所有未提交修改) |
git diff <commit1> <commit2> |
两个提交之间的差异 |
git diff <branch1> <branch2> |
两个分支之间的差异 |
git diff -- <file> |
查看某个文件的修改 |
git diff --stat |
仅显示统计信息 |
git diff --name-only |
仅显示文件名 |
git diff --word-diff |
按单词显示差异 |
git diff -w |
忽略空格差异 |
撤销与恢复
工作区修改的撤销
-
丢弃单个文件的修改(不可恢复)
luagit checkout -- <file> -
丢弃所有工作区修改(慎用)
erlanggit checkout . -
新版推荐 (
git restore)xmlgit restore <file>
暂存区修改的撤销
-
将文件从暂存区移回工作区 (取消
git add)perlgit reset HEAD <file> -
取消所有暂存
perlgit reset HEAD . -
新版推荐
cssgit restore --staged <file>
版本回退(git reset)
git reset 有三种主要模式:
--soft:仅移动 HEAD 指针,保留暂存区和工作区(即撤销提交,但修改仍暂存)--mixed(默认):移动 HEAD,清空暂存区但保留工作区(撤销提交和暂存,修改仍在工作区)--hard:移动 HEAD,清空暂存区并丢弃工作区修改(彻底回到指定提交的状态,慎用)
-
回退到上一个版本(保留工作区修改)
perlgit reset --soft HEAD^ # 保留暂存区 git reset --mixed HEAD^ # 保留工作区,清空暂存区(默认)
-
彻底回退到指定提交(丢弃之后的所有修改)
cssgit reset --hard <commit-id> -
回退部分文件到指定版本(不影响其他文件)
sqlgit checkout <commit-id> -- <file> git commit -m "回退文件"
恢复误删的文件
-
从版本库恢复
luagit checkout -- <file>
使用 git revert 安全撤销合并提交
-
创建一个反向提交(推荐用于已推送的合并)
sqlgit revert -m 1 <merge-commit>
分支管理
创建与切换分支
-
传统方式
csharpgit branch <branch-name> # 创建分支 git checkout <branch-name> # 切换分支 git checkout -b <new-branch> # 创建并切换 -
新版方式 (
git switch)csharpgit switch -c <new-branch> # 创建并切换 git switch <branch> # 切换已有分支
查看分支
-
本地分支
git branch -
所有分支(包括远程)
cssgit branch -a
合并分支
-
将指定分支合并到当前分支
sqlgit merge <branch> -
禁用 Fast-Forward 合并(保留分支历史)
perlgit merge --no-ff -m "说明" <branch> -
压缩合并(Squash)
sqlgit merge --squash <branch> git commit -m "合并说明" -
中止合并(解决冲突时)
sqlgit merge --abort
删除分支
-
删除本地已合并分支
xmlgit branch -d <branch> -
强制删除未合并分支
xmlgit branch -D <branch> -
删除远程分支
perlgit push origin --delete <branch> # 或 git push origin :<branch>
储藏工作现场(git stash)
-
临时保存修改 (包括未跟踪文件加
-u)perlgit stash push -m "描述" -
查看储藏列表
git stash list -
恢复储藏
perlgit stash apply # 恢复但不删除 git stash pop # 恢复并删除 -
删除储藏
perlgit stash drop <stash@{n}> git stash clear # 删除所有
挑选提交(git cherry-pick)
将某个(或某几个)提交的更改应用到当前分支,常用于从其他分支移植特定修改。
python
git cherry-pick <commit-id> # 应用单个提交
git cherry-pick <commit1> <commit2> # 应用多个提交
git cherry-pick <branch> # 应用分支的最新提交
如果出现冲突,解决后执行 git cherry-pick --continue,或使用 --abort 中止。
变基操作(git rebase)
变基可以整理提交历史,使分支看起来像基于最新目标分支开发。
-
将当前分支变基到目标分支
xmlgit rebase <branch> -
交互式变基(修改历史提交)
bashgit rebase -i HEAD~n # 修改最近 n 个提交 -
变基过程中
- 解决冲突后:
git add <file>→git rebase --continue - 跳过当前提交:
git rebase --skip - 中止变基:
git rebase --abort
- 解决冲突后:
注意:变基会改写提交历史,不要对已推送到远程的分支执行变基(除非你清楚后果)。
分支高级操作
-
只合并部分文件到当前分支
sqlgit checkout <source-branch> -- <file1> <file2> git commit -m "合并部分文件" -
建立本地分支与远程分支的关联
inigit branch --set-upstream-to=origin/<remote-branch> -
拉取远程分支到本地
xmlgit checkout -b <local-branch> origin/<remote-branch>
远程仓库操作
克隆远程仓库(git clone)
-
基本克隆
bashgit clone <url> [本地目录名] -
克隆指定分支
xmlgit clone -b <branch> <url> -
浅克隆(只拉取最近一次提交)
bashgit clone --depth 1 <url> -
克隆并初始化子模块
bashgit clone --recurse-submodules <url>
查看远程仓库信息
git remote -v
添加远程仓库
xml
git remote add <remote-name> <url>
远程仓库管理
-
重命名远程仓库
sqlgit remote rename <old-name> <new-name> -
删除远程仓库
arduinogit remote remove <remote-name>
推送本地分支(git push)
-
首次推送并建立关联
perlgit push -u origin <branch> -
常规推送
perlgit push origin <branch> -
强制推送(谨慎)
cssgit push --force origin <branch> -
更安全的强制推送
csharpgit push --force-with-lease origin <branch> -
删除远程分支
perlgit push origin --delete <branch>
拉取远程更新(git pull)
-
拉取并合并 (默认
merge)xmlgit pull origin <branch> -
拉取并使用变基
cssgit pull --rebase -
自动储藏本地修改后拉取
cssgit pull --autostash
从远程抓取但不合并(git fetch)
sql
git fetch origin
git fetch --tags # 抓取所有标签
清理远程已删除分支的本地记录
css
git fetch -p
关联多个远程库
- 只需添加不同名称的远程库即可。
子模块操作
-
添加子模块
csharpgit submodule add <repository> [路径] -
初始化并更新子模块(克隆后或拉取更新后)
cssgit submodule update --init --recursive -
更新所有子模块到最新提交
sqlgit submodule update --remote
标签管理
创建标签
-
轻量标签
xmlgit tag <tag-name> -
附注标签(推荐)
arduinogit tag -a <tag-name> -m "说明" -
为历史提交打标签
pythongit tag -a <tag-name> <commit-id> -m "说明"
查看标签
-
列出所有标签
git tag -
查看标签详情
sqlgit show <tag-name>
删除标签
-
本地删除
xmlgit tag -d <tag-name> -
远程删除
rubygit push origin --delete <tag-name> # 或 git push origin :refs/tags/<tag-name>
推送标签
-
推送单个标签
perlgit push origin <tag-name> -
推送所有未推送的标签
cssgit push origin --tags
基于标签创建分支
xml
git checkout -b <branch> <tag-name>
忽略文件(.gitignore)
- 在仓库根目录创建
.gitignore文件,写入要忽略的文件模式(如*.log、node_modules/)。 .gitignore本身应纳入版本管理。
高级技巧与注意事项
二分查找(git bisect)
快速定位引入 bug 的提交。
perl
git bisect start
git bisect bad # 当前版本有问题
git bisect good <已知好版本> # 标记一个好版本
# Git 会切换到中间提交,测试后标记 good/bad,重复直到找到首个坏提交
git bisect reset # 结束二分查找,回到原分支
解决冲突
- 手动编辑冲突文件,保留所需内容,然后
git add标记为已解决,最后git commit。
理解工作区、暂存区、版本库
- 工作区:本地文件系统看到的文件。
- 暂存区 (Index):
git add后的存放区域,等待提交。 - 版本库 (Repository):
git commit后的永久存储。
HEAD 的含义
-
HEAD 指向当前分支的最新提交。
HEAD^表示上一个版本,HEAD~100表示前 100 个版本。HEAD^和HEAD~在大多数情况下可以互换,但严格来说:HEAD^指当前提交的父提交(用于合并提交时可加数字指定第几个父提交,如HEAD^2表示第二个父提交)。HEAD~指当前提交的第一父提交的线性历史,HEAD~2表示向前两个提交(忽略合并分支)。
提示 :@ 是 HEAD 的简写,例如 git show @~3 等价于 git show HEAD~3。
查看命令帮助
- 任何命令加
--help可查看详细文档,如git add --help。