Git常用命令
· 5348 字
以下是 Git 日常开发中的常用命令速查,按使用场景分类整理,方便随时查阅。
配置与初始化
| 命令 | 说明 |
|---|---|
git config --global user.name "用户名" | 配置全局用户名 |
git config --global user.email "邮箱" | 配置全局邮箱 |
git config --list | 查看当前所有配置项 |
git init | 在当前目录初始化一个 Git 仓库 |
git clone 地址 [-b 分支] | 首次克隆项目,可选 -b 指定分支 |
git remote -v | 查看远程仓库地址 |
日常操作
| 命令 | 说明 |
|---|---|
git status | 查看工作区代码相对于暂存区的差别 |
git add . | 将当前目录下修改的所有代码从工作区添加到暂存区(. 代表当前目录) |
git commit -m '注释' | 将暂存区内容添加到本地仓库 |
git push origin 分支 | 将本地版本库推送到远程服务器 |
git fetch origin master | 从远程仓库获取最新版本到本地仓库(不合并) |
git merge origin/master | 把远程下载下来的代码合并到本地仓库,远程的和本地的合并 |
git pull | 拉取远程代码并合并到当前分支(相当于 fetch + merge) |
查看差异:
# 查看工作区与暂存区的差异
git diff
# 查看已暂存内容与最新提交的差异
git diff --cached
# 比较本地仓库和远程仓库的区别
git log -p master.. origin/master
git fetch只下载不合并,git pull=git fetch+git merge。需要先审查改动再决定是否合并时,优先用git fetch。
分支管理
| 命令 | 说明 |
|---|---|
git branch | 查看本地分支 |
git branch -a | 查看所有分支(含远程分支) |
git branch 分支名 | 新建分支 |
git checkout -b 分支名 | 新建并切换到该分支 |
git switch 分支名 | 切换分支(较新语法,推荐) |
git switch -c 分支名 | 新建并切换分支 |
git merge 分支 | 合并分支(将指定分支合并到当前分支) |
git branch -d 分支名 | 删除本地分支(安全删除) |
git branch -D 分支名 | 强制删除本地分支 |
git push origin --delete 分支名 | 删除远程分支 |
git branch -m 新分支名 | 重命名当前分支 |
只合并一个 commit(把指定提交应用到当前分支):
git cherry-pick <hashcode>
撤销与回退
回退版本
# 显示提交日志,找到目标 commit id
git log
# 回退到指定版本(工作区与暂存区都回到该版本)
git reset --hard <id>
git reset 三种模式对比:
| 模式 | 暂存区 | 工作区 | 说明 |
|---|---|---|---|
--soft | 保留 | 保留 | 只移动 HEAD,改动留在暂存区,可重新提交 |
--mixed(默认) | 重置 | 保留 | 撤销暂存,改动退回工作区 |
--hard | 重置 | 重置 | 彻底丢弃改动,慎用 |
撤销 commit
# 撤销最近一次 commit,改动保留在暂存区(不删除改动)
git reset --soft HEAD^
# 通过新建一个反向提交来撤销某次提交(不改写历史,适合已推送的提交)
git revert <hashcode>
修改 commit 注释
git commit --amend
撤销 add(取消暂存)
# 查看当前暂存区的文件
git status -s
# 取消暂存(退回到工作区)
git reset HEAD
暂存改动(stash)
# 暂存当前未提交的改动
git stash
# 查看暂存列表
git stash list
# 恢复最近一次暂存的改动,并删除该暂存
git stash pop
# 恢复但不删除暂存
git stash apply
找回丢失的提交
# 查看所有 HEAD 移动记录,即使被 reset 也能找回
git reflog
历史查看
# 查看提交历史
git log
# 单行简洁显示
git log --oneline
# 图形化显示分支合并历史
git log --oneline --graph --all
# 查看某文件每行最后修改人
git blame <file>
远程仓库
更新本地代码
更新前建议的流程:
git status:查看本地分支文件信息,确保更新时不产生冲突git checkout -- [file name]:若文件有修改,可以还原到最初状态;若文件需要更新到服务器上,应该先 merge 到服务器,再更新本地git branch:查看当前分支情况git checkout <remote>/<branch>:若分支为本地分支,则需要切换到服务器远程分支git pull:若命令成功,则更新代码
关联多个远程仓库(Gitee / GitHub 同步)
# 在已有项目中关联 github 仓库
git remote add github https://github.com/ccnuu/parent.git
# 推送到 github 仓库
git push github [master]
# 删除 git 默认远程仓库名称
git remote rm origin
# 删除 git 关联的远程仓库名称
git remote rm github
git remote: HTTP Basic: Access denied
原因:本地 git 配置的用户名、密码与 GitLab 上注册的用户名、密码不一致。
解决:
- 如果账号密码有变动,用这个命令
git config --system --unset credential.helper重新输入账号密码,应该就能解决。 - 如果用了第一个命令还不能解决问题,用这个命令:
git config --global http.emptyAuth true。 - 如果以上两个方法都不起作用,采用以下方法:进入「控制面板 -> 用户账号 -> 凭据管理器 -> Windows 凭据 -> 普通凭据」,在里面找到 git,点开编辑密码,更新为最新密码之后就可以正常操作了。
SSH 密钥与代理
生成密钥公钥
ssh-keygen -t rsa -C "your_email@youremail.com"
本地代理(socks)
安装代理工具:
yay -S proxychains
配置 proxychains:
sudo vim /etc/proxychains.conf
# 末尾添加
socks5 127.0.0.1 7890
然后再配置 clash,混合开启两个端口:混合端口(7897)和 socks 端口(7890)。
编辑 SSH 配置文件(vim ~/.ssh/config),添加以下内容:
Host github.com
# 告诉 SSH 不要提示用户确认主机指纹
StrictHostKeyChecking no
# 告诉 SSH 将主机指纹信息写入 /dev/null(一个虚拟的空设备),这样每次连接都会被当作是第一次,但因为我们禁用了检查,所以不会有问题。这避免了每次都要确认指纹的麻烦
UserKnownHostsFile /dev/null
使用示例:
proxychains4 git clone git@github.com:llvm/llvm-project.git
子模块
| 命令 | 说明 |
|---|---|
git submodule add <仓库地址> [路径] | 添加子模块,会在根目录生成 .gitmodules 文件 |
git submodule init | 初始化子模块(将 .gitmodules 配置注册到 .git/config) |
git submodule update | 检出子模块对应的提交 |
git submodule update --init --recursive | 初始化并递归更新所有子模块 |
git submodule update --remote | 拉取子模块的最新远程提交 |
git submodule sync | 同步子模块配置(远程地址变更后使用) |
git clone --recurse-submodules <仓库地址> | 克隆项目时自动初始化并检出所有子模块 |
添加子模块
# 在 libs/sub 目录下添加子模块
git submodule add https://github.com/example/sub.git libs/sub
# 添加后生成 .gitmodules 记录路径与远程地址,记得提交
git add .gitmodules libs/sub
git commit -m "添加子模块 sub"
克隆含子模块的项目
# 克隆时自动初始化并检出所有子模块
git clone --recurse-submodules https://github.com/example/main.git
若已克隆但忘记带 --recurse-submodules,可补上:
# 同步子模块配置
git submodule sync
# 初始化并递归更新子模块
git submodule update --init --recursive
git submodule init只把.gitmodules中的配置注册到本地,并不会下载代码;需要再执行git submodule update才会检出。二者合并即git submodule update --init。
更新子模块
# 拉取所有子模块的最新远程提交
git submodule update --remote
# 仅更新指定子模块
git submodule update --remote libs/sub
--remote会将子模块指向其远程仓库的最新提交,更新后需要在主仓库提交一次以记录新的指针。
删除子模块
# 1. 取消暂存子模块
git submodule deinit -f libs/sub
# 2. 从工作区删除子模块文件
git rm -f libs/sub
# 3. 删除 .git/modules 下的子模块目录
rm -rf .git/modules/libs/sub
# 4. 提交更改
git commit -m "移除子模块 sub"
删除后若
.gitmodules仍残留对应条目,需手动清理后再提交。