ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Git常用命令实战指南:从基础操作到仓库救援与冲突处理

Git常用命令实战指南:从基础操作到仓库救援与冲突处理 简介这份 docx 文档面向刚接触版本控制或需要随时查阅命令的开发者系统整理了 Git 常用命令及解析覆盖基本操作、远程仓库、代码管理、分支管理、代码查看以及压缩解压等场景可作为日常开发中的速查手册。资源包内共 1 个 docx 文件约 11KB体积轻巧便于本地保存与随时翻阅。文档按功能分类罗列命令如查看配置、提交记录、分支切换、撤销修改、摘取提交、打包解压等并附有简要说明帮助读者理解每条命令的用途与使用时机。目前已有 1748 人学习下载适合需要快速上手 Git、巩固命令记忆或排查操作问题的开发者参考也可作为团队内部培训的辅助材料。1. git常用命令从「只会 clone 和 pull」到能独立收拾仓库烂摊子很多人第一次接触 git是从git clone和git pull开始的。能拉代码、能提交就以为够用了。直到某天遇到合并冲突、误提交了大文件、切分支切出一堆报错才发现自己其实一直在用「阉割版」的 git。git 常用命令真正要解决的不是背下几十条指令而是让你在仓库出问题时能自己定位、自己修复而不是删库重来。这篇内容面向已经装好 git、能完成基本提交但一遇到冲突、回退、分支管理就发怵的开发者。我会按「配置 → 日常提交 → 分支与合并 → 回退与救援 → 排错」的顺序把每条命令背后的意图、参数边界和踩坑点讲清楚让你看完能直接在自己的项目里复现。2. 先把 git 配置和本地仓库跑通安装、免密、第一次提交2.1 git 安装与最小配置清单不管你是 Windows 装 git bash还是 Linux 下用包管理器装装完第一件事不是急着 clone而是把身份和默认行为配好。否则提交记录里会出现莫名其妙的默认用户名后面想改历史都麻烦。# 配置全局用户名和邮箱提交记录会带上这两个信息 git config --global user.name your_name git config --global user.email your_emailexample.com # 让 git 在 pull 时默认用 rebase避免多出一条无意义的 merge 提交 git config --global pull.rebase true # 处理换行符Windows 用 trueLinux/macOS 用 input git config --global core.autocrlf input # 开启颜色日志和 diff 更易读 git config --global color.ui auto # 查看当前所有配置确认没配错 git config --list这几条里最容易翻车的是core.autocrlf。Windows 和 Linux 混用仓库时如果一边设true一边设false每次提交都会看到整文件 diff实际内容没变全是换行符在捣乱。团队里统一约定一个值写进项目文档比事后排查省事得多。pull.rebase也值得说一句。默认的git pull等于fetch merge多人协作时历史里会堆满「Merge branch xxx」的提交。设成 rebase 后你的本地提交会被挪到远端最新提交之后历史是一条直线。代价是冲突要一个个解但换来的是可读的提交记录。2.2 免密与 SSH 认证git 免密配置和 ssh 认证失败怎么查热词里「git免密」「ssh认证失败 git」出现频率很高说明这是高频卡点。免密的核心是把本地公钥放到代码托管平台让 git 走 SSH 而不是每次输密码。# 1. 生成密钥对-t 指定算法-C 是注释一般写邮箱 ssh-keygen -t ed25519 -C your_emailexample.com # 2. 一路回车默认存在 ~/.ssh/id_ed25519 和 id_ed25519.pub # 3. 查看公钥内容复制到平台的 SSH Keys 设置里 cat ~/.ssh/id_ed25519.pub # 4. 测试连接-T 表示不分配终端-v 是调试模式 ssh -T gitgithub.com ssh -T gitgitee.com如果ssh -T报Permission denied (publickey)按这个顺序查先确认公钥确实粘贴到了平台且没有多余换行再确认~/.ssh/config里没有把 Host 指错最后用ssh -vT看握手过程哪一步被拒一目了然。还有一种情况是本地有多个密钥git 默认只读id_rsa这时需要在~/.ssh/config里显式指定# ~/.ssh/config 示例 Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_ed25519_gitee IdentitiesOnly yesIdentitiesOnly yes是关键它强制只用指定的密钥避免 git 拿错钥匙反复试导致认证失败。2.3 从零建仓到第一次提交的完整链路配置好之后把本地目录变成 git 仓库走一遍完整流程# 初始化本地仓库 git init # 查看当前状态确认哪些文件被跟踪、哪些是未跟踪 git status # 添加指定文件到暂存区 git add README.md # 添加所有改动新增、修改、删除 git add -A # 提交-m 后跟提交信息 git commit -m chore: init project # 关联远端仓库 git remote add origin gitgithub.com:user/repo.git # 首次推送并建立追踪关系 git push -u origin maingit add -A和git add .在老版本 git 里有区别git add .只处理当前目录及子目录git add -A处理整个仓库。现在两者行为基本一致但在仓库根目录之外执行时仍要注意。提交信息建议用feat:、fix:、chore:这类前缀后面查日志时能直接过滤。3. 日常提交与历史查看git commit --amend 和日志搜索怎么用3.1 修改最近一次提交git commit --amend 的正确姿势git commit --amend是热词里被单独拎出来问的命令因为它太容易用错。它的作用是修改最近一次提交可以改提交信息也可以把新改动的文件补进去。# 场景一只改提交信息不新增文件 git commit --amend -m fix: correct typo in config # 场景二漏了一个文件补进上一次提交 git add forgotten_file.py git commit --amend --no-edit # --no-edit 表示沿用原来的提交信息不弹出编辑器关键边界--amend只能改最近一次提交而且会生成一个新的 commit hash。如果这次提交已经推到远端amend 之后必须用git push --force-with-lease覆盖否则远端和本地会分叉。--force-with-lease比--force安全它会在远端有你没拉到的提交时拒绝推送避免把别人的工作冲掉。注意在共享分支上已经推送的提交尽量不要 amend。个人分支随便改团队分支改了要提前说。3.2 日志搜索与 diff 对比快速定位某次改动仓库大了之后git log一屏屏翻效率极低。常用组合是# 单行显示带分支和标签装饰 git log --oneline --decorate --graph # 按作者过滤 git log --authorzhangsan # 按提交信息关键词搜索 git log --greplogin # 搜索代码内容变更-S 后跟字符串 git log -S validateToken --oneline # 查看某次提交具体改了什么 git show commit-hash # 对比工作区和暂存区 git diff # 对比暂存区和最近一次提交 git diff --cached # 对比两个分支的差异文件列表 git diff main..feature --statgit log -S是很多人不知道的利器它按「某字符串出现次数发生变化」来筛选提交比--grep搜提交信息更精准。比如你想知道某个函数是什么时候被删掉的-S直接定位。git diff --stat只列文件名和改动行数不展开内容适合快速判断两个分支差多少。3.3 暂存与清理stash 和 clean 的边界手头改到一半要切分支又不想提交用 stash# 暂存当前改动-u 连未跟踪文件一起存 git stash push -u -m wip: login form # 查看暂存列表 git stash list # 恢复最近一次暂存并从列表删除 git stash pop # 恢复但不删除适合需要多次应用 git stash apply stash{0} # 删除某条暂存 git stash drop stash{0}git clean则是删除未跟踪文件危险系数高# 先预览会删哪些文件-n 是 dry-run git clean -n # 删除未跟踪文件 git clean -f # 连未跟踪目录一起删 git clean -fd # 连 .gitignore 忽略的文件也删慎用 git clean -fdx-x会把node_modules、dist这类忽略文件也删掉执行前一定先-n看一眼。我见过有人直接git clean -fdx把本地编译产物和依赖全清了重新装了半天。4. 分支与合并git 分支合并的三种方式和冲突处理4.1 分支创建、切换与追踪# 创建并切换到新分支 git switch -c feature/login # 老写法效果一样 git checkout -b feature/login # 查看本地分支-v 带最近提交 git branch -v # 查看所有分支包括远端 git branch -a # 删除已合并的本地分支 git branch -d feature/login # 强制删除未合并分支 git branch -D feature/login # 拉取远端分支并在本地建立追踪 git switch -c feature/login origin/feature/logingit switch和git checkout的区别switch专门用于切分支checkout还能恢复文件功能更杂。新版本 git 推荐用switch和restore分开操作语义更清晰也不容易误操作。4.2 合并的三种方式merge、rebase、squashmerge保留完整分支历史会产生一个 merge commit。git switch main git merge feature/loginrebase把当前分支的提交挪到目标分支之后历史是一条直线。git switch feature/login git rebase main # 如果有冲突解决后 git add resolved_file git rebase --continue # 想放弃 rebase git rebase --abortsquash merge把整个分支的提交压成一个再合入目标分支。git switch main git merge --squash feature/login git commit -m feat: add login module选哪种取决于团队约定。个人分支同步主干用 rebase功能分支合入主干用 merge 或 squash。rebase 的代价是冲突要逐个提交解决但历史干净merge 一次解决所有冲突但历史会有分叉。注意rebase 会改写提交 hash已经推送的公共分支不要 rebase。4.3 冲突处理的固定流程冲突不可怕可怕的是乱改。固定流程是# 1. 查看冲突文件列表 git status # 2. 打开冲突文件找到 标记 # 保留需要的代码删掉标记 # 3. 标记为已解决 git add conflicted_file # 4. 继续合并或 rebase git merge --continue # 或 git rebase --continue如果冲突太多想重来git merge --abort git rebase --abort冲突标记里的HEAD是当前分支另一侧是合入的分支。搞不清哪边是哪边时先看git status提示的「ours」和「theirs」再决定保留哪段。5. 回退与救援reset、revert、reflog 的避坑指南5.1 reset 的三种模式与适用场景# 软回退只移动 HEAD暂存区和工作区不变 git reset --soft HEAD~1 # 混合回退默认移动 HEAD重置暂存区工作区不变 git reset HEAD~1 # 硬回退HEAD、暂存区、工作区全部回到目标提交 git reset --hard HEAD~1--soft适合「提交早了想重新组织」--mixed适合「撤销 add」--hard会丢改动执行前确认工作区没有未保存内容。已经推到远端的提交不要用 reset 回退用 revert。5.2 revert安全的公共分支回退# 撤销某次提交生成一个新的反向提交 git revert commit-hash # 撤销最近一次提交 git revert HEAD # 撤销一系列提交-n 表示不自动提交 git revert -n HEAD~3..HEAD git commit -m revert: rollback three commitsrevert 不改写历史适合公共分支。代价是历史里会多出反向提交但这是可接受的。5.3 reflog最后的后悔药git reflog记录 HEAD 的每一次移动包括 reset、rebase、checkout。误操作后第一件事就是看它# 查看 HEAD 移动历史 git reflog # 找到误操作前的 hash重置回去 git reset --hard hashreflog 默认保留 90 天足够你找回大部分误删的提交。但注意reflog 是本地记录换机器或重新 clone 就没有了。6. 常见问题排查fatal: not a git repository 和推送失败怎么解6.1 fatal: not a git repository现象执行任何 git 命令都报fatal: not a git repository (or any of the parent directories): .git。原因当前目录不在任何 git 仓库内或者.git目录被删了。解决pwd确认当前路径ls -a看有没有.git。如果确实不在仓库里cd到正确目录或者git init新建。如果.git被误删只能从远端重新 clone。6.2 推送被拒non-fast-forward现象git push报! [rejected] main - main (non-fast-forward)。原因远端有你本地没有的提交git 拒绝覆盖。解决先git pull --rebase把远端提交拉下来解决冲突后再 push。不要直接--force除非确认远端提交可以丢弃。6.3 大文件误提交导致仓库膨胀现象提交了一个几百 MB 的二进制文件之后每次 clone 都很慢。原因git 保存所有历史版本大文件会一直留在.git里。解决用git filter-repo或BFG Repo-Cleaner从历史中移除。简单场景可以# 从当前提交中移除并加入 .gitignore git rm --cached bigfile.zip echo bigfile.zip .gitignore git commit -m chore: remove big file但这只删了最新版本历史里还在。彻底清理需要重写历史操作前备份仓库。6.4 换行符导致的整文件 diff现象只改了一行git diff显示整个文件都变了。原因core.autocrlf配置不一致或者文件本身混用了 CRLF 和 LF。解决统一配置core.autocrlf必要时用.gitattributes强制指定# .gitattributes * textauto *.sh text eollf *.bat text eolcrlf6.5 分支删了想恢复现象git branch -D删了分支发现还有用。解决git reflog找到该分支最后一次提交的 hash然后git switch -c recovered-branch hash只要 reflog 还在分支就能救回来。7. 进阶技巧用 alias 和钩子把常用命令压成一条git 常用命令敲多了重复输入很烦。两个提效手段alias 和 hooks。alias 把长命令压成短命令# 配置常用别名 git config --global alias.st status -sb git config --global alias.co checkout git config --global alias.br branch -vv git config --global alias.lg log --oneline --decorate --graph --all git config --global alias.last log -1 HEAD --stat git config --global alias.unstage reset HEAD --配完之后git st等于git status -sbgit lg直接出彩色分支图。git unstage file撤销暂存比记git reset HEAD --顺手。hooks 则在特定时机自动执行脚本。比如提交前跑 lint# .git/hooks/pre-commit #!/bin/sh npm run lint if [ $? -ne 0 ]; then echo lint failed, commit aborted exit 1 fi保存后加执行权限chmod x .git/hooks/pre-commit。这样每次 commit 前自动检查避免把格式错误推上去。hooks 不会随仓库分发团队共用需要放到项目里再软链到.git/hooks或者用 husky 这类工具管理。我自己的习惯是alias 只配最常用的五六条多了记不住反而添乱hooks 只放真正会拦住错误的检查太重的检查放 CI 里跑。git 的命令很多但日常真正高频的就那二十来条把它们用熟、用对边界比背全集有用得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表