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>

远程仓库

更新本地代码

更新前建议的流程:

  1. git status:查看本地分支文件信息,确保更新时不产生冲突
  2. git checkout -- [file name]:若文件有修改,可以还原到最初状态;若文件需要更新到服务器上,应该先 merge 到服务器,再更新本地
  3. git branch:查看当前分支情况
  4. git checkout <remote>/<branch>:若分支为本地分支,则需要切换到服务器远程分支
  5. 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 上注册的用户名、密码不一致。

解决

  1. 如果账号密码有变动,用这个命令 git config --system --unset credential.helper 重新输入账号密码,应该就能解决。
  2. 如果用了第一个命令还不能解决问题,用这个命令:git config --global http.emptyAuth true
  3. 如果以上两个方法都不起作用,采用以下方法:进入「控制面板 -> 用户账号 -> 凭据管理器 -> 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 仍残留对应条目,需手动清理后再提交。