常用命令
一、仓库初始化与克隆
初始化本地仓库
Link to original cd my-project git init
克隆远程仓库到本地
Link to original # 克隆远程仓库到本地 git clone 远程仓库 # 克隆指定分支 git clone -b develop 远程仓库
二、配置
config 配置
Link to original # 查看配置 git config --list # 设置全局用户名+邮箱 git config --global user.name "your-name" git config --global user.email your-email@qq.com # 配置文件位置 # windows: ~/.gitconfig # linux: /etc/gitconfig # 设置代理 git config --global http.proxy 'http://localhost:7890' # 具体项目的配置列表 git config --local --list # 具体项目的配置 git config --local 配置内容
三、日常 workflow:查看 → 添加 → 比较 → 提交
查看当前状态
git status # 简洁版 git status -s输出结果
Link to original ?? new-file.txt # 未跟踪 M modified-file.js # 已修改未暂存 A added-file.css # 已暂存
添加文件
# 添加单个文件 git add 文件1 # 添加多个文件 git add 文件1 文件2 # 添加文件夹 git add 文件夹 # 添加所有修改(包括新文件和修改的文件) git add . # 添加所有.js文件 git add *.jsLink to original
git reset HEAD .可以取消暂存
工作区 vs 暂存区
Link to original # 查看工作区中已修改但未暂存的文件差异 git diff
提交
Link to original # 将暂存区内容纳入Git提交记录 git commit -m "message" # git add . 和 git commit -m "message" 合在一起 git commit -am "message"
四、撤销与恢复
取消工作区的修改
Link to original # 将工作区中指定文件恢复到最新提交的状态(丢弃本地修改) git restore 文件名
撤销本地暂存
Link to original git reset HEAD .
从暂存区移除文件
Link to original # 将文件从 Git 跟踪中移除,同时删除本地文件 git rm 文件名
五、历史查看
历史:在 commit 信息中查找并展示 commit
Link to original git log --grep="待过滤信息"
恢复本地已删除分支
Link to original # 查看所有操作记录,包括被删分支之前的 commit git reflog # 找到分支最后一次的 commit hash,例如: # abc1234 HEAD@{2}: commit: fix bug xxx # 用这个 hash 重建分支 git branch <分支名> abc1234 # 或者直接切出来 git checkout -b <分支名> abc1234
六、分支管理
查看当前分支
Link to original # 查看当前分支 git branch git branch --list
Transclude of git-switch#切换分支
切换分支
Link to original # 切换分支 git switch 分支名 # 创建+切换分支 git checkout 分支名 # 创建并切换到 dev 分支 git checkout -b dev
合并其他分支
Link to original # 将 master 合并到当前分支 git merge master
暂存
Link to original # 当前暂存区的文件暂存 git stash # 查看 stash 内容 git stash list # 查看具体内容 git stash show t # 应用 git apply # 弹出 git pop # 临时保存当前分支的工作状态,方便切换到其它分支 git stash # 恢复刚刚临时保存的工作状态 git stash pop
TLDR
Link to original # 将单个提交应用到当前分支: git cherry-pick 提交哈希 # 将连续多个提交应用到当前分支(也可参考 git rebase --onto): git cherry-pick 起始提交~..结束提交 # 将多个(非连续的)提交应用到当前分支: git cherry-pick 提交1 提交2 ... # 将提交变更应用到工作区但不自动创建提交: git cherry-pick --no-commit 提交哈希
七、远程交互
查看远程分支
Link to original git remote git remote --verbose
下载远程更新
Link to original # 从关联的远程仓库下载所有分支的最新状态 git fetch
拉取并合并
Link to original # 从关联的远程分支拉取最新代码并自动合并到当前分支 git pull
推送到远程
Link to original # 将当前分支的提交推送到关联的远程分支 git push
八、高级操作
添加子模块
Link to original # 添加子模块 git submodule add [某个github仓库]
稀疏检出
允许你只检出(checkout)某些目录或者文件,而不是仓库中的全部内容。 适合于大型仓库(如 Monorepo)——你只关心或需要工作区中的某个子目录或文件,而不是整个仓库。
场景:如果想对某个仓库提交代码,但是整个项目又太大,只想拉取其中的一部分,可以采用稀疏拉取方案
Link to original
FAQ
Git 如何恢复本地分支
恢复本地已删除分支
Link to original # 查看所有操作记录,包括被删分支之前的 commit git reflog # 找到分支最后一次的 commit hash,例如: # abc1234 HEAD@{2}: commit: fix bug xxx # 用这个 hash 重建分支 git branch <分支名> abc1234 # 或者直接切出来 git checkout -b <分支名> abc1234
git 如何对历史搜索
历史:在 commit 信息中查找并展示 commit
Link to original git log --grep="待过滤信息"
历史: 在文件中查找内容并展示 commit
Link to original git log -S"待搜索内容" -p
本地 Git 仓库删除大 object
最简单的方法,删除远程仓库,重新上传并重新提交,缺点是会丢失历史数据,
2025-09-27 由于之前加入 rime-ice 仓库,导致仓库过大,只好按照这个方法
git 文件名大小写敏感
原因是 windows 系统大小写不敏感,而 git 大小写敏感
git CR/CRLF 是怎么解决的?
git 在 powershell 使用命令行时出现乱码
Link to original git config --global core.quotepath false git config --global gui.encoding utf-8 git config --global i18n.commit.encoding utf-8 git config --global i18n.logoutputencoding utf-8
签出会覆盖本地修改
场景描述:
通常我会在 dev 分支上操作,然后细粒度地提交 commit,上传到 github 上形成一个 pull-request,然后 main 再接受 pr,合并成一个
但是有时候会忘记切换分支(比如现在就是),直接在 main 上更改
在 vscode 的状态栏就会出现 *,此时想换到 dev 分支
直接切换会出现签出会覆盖本地修改的提示
该提示下的三个选项分别是什么意思呢?
- 储藏并签出:希望【暂存区】仍然在当前分支,然后切换到另一个分支
- 迁移更改:希望将【暂存区】的内容切换到另一个分支,可能要处理冲突问题
- 强制签出:(不推荐)直接放弃当前分支(比如
main)未提交的commmit,然后切换为分支dev
所以该场景我们需要的是【迁移更改】
参考资料
-
github/gitignore: A collection of useful .gitignore templates
-
lenck - 为什么要先 git add 才能 git commit ? - 知乎
- 概要: 前言你是否也曾有过这样的经历:熟练地敲下 git add . 和 git commit -m ”…”,感觉自己已经掌握了版本控制的奥秘。但当 merge 冲突的红色警告占满屏幕,或者当你想撤销一次错误的提交时,心中是否会涌起一丝恐慌?git reset —hard 就像一个充满诱惑又极其危险的红色按钮,你渴望按下它,却又害怕它会摧毁一切。如果这听起来很熟悉,那么恭喜你,这篇文章正是为你量身打造的。许多教程教会了我们 如何 使用 Git 命令,但很少有…
- 点赞: 474
-
- 概要: 1.校园网不带梯子 2.不教 git,make 等现代工具链 3.代码量不足,课程报告过多,杂七杂八的课太多,比如物理实验 4.教材老旧,ppt 跟着老旧,念他的人不免的也老旧。 5.核心课程缺失或者不重视,比如编译原理,有的学校甚至不开 6.Coding 和计算机原理和数学原理没法很好的融合统一,Coding 的课没数学原理,数学原理的课没计算机,计算机原理的课没 coding。 7. 课程报告,毕业设计能不能别再用什么 word 了,小报告 markdown 大报告 latex…
- 点赞: 4339
-
一个小号 - 在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么? - 知乎
- 概要: rebase 和 merge 不是二选一的关系,要协同使用,毕竟作者设计出两个命令不是让你挑一个来用的。 一个最简单的模型,从 master 分支 checkout 出几个本地 feature 分支,你或者你的团队在协同开发某个 feature-a 时,可能别人已把 feature-b 的代码 merge 回 master 了,所以应该及时将 master 的改动 rebase 到你的本地分支,顺便 fix conflicts。即: git rebase master fix conflicts… $ git reba…
- 点赞: 1613
-
七哥在成长 - 如何克服解决 Git 冲突的恐惧症? - 知乎
- 概要: 最近新入职,在提交 pr,然后 code review 后,关于分支合并我产生了一个小问题,那就是 squash merge 和 rebase merge 到底有什么区别呢? 公司为什么要求使用 git rebase merge 呢?之前我们都是直接一把梭 git merge 分支名来合并。 [图片] 带着这两个疑问我们以一个实际的开发场景来搞明白 merge, squash merge, 和 rebase merge 之间的区别,接着往后看吧。举个例子,如果我们有一个项目,它包含一个 master 主分支,有 3 个提交,分别…
- 点赞: 159
-
git bash 报错 fatal: detected dubious ownership in repository at 的解决方法 - Clotho_Lee - 博客园
-
rcbb.cc - 为什么 Git 的教程都那么繁杂? - 知乎
- 概要: 团队开发中,遵循一个合理、清晰的 Git 规范,是非常重要的。 否则,每个人都提交一堆杂乱无章的 commit 和 分支,项目很快就会变得难以协调和维护。 分支规范 master:主分支。主分支,始终与正式环境代码保持一致。 不能将代码直接 commit 到该分支,仅合并 develop 在测试服验证完成的代码。 develop:开发分支。开发分支,在测试环境验证过的分支请求合并到该分支。 不能将代码直接 commit 到该分支,合并 feature、fixbug 分…
- 点赞: 331