Git笔记
认识Git
git是分布式版本控制系统
Git好像一个档案馆,能够记录你在哪个时候做了哪些内容
分布式:在各自的档案馆做各自的内容,可以用自己的和别人的合并
git操作流程
git的通用操作流程如下图
- 版本库.git文件
当使用git管理文件时,成功git init
后文件夹中会出现一个.git文件,这个称为版本库,里面有git相关配置 - 工作区
本地电脑存放项目文件的位置 - 暂存区(Index/Stage)
暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里 - 本地仓库
使用commit命令可以将暂存区中的文件添加到本地仓库中 - 远程仓库
比如gitee或github里创建的托管我们项目的仓库就是远程仓库
我觉得这个图非常棒:
安装配置
一些配置
- 设置用户信息必须
windows桌面右键点击Git Bush 打开
首次使用添加身份说明,输入下面两行配置名字和邮箱:git config --global user.name "melon"
$ git config --global user.email "1305116856@qq.com"
- 解决乱码问题
$ git config --global core.quotepath false
export LANG=”zh_CN.UTF-8”
export LC_ALL=”zh_CN.UTF-8” - 配置git命令输出为彩色的
git config --global color.ui auto;
使用命令
创建仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
- 本地仓库
- 在电脑的任意位置创建一个空目录(例如test)作为我的本地Git仓库
- 进入这个目录中,点击右键打开Git bash窗口
- 执行命令
git init
- 如果创建成功后可在文件夹下看到隐藏的.git目录。
- 克隆仓库
在gitee或者github上新建仓库然后使用命令拉取到自己的电脑上
在创建好后这个仓库的所有文件都是未跟踪的
状态与提交版本
- 跟踪
跟踪文件$ git add <name>
跟踪当前目录$ git add .
- 取消跟踪
rm删除$ git rm <name>
保留但不跟踪$ git rm-cache <name>
- 文件状态修改
修改后缓存 / 取消缓存
将修改文件缓存git add <file-name>
取消缓存git reset HEAD <name>
提交缓存的修改git commit
- git commit 具体操作:或
1
2
3git commit 进入提交界面,
按" i "键进入输入模式后输入本次提交详情,
然后esc退出编辑模式, 按" : "进入命令栏, 输入"wq"保存并退出.git commit -m ' 你对提交内容的描述 '
(简单用的多) - 取消提交
使用该命令取消本次提交, 但是首次提交不可撤回.git reset head~ --soft
- 查看文件状态
git status
红色代表 已修改, 未暂存
绿色代表 已暂存
提交后, 则不显示 - 更详细地查询修改
git diff
- 查看提交历史信息
git log
- 查看所有分支的提交
git log --all
- 图形化查看所有分支的提交
查看所有分支的提交结合graph食用更佳:git log --all --graph
基础操作指令(以前笔记)
基础命令和linux一样
Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而发生变化
先创建一个文件:可以输入指令
mujiu@Melon MINGW64 /d/melon (master)
$ touch file01.txt
也可以鼠标右键直接创建从工作区放到暂存区(add指令)
输入指令 git add +文件名 或 git add .(注意空格!)查看状态:输入指令git status
放到仓库(注意空格!)
git commit -m “add file01”其中“add file01”是注释,方便以后查看,写什么自己定查看提交到哪里,指令git log
对现有的文件进行修改 指令vi file01 (vi+文件名或者右键编辑文件也可以)
进入编辑区域 输入 update count=1 表示第一次更新
输入不了的按下“i”
保存:ESC+:wq
退出编辑区域:ESC+连着按两次大写字母Z
编辑完再git add . 提交到暂存区,再继续git commit -m “add file01”提交到仓库
然后git log 查看记录,现在显示有两次修改记录
git log参数
命令形式:
git log [option]
–all显示所有分支
–pretty=oneline将提交信息显示为一行
–abbrev-commit使得输出的commitld更简短
–graph 以图的形式显示
(建议在家目录的.gitconfig中设置别名)
版本回退
作用:版本切换
命令格式: git reset –hard commitID
commitID 可以使用git-log或者git log指令查看
- 如何查看已经删除的记录:
git reflog 这个指令可以看到已经删除的提交记录
前面黄色的编号选中就是默认复制了,要贴贴按住滚轮即可,不要ctrl+c/v
如果想再还原回去,git resert –hard 再贴前面的版本号1b37cbd即可
如果clear了没有前面的编号记录了,那么输入git reflog ,会把前面所有的操作显示出来,从这里面分析拿编号
添加文件至忽略列表
如果已经有多个文件,但有的文件想提交有的文件不想被提交,那么需要创建忽略列表
创建忽略列表:touch .gitignore 然后vi .gitignore 进入编辑页
如果输入 *.a那么以a结尾的文件都会添加进来
vi .gitignore后,按insert键编辑,编辑好后,按Esc退出编辑,再按Shift和冒号:
保存并退出编辑
mv移动文件 在同一个文件夹里移动就可以用来改名
分支
分支 master
几乎所有的版本控制系统都以某种形式支持分支。
使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线
为了让每个人的开发互不影响,HEAD->当前分支
- git buanch (查看本地分支)
- git buancu 加分支名 (创建分支)
- git checkout 加分支名(切换分支)
- git checkout -b 加分支名(创建并切换到一个不存在的分支)
- git merge 加分支名称 (合并分支)
首先切换到那个分支,再写代码合并 - git branch -D -b1 (强制删除非当前分支)
分支合并
- 无冲突合并
git merge 要合并的分支
- 分支冲突合并
gerge confit` 将 分支2 合并到 master分支 时, 与 分支1 冲突了. 原因是 分支1 和 分支2 修改了同一处内容 git status 查看哪里有冲突 vi 到冲突文件中, 选择一个分支的内容保留下来, 保存退出
git add 文件名
推拉与远程跟踪分支
- 推送
git push 仓库名 分支名
第一次使用 -u 指定推送目标后, 此后可直接使用git push:git push -u仓库名 分支名
- 拉取(这里我看博客好多不同公司要求不一样,还有可能出面试题
git fetch
- 远程分支本地化
git checkout
远程分支
git checkout -b
本地分支名 远程分支
git checkout --track
``远程分支
贮藏功能
- 储藏分支
代码写到一半别的分支的活要做, 要切换到其他分支,但是这是不允许的会导致工作区变脏
此时可以把当前分支修改的东西储藏起来再切换:git stash
- 恢复藏匿分支
git stash apply
- 多次存储
回看存储记录git stash list
恢复指定(某次)记录git stash apply stash@{记录号}
恢复并删除记录git stash pop
恢复并删除最近一次记录git stash pop
删除指定记录git stash drop @stash{记录号}
.gitignore
文件
.gitignore 是一个文本文件,用于告诉 Git 忽略指定的文件或目录,避免这些文件被提交到版本控制中。它主要用于:
- 忽略编译生成的文件(如 .class、.exe、.dll 等)。
- 忽略临时文件(如日志文件 .log、缓存文件 .tmp 等)。
- 忽略敏感文件(如配置文件中的密码、环境变量文件等)。
- 忽略操作系统或编辑器生成的文件(如 Thumbs.db、.DS_Store 等)
.gitignore
语法详解
- 以
#
开头的行是注释,不会被 Git 解析 - 忽略文件或目录:
- 忽略所有扩展名的文件:
*.log
,*.tmp
- 忽略特定文件:
temp.txt
,config.local.json
- 忽略目录:
build/
# 忽略 build 目录及其所有内容node_modules/
# 忽略 node_modules 目录
- 通配符
*
:匹配任意字符(但不跨目录)*.log
# 忽略所有 .log 文件docs/*.md
# 忽略 docs 目录下的所有 .md 文件- ?(问号):匹配单个字符
- [abc]:匹配方括号内的任意一个字符
- (感叹号):反向规则(即排除忽略)
- 路径匹配
- 以
/
开头:匹配根目录下的文件或目录 - 以
/
结尾:仅匹配目录(不包含文件) **
:匹配多级目录
- 以
注意事项
(1) 已跟踪文件的忽略问题
如果某个文件已经被 Git 跟踪(已提交到仓库),修改 .gitignore 是不会让它停止跟踪的。需要先删除缓存
1 | git rm -r --cached . # 删除所有已跟踪文件的缓存 |
学习参考
- 这个视频讲的特别好!=>【B站30分钟弄懂所有工作Git必备操作 / Git 入门教程】 [https://www.bilibili.com/video/BV1pX4y1S7Dq/?share_source=copy_web&vd_source=7f88ea4ee6a402338b0a4e09fbb81750]
- (稀土掘金TianTianUp的文章)[https://juejin.cn/post/6869519303864123399]
- deepseek和通义的详细讲解
评论区提到的问题
面试被问到了git rebase,一直用git merge的完全答不上来
有位叫ElpieKay的热心高手的解释好清楚,我把他的回答cv了过来:
git rebase就像在处理两根分叉的枝丫,先找到两根枝丫的分叉点,把一根枝丫从这个分叉点以后的部分复制一份,按照原本的顺序嫁接到另一根枝丫顶端。
通过onto参数可以指定嫁接点(默认是枝丫顶端)。此外,通过参数,可以指定要复制哪一段枝丫(默认是分叉点后面那段开始到待复制枝丫的顶端)。
最后,通过交互式操作(-i参数),可以对复制后的枝丫上的每一段(一段代表一个commit)进行更加精细化的操作,包括丢弃(drop)、调整顺序(调整todo list里的顺序)、几个合并成一个(squash)、编辑(edit)等等。还可以通过exec参数传一个固定操作(命令、脚本等)进去,每处理完一个todo项就执行下这个操作。假如复制的这段分叉里包含了merge commit,又想保留它(默认是会被抹平的),可以用参数–rebase-merges。
特殊的情况是两个枝丫实际没有分叉,那rebase的时候表现会和merge有点像,already up-to-date或者发生快进式合并。