我的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文件中配置

我的Git学习笔记
https://leo.zz.ac/posts/3059.html
作者
AquariusLeo
发布于
2025年1月5日
更新于
2025年9月20日
许可协议