- Git学习笔记
- 是什么?
- Git的工作机制
- Git和代码托管中心
- Git的常用命令
- 设置签名
- 本地库初始化 git init
- 添加到暂存区 git add
- 将暂存区的文件提交到本地库 git commit
- 查看历史版本 git log/git reflog
- 版本穿梭 git reset
- Git的分支
- 分支命令
- 合并分支时代码冲突
- 团队协作
- GitHub
- 创建远程库
- 代码推送 git push
- 团队成员邀请
- 代码拉取 git pull
- 代码克隆 git clone
- SSH免密登录
- 在文件下设置git忽略文件 .gitignore
Git是分布式版本控制系统
版本控制是什么?
版本控制是一种记录文件内容变化,查阅特定版本修订情况的系统。
版本控制的功能
1.记录文件修改的历史记录
2.查看历史版本
3.方便版本切换
分布式
本地上有本地库,保存的是整个完整的项目(包含历史),本地可以进行版本控制。
远程库,进行所有的版本控制。
远程库挂掉之后,还可以在本地进行版本控制,只是不能向远程库提交。
Git的工作机制 Git和代码托管中心代码托管中心(如GitHub):基于网络服务器的远程代码仓库,帮忙维护远程库
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee码云(国内网站)
| 命令名称 | 作用 |
|---|---|
| git config --global user.name 用户名 | 设置用户签名 |
| git config --global user.email 邮箱 | 设置用户签名 |
| git inti | 初始化本地库 |
| git status | 查看本地库状态 红色文件没有加入暂存区,绿色加入了缓存区 |
| git add 文件 | 添加文件到暂存区 |
| git commit -m “日志信息” 文件名 | 提交文件到本地库 |
| git reflog | 查看历史版本 |
| git reset --hard 版本号 | 版本穿梭 |
- 作用:区分不同开发人员的身份
- 辨析:这里设置的签名和代码托管中心的账号、密码没有任何关系
命令:
项目级别/仓库级别:仅在当前本地库起作用
git config user.name 用户名
git config user.email 邮箱号
系统用户级别:登陆当前操作系统的用户范围, git config --global
git config --global user.name 用户号
git config --global user.email 邮箱号
级别优先级:项目级别优于系统用户级别
命令:git init
效果:出现隐藏文件.git
注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要乱修改
作用: 把当前文件夹变为本地库,git获取管理权
命令
添加文件到暂存区:git add 文件名
添加所有文件到暂存区:git add .
添加变化的文件到暂存区:git add -A
删除暂存区的文件: git rm --cached 文件名
作用:将暂存区的内容提交到本地库,形成历史版本
命令
提交文件: git commit -m ”版本日志信息" 文件名
提交所有文件: git commit -m ”版本日志信息”
修改xxx行 = 新增xxx行和删除xxx行,只提示新增和删除
若多屏显示控制方式:空格向下翻页 b向上翻页 q退出
查看完整历史版本:git log
# 8f161d814c0ba8d76415c59c93b88258ce609e7b 完整版本号 D:ranansnake>git log commit 8f161d814c0ba8d76415c59c93b88258ce609e7b (HEAD -> master, origin/master) Author: RananDate: Mon May 2 20:40:39 2022 +0800 first commit
查看精简历史版本:git reflog
HEAD@{移动到当前版本需要多少步}
# 8f161d8 精简版本号
$ git reflog
62d4fbc (HEAD -> master) HEAD@{0}: commit: 3
c7069e9 HEAD@{1}: commit: 2
9380b41 HEAD@{2}: commit (initial): 1
版本穿梭 git reset
本质:操作HEAD的指针,HEAD指针默认是指向最近的版本。
基于索引值操作(推荐)
git reset --hard 局部hash
先使用git reflog查看本地库的版本情况以及对于局部hash值,在使用git reset 回到第二个版本
日志会记录你的操作
有两个指针,head指针指向哪个分支,分支指针指向哪个版本
程序员将自己的工作从开发主线上分离开来,开发自己的分支不会影响主线分支的运行。
优势
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
| 命令名称 | 作用 |
|---|---|
| git branch 分支名 | 创建分支 |
| git branch -v | 查看分支 |
| git checkout 分支名 | 切换分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
# 创建分支 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ git branch hot-fix # 查看分支 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ git branch -v hot-fix 62d4fbc 3 * master 62d4fbc 3 # 切换分支 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ git checkout hot-fix NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (hot-fix) # 修改测试文件然后提交到本地库 # .... # 切换到master分支 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (hot-fix) $ git checkout master # hot-fix 合并到master上 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ git merge hot-fix Updating 62d4fbc..8bf846e Fast-forward test | 1 + 1 file changed, 1 insertion(+)合并分支时代码冲突
合并分支时,两个分支在同一个文件的同一位置有两套完全不同的修改时会产生代码冲突(以哪个分支的代码为主?)
此时需要人为决定
# master分支修改第三行 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ cat test hello1 hello2 hello3 xxx hello4 #hot-fix分支修改第四行 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (hot-fix) $ cat test hello1 hello2 hello3 hello4 yyy #切换回master,合并hot-fix分支 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master) $ git merge hot-fix Auto-merging test CONFLICT (content): Merge conflict in test Automatic merge failed; fix conflicts and then commit the result. # 查看文件 (master|MERGING)正在合并中 NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master|MERGING) $ cat test hello1 hello2 <<<<<<< HEAD hello3 xxx hello4 ======= # 这下面是要合并的代码 hello3 hello4 yyy >>>>>>> hot-fix
一个修改第三个一个修改第四行没有修改同一行为什么会冲突?
https://blog.csdn.net/weixin_44585148/article/details/120298587
修改前先拉去最新版本。
解决办法
第一步:自行修改冲突文件 删除标识信息和处理冲突的行
比如让修改都生效
NINGMEI@DESKTOP-IK6KIFG MINGW64 /d/ranan/git_test (master|MERGING) $ cat test hello1 hwllo2 hello3 xxx hello4 yyy
第二步:git add 文件名
第三步:git commit-m”日志信息”
注意:此时 commit 一定不能带具体文件名
此时处于正在合并中,两个分支都有该文件。不带具体文件名,意思是以本分支为主
- 团队内协作
- 跨团队协作
在GitHub发送拉取请求
创建远程库:https://github.com/xxxx/xxxx.git
创建别名 git remote add 别名 远程库地址
查看别名: git remote -v
创建别名的作用: 远程库太长了可以创建别名,下次上传可以直接用别名上传
命令:git push 别名 分支
说明:
1.会弹窗登录GitHub
2.需要加入团队才可以往远程库推送代码
命令:git pull 别名 分支
说明:拉取动作会自动将拉去代码提交本地库
代码克隆 git clone如果不是基于GitHub远程库的最新版本所作的修改,必须先拉取下来再修改,不然会发生代码冲突
命令:git clone 仓库地址
作用:①完整的把远程库下载到本地 ②创建origin远程地址别名,这里创建的别名是固定的origin ③初始化本地库
说明: 克隆代码不需要登录GitHub账号
第一步:生成ssh(在家目录用户目录)
ssh-keygen ct rsa -C 邮箱账号
说明
1.注意C大写
2.在主目录下生成的密钥在 /c/Users/用户名/.ssh/id_rsa 里
第二步:查看并复制ssh(需在.ssh目录下执行 cd .ssh进入)
cat id_rsa.pub
第三步:复制密钥内容添加到 github 上
使用ssh协议上传文件到仓库,SSH链接也可以设置别名
git push -u git@github.com(SSH链接) master在文件下设置git忽略文件 .gitignore
忽略哪些文件?
以vue项目为例,node_modules下载的依赖包是不用上传的,因为该文件太大了并且有包管理文件package.json,可以利用包管理文件在重新下载依赖。
忽略一些与项目实际功能无关,比如.vscode等IDE文件
目的
1.屏蔽IDE工具之间的差异
2.上传的文件尽可能下,别人下载的速度会更快,更好的体验
怎么忽略
1.创建忽略规则文件 xxx.ignore , 建议是git.ignore
为了便于让~/.gitconfig文件(.git里)引用,建议与它放在一个目录下,或者可以直接修改~/.gitconfig
git.ignore文件模板,以vue项目为例
.DS_Store node_modules/ /dist/ npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea .vscode *.suo *.ntvs* *.njsproj *.sln
在.gitconfig里引用
//注意斜线的方向 excludesfile = 绝对路径/git.ignore



