我的Git学习笔记
本文最后更新于 2025年9月20日 凌晨
参考:Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
Git简介
Git是目前世界上最先进的分布式版本控制系统,可以自动记录每次文件的改动,还可以让同事协作编辑。在2005年由Linus开发。相比集中式,分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,不必联网;修改文件后只需把各自的修改推送给对方;还支持分支管理。
基本概念
- 工作区(worktree):电脑中本地代码实际存放的目录。
- 暂存区(staged/index):暂时存放文件的修改的地方,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。包含了所有的分支与版本。
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
- 当对工作区修改(或新增)的文件执行
git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。 - 当执行提交操作
git commit命令时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。 - HEAD指针指向版本库中当前分支、当前所在的版本(或者说指向某一个分支名,如main;而分支名main也是个指针,指向某一个commit)。可以使用
git reset改变HEAD指针指向的版本。HEAD^表示当前版本的父版本,HEAD^^表示上两个版本,以此类推。commit_id也可以用版本号的前几位表示。
创建版本库(仓库)
进入某个目录后,执行git init命令。该目录下就会自动生成 .git文件夹,该目录变成一个Git管理的版本库。
基本操作
git add <file>:添加文件修改到暂存区git commit -m 'message':提交暂存区的文件修改到版本库的当前分支。git管理的是文件的修改,add与commit操作的对象都是文件的修改。git status:查看工作区的状态,哪些修改未提交比较差异:
git diff <file>:查看工作区与暂存区文件的差异git diff --staged <file>:查看暂存区与版本库当前版本文件的差异版本回退:
git log:显示当前分支的版本历史,一个commit就对应了一个版本,也是分支图中的一个节点。git log --graph --oneline --all画出所有分支的分支图。git reset --hard <commit_id | HEAD>:暂存区与工作区的文件都回退到某个版本。HEAD指针指向当前所在的版本;如果使用commit_id,HEAD指针和分支名指针也会改变(即版本库的当前版本变了)。git reset <commit_id | HEAD>:(省略了–mixed)版本库与暂存区的文件回退到某个版本,工作区文件不变保留修改,变为未暂存的状态。如果使用commit_id,HEAD指针和分支名指针也会改变。(如果工作区已经和版本库一致,但上次提交的commit有错误,想要修改又不想产生新的commit,可以用此命令回退版本库,但保留工作区修改,修改工作区后重新提交)git reflog:查看命令历史撤销修改:
git restore <file>:使用暂存区的文件内容恢复工作区的文件(即丢弃工作区的修改)git restore --staged <file>:使用版本库当前版本(HEAD)的内容恢复暂存区的内容(即取消暂存,工作区保持不变)git rm <file>:删除一个文件,并将删除操作添加至暂存区连接远程仓库:
git remote add origin git@github.com:AquariusLeo/gitlearning.git:连接GitHub上的远程仓库,origin是这个远程连接的引用的名字,可以随便改git remote -v:查看连接的远程仓库信息git remote show <remote-name>:查看所有的远程连接,或查看指定的连接的信息。git push [-u] origin main:把本地的main分支的修改推送到远程库origin中。-u:将本地的main分支关联到远程库的main分支,即追踪tracking/upstream。之后推送修改就不需要加-u。git pull:把远程仓库的最新commit抓取到本地的当前分支。抓取前需要建立与远程分支的追踪关系。git branch --set-upstream-to=origin/<branch-name> <local-branch-name>:将本地分支与远程分支建立追踪关系。追踪关系可以用git remote show origin查看。在pull或者push之前都要建立追踪关系,或者使用-u选项git remote rm <name>:删除远程库连接git clone <url>:从远程库克隆。url可以使用ssh协议的git@github.com…… 形式,也可以是http协议的https://github.com/…… 形式分支管理:
git branch:列出所有的已存在分支git branch <branchname>:创建一个新分支,指向当前HEAD的位置。–delete:删除分支,–move:移动/重命名分支,–copy:复制分支git switch <branchname>:切换分支。-c:创建后再切换。git merge <branchname>:合并branchname分支到当前分支。当Git无法自动合并分支时,就必须首先解决冲突,把Git合并失败的文件手动编辑为我们希望的内容。解决冲突后,再add、commit,合并完成。–no-ff:禁用Fast forward模式,在merge时必定生成一个commit,这样可避免删除分支后,会丢掉分支信息。git stash:保存当前工作现场(包括工作区未add的修改和暂存区未commit的修改),之后工作区会是干净的,可以放心地创建新分支。主要用于在开发过程中临时去别的分支修复bug。git stash list:查看所有被保存的工作现场。git stash pop:恢复上一个保存的stash,并把它删除。git cherry-pick <commit_id>:复制某个commit的修改到当前分支。常用于复制bug修复。git rebase:(变基)把本地未push的分叉提交历史整理成直线,使得在查看历史提交的变化时更容易多人协作的工作模式:
首先,可以试图用
git push origin <branch-name>推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并;如果pull合并有冲突,则解决冲突,并在本地add、commit提交;
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功!如果
git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/<branch-name> <local-branch-name>。标签管理:
标签是版本库的一个快照,唯一确定了打标签时刻的版本,其实就是指向某个commit的指针。使用标签是为了定义简明的版本号,而不是使用很长的commit_id。
git tag <tagname> [<commit_id>]:给某个commit打上标签。git tag会列出所有的标签,git show <tagname>查看标签信息。-d:删除标签。
自定义Git
- 定义别名:
git config --global alias.st 'status' - 忽略特殊文件:在.gitignore文件中配置
