Git 用法速查

Git 用法速查 Git 用法速查Git 是分布式版本控制系统每个**仓库repository**保存项目的完整历史可在本机或远程如 GitLab / GitHub协作。核心概念概念说明仓库含.git目录的项目根目录记录所有提交历史工作区你正在编辑的文件暂存区indexgit add后、等待git commit的快照提交commit一次有说明的快照有唯一哈希如a1b2c3d分支branch指向某条提交链的指针常见main/develop远程remote另一份仓库的别名默认常为origin工作区 ──git add──→ 暂存区 ──git commit──→ 本地仓库 ──git push──→ 远程仓库 ↑ ↑ git restore git checkout / switch本地仓库、远程仓库与分支重点很多人混用「本地分支」和「远程分支」其实 Git 里要分清三个层次。1. 本地仓库 vs 远程仓库本地仓库远程仓库在哪你机器上项目里的.git目录服务器上GitLab / GitHub 等谁在用你日常commit的地方团队共享、push/pull的中转站怎么关联git remote add origin url给远程起名通过origin等名字被本地引用gitremote-v# 看本地配置了哪些远程、对应 URLgitremote show origin# 远程有哪些分支、本地跟踪关系摘要git clone会同时创建本地仓库、添加远程origin、并通常建好本地分支main且已跟踪origin/main。2. 三种「分支」不要搞混类型名字示例存在位置作用本地分支develop、feature/foo仅本地仓库你切换上去写代码、commit的分支远程分支服务器上的develop远程仓库git push更新、git pull对齐的对象远程跟踪分支origin/develop、origin/main本地仓库里的「只读书签」git fetch后更新的快照不要直接在上面 commit关系可以理解为远程仓库 origin └── develop 远程分支团队在服务器上看到的 本地仓库 ├── develop 本地分支你正在用的 └── origin/develop 远程跟踪分支fetch 后反映远程 develop 在哪 ↑ └── 通过「上游 / upstream」与本地 develop 关联git fetch只更新origin/*这类远程跟踪分支不改你工作区里的本地分支。git pullfetch 把远程跟踪分支合并/变基到当前本地分支且通常要求已设置上游。git push把当前本地分支的提交推到其上游远程分支。查看三类分支gitbranch# 仅本地分支* 为当前分支gitbranch-r# 远程跟踪分支origin/xxxgitbranch-a# 本地 远程跟踪gitbranch-vv# 本地分支及其跟踪的上游推荐git branch -vv示例输出* develop a1b2c3d [origin/develop: ahead 1, behind 2] 最近一次提交说明 feature/foo e4f5g6h [origin/feature/foo] ... main 1111111 [origin/main: gone] ...[origin/develop]本地develop跟踪远程origin/develop。ahead 1本地比远程多 1 个提交需要push。behind 2远程比本地多 2 个提交需要pull或merge/rebase。没有方括号本地分支未设置上游跟踪。git status在已跟踪分支上也会提示On branch develop Your branch is ahead of origin/develop by 1 commit. (use git push to publish your local commits)3. 本地分支跟踪远程分支upstream跟踪upstream告诉 Git「本地这个分支默认对应远程哪一个分支」。设置后可直接git pull、git push不必每次写origin develop。方式 A首次推送时设置最常用gitswitch-cfeature/my-work# 新建本地分支# ... 提交 ...gitpush-uorigin feature/my-work# 等价git push --set-upstream origin feature/my-work-u/--set-upstream会在远程创建feature/my-work若还没有把本地当前分支的上游设为origin/feature/my-work。当前分支首次推送也可写gitpush-uorigin HEAD方式 B已有本地分支事后指定上游# 本地 develop 跟踪远程 origin/developgitbranch --set-upstream-toorigin/develop develop# 若当前已在 develop 上可省略分支名gitbranch --set-upstream-toorigin/develop旧命令仍可用gitbranch develop --set-upstream-toorigin/develop方式 C从远程分支创建本地分支并自动跟踪远程已有origin/develop本地还没有developgitfetch origingitswitch develop# 若本地无 develop、远程有 origin/developGit 会创建本地 develop 并跟踪它# 或显式指定更明确gitswitch-cdevelop--trackorigin/develop# 简写gitswitch-torigin/develop方式 D克隆时默认跟踪git clone后通常已有本地main且跟踪origin/main无需再设。查看 / 修改 / 取消跟踪gitbranch-vv# 看谁跟踪谁gitrev-parse --abbrev-ref --symbolic-full-name {u}# 当前分支的上游名gitconfig branch.develop.remote# 查看 develop 的远程名gitconfig branch.develop.merge# 查看 develop 合并的远程分支 ref# 取消上游之后 push/pull 需写全参数gitbranch --unset-upstream develop4. 设置跟踪后的日常用法gitpull# 从上游拉取并合并或按配置 rebasegitpush# 推到上游远程分支# 未设置上游时 push 会报错需gitpush-uorigin本地分支名# 或gitpush origin HEAD:develop# 显式本地 HEAD → 远程 develop不自动设跟踪fetch 与 pull 的区别配合跟踪理解gitfetch origin# 更新 origin/*本地 develop 不动gitmerge origin/develop# 手动把远程跟踪分支合进本地 developgitpull# fetch 合并到当前分支针对 {u}gitpull--rebase# fetch rebase 到当前分支5. 常见场景速查场景做法新建功能分支并推到远程git switch -c feat/x→ 提交 →git push -u origin feat/x本地分支要对齐远程 developgit fetch→git switch develop→git pull远程有新分支本地还没有git fetch→git switch -t origin/release-1.14本地分支名与远程不同git push -u origin local-name:remote-name看本地与远程差几个提交git branch -vv或git status上游设错了git branch --set-upstream-toorigin/正确分支名6. 注意点远程跟踪分支origin/main是本地对远程的缓存不能代替本地分支做开发应在本地分支上commit再push。删除远程分支不会自动删本地分支git push origin --delete old-feature后本地还可git branch -d old-feature。多人协作时推送前建议git fetchgit pull或rebase减少push被拒non-fast-forward。创建与获取仓库# 在当前目录初始化新仓库gitinit# 从远程克隆会多一个 origin 远程gitclone https://example.com/group/project.gitgitclone gitexample.com:group/project.git my-dir# 指定目录名日常最常用命令查看状态与历史gitstatus# 哪些文件改了、是否已暂存gitdiff# 工作区 vs 暂存区gitdiff--staged# 暂存区 vs 最后一次提交gitlog# 提交历史gitlog--oneline-10# 简洁一行最近 10 条gitshowcommit# 某次提交的详情暂存与提交gitaddfile.cpp# 暂存单个文件gitadd.# 暂存当前目录所有变更gitadd-pfile.cpp# 交互式分块暂存gitcommit-mfix: 修复启动路径查找gitcommit-amdocs: 更新说明# -a已跟踪文件的修改直接进提交不含新文件撤销与回退谨慎使用# 丢弃工作区对某文件的修改未 addgitrestore file.cpp# 取消暂存已 add想重新选gitrestore--stagedfile.cpp# 回退到某提交保留工作区修改gitreset--softcommit# 回退到某提交暂存区和工作区也一起回退未 push 时常用gitreset--hardcommit# 用新提交“抵消”某次历史提交已 push 时更安全gitrevertcommitreset --hard会丢失未提交修改且若已 push 再改历史需要force push团队协作时要避免。分支gitbranch# 列出本地分支gitbranch-a# 含远程跟踪分支gitbranch feature/foo# 新建分支gitswitch feature/foo# 切换分支推荐gitswitch-cfeature/foo# 新建并切换# 旧写法仍常见gitcheckout feature/foogitcheckout-bfeature/foogitmerge develop# 把 develop 合并进当前分支gitbranch-dfeature/foo# 删除已合并分支远程协作简要详细说明见上文本地仓库、远程仓库与分支。gitremote-vgitfetch origingitpull# 已设上游时gitpull origin main# 未设上游时显式指定gitpush# 已设上游时gitpush-uorigin HEAD# 首次推送并设置跟踪暂存未完成的工作gitstash# 把工作区改动收起来gitstash listgitstash pop# 恢复最近一次 stashgitstash apply# 恢复但保留 stash 记录比较与查找gitdiffmain..feature/foo# 两分支差异gitdiffmain...feature/foo# 从共同祖先到 feature 的差异看 PR 常用gitblame file.cpp# 每行最后是谁改的gitgrepFindStartup# 在版本库中搜索字符串.gitignore在项目根目录创建.gitignore列出不要纳入版本控制的文件build/ *.o *.a .env .idea/已误跟踪的文件需先取消跟踪gitrm--cachedpath/to/file典型工作流1. 拉最新代码再开发gitswitch developgitpull origin developgitswitch-cfeature/my-change# ... 编辑 ...gitadd.gitcommit-mfeat: 添加 xxxgitpush-uorigin feature/my-change然后在 Web 上提 Merge Request / Pull Request。2. 同步远程 main 到当前分支gitfetch origingitmerge origin/main# 或保持线性历史gitrebase origin/main有冲突时 Git 会标记冲突文件手工改完后gitaddresolved-filesgitcommit# merge 场景# 或gitrebase--continue# rebase 场景3. 只看某次提交改了什么gitshow HEADgitshow abc1234--stat配置本机一次即可gitconfig--globaluser.nameYour Namegitconfig--globaluser.emailyouexample.comgitconfig--globalcore.editorvimgitconfig--globalinit.defaultBranch main查看配置gitconfig--listgitconfig user.email命令速查表目的命令克隆git clone url状态git status暂存git add file提交git commit -m message拉取git pull推送git push设上游跟踪git push -u origin branch或git branch --set-upstream-toorigin/branch看跟踪关系git branch -vv从远程建本地分支git switch -t origin/branch建分支git switch -c branch切分支git switch branch合并git merge branch看历史git log --oneline暂存工作git stash本人最常用gitclonegitswitch-Cdevelop origin/developgitcheckout-bfeat/xxx/new_featgitadd.gitcommit-mfeat: 本次提交做了什么事gitpush 上传到当前分支的远程跟踪分支gitpush origin feat/xxx/feat 上传到远程 feat/xxx/featgitpull 从当前分支的远程跟踪分支拉取代码gitpull origin feat/xxx/feat 从远程 feat/xxx/feat 分支拉取最新代码到当前本地分支gitstash 将工作区修改暂存在当前本地分支gitstash pop 将本地当前分支存储的修改取出到当前工作区gitreset--softHEAD~N N表示撤回最近的几次提交1次就改为1--soft仅撤销 commit修改仍在「暂存区」gitreset HEAD~N 修改回到工作区需重新gitaddgitreset--hardHEAD~N 完全丢弃修改gitreset--hardcommit号 将当前分支强制回退到指定提交同时丢弃工作区和暂存区所有修改。gitlog 查看当前本地分支的所有commit记录 删除gitbranch 查看本地分支列表gitbranch-Dxxx 删除本地分支xxxgitpush origin--deletefeat/xxx/new_feat 删除远程 feat/xxx/new_feat分支