1. Git介绍
1.1 Git是什么工具?
Git是一个版本控制工具
有以下版本的项目
v1.1
v1.2
开发项目1.2出现了bug,那么我们可以切换到之前的正常版本\
1.2 Git起到了什么作用?
代码管理,版本回退,多人协作
2. 将本地代码以及文件提交到远程仓库
2.1 Git全局设置
git config --global init.defaultBranch main
#git和github原来的默认分支都是master,但github因为黑人运动的分支变成了main,这里是让git和github保持统一
git config --global user.name "iamfugui"
git config --global user.email "zgh0118c@gmail.com"
git config --list --global
#查看git配置
#全局配置文件在:C:\Users\huawei的.gitconfig
#系统配置文件在:git安装位置\etc\ .gitconfig
2.2 生成SSH 秘钥和公钥
秘钥和公钥文件在:C:\Users\huawei.ssh
官方文档:
https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
过程解析:
密钥形式登录的原理是利用密钥生成器制作一对密钥,一个公钥和一个私钥(id_ed25519.pub和id_ed25519)。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。https://segmentfault.com/a/1190000040983619
\
2.3 测试连接
使用Git Bash
ssh -T git@github.com
可能碰到端口无法访问 参考以下连接:
https://segmentfault.com/a/1190000041909858/
2.4 克隆
# 克隆
git clone xxx
# 如果已经存在本地仓库你可以这样
git remote add origin xxx
git branch -M main
git push -u origin main
## 远程的其它操作
git remote -v #查看
git remote rm origin #删除
git remote add origin + 远程仓库地址 #添加
git remote set-url origin 远程仓库地址 #修改
2.5 提交代码
git add .
//提交所有代码到中转站(后面是空格加.)
git commit -m “注释内容”
//提交所有代码到本地仓库
git push
//提交到远程仓库
\
3. 查看以前版本代码
在平台查看代码,可追溯版本
4. 团队开发会碰到什么问题?
4.1 备份多个版本,费空间和时间
4.2 难以恢复以前版本
4.3 难以解决代码冲突
4.4 难以追溯问题以及责任人、修改时间
4.5 难以进行权限控制
5. SVN和git的区别
svn也是版本控制工具
git用的比较多
\
5.1 集中式管理与分布式管理
svn它是集中式管理,git是分布式管理
集中式:没网提交不到远程仓库,没有本地仓库
分布式:没网可以提交到本地仓库 git commit
5.2 速度
git速度比svn快
6. 详细操作
git init #项目初始化 克隆初始化也行
git config --list #查看总体配置
git config --global --list # 查看全局配置
git config --local --list #查看本地配置
git config --system --list #查看系统配置 几个配置文件可以百度位置,或进入小乌龟修改
git add . #将文件添加暂缓区 . 所有文件,也可以输入具体文件名,代表添加这个文件
git commit -m "123123" #添加到本地仓库
git status #查看目录状态 没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件
git diff xxx.js # 查看某一个文件
git diff # 查看所有文件
git log xxx.js #查看修改历史
git log #查看所有文件修改历史 (按q退出)
git reflog #查看修改历史【简单】
git reset xxxx #默认为混合模式 --mixed 回到某一个版本号 保留文件到工作区
git reset --hard "HEAD^" #回到上一个版本 cmd的^表示换行 要""起来 也可以~代替
git reset --hard xxxx #回到某一个版本号 硬重置 其它重置参考:https://juejin.cn/post/6844903614767448072#comment
git restore xxx.js #恢复文件到这个版本未修改模样
7. 多人开发解决冲突问题
git pull #拉取,其实就是 git fetch 和 git merge FETCH_HEAD 的简写,FETCH_HEAD是一个短暂的ref,用于跟踪刚刚从远程存储库中获取的内容。
7.1 过程
当远程仓库有别人提交了新的代码时,那么你add commit push提交远程仓库就需要pull。如果pull下来的代码有冲突,就得来解决这个冲突。使用编辑器打开冲突的文件,有如下:
<<<<<<< HEAD
三
=======
周
>>>>>>> 10171d56910d4a2866546ad60a9ed9295fe1445b
其中 ==== 是冲突代码的分割线,HEAD是你的代码,下边一串版本号的是别人提交的代码;另一种情况是下边是其它分支。
解决完冲突,需要重新add commit push。当然如果没有冲突,可以pull完直接push
另外 解决冲突并不会在github上特别标注出来
7.2 建议
写完代码立马提交,后边提交的人要解决冲突
8. 分支操作
主分支放置成型的项目,上线的项目,开发在其它分支上开发,最后合并给主分支
git clone -b xxx git@github.com:iamfugui/lovely.git #克隆某个分支
git branch #查看分支
git branch -r #查看远程分支
git branch -a #查看所有分支
git branch xxx origin/xxx #远程有分支 下载远程分支到新分支
git branch xxx #远程无分支 复制当前分支到新分支
git push -u origin xxx #创建并提交远程分支 -u 等于 --set-upstream (这命令是只有本地分支没有远程分支的情况下)
git branch xxx -u origin/xxx #将本地分支设置对应的远程分支 (git branch xxx 后发现 远程分支已存在)
git checkout xxx #切换分支
git checkout -b xxx #建立并切换分支
git merge dev #当前分支与dev分支 orgin/dev合并远程分支
git rebase xxx #和merge一样是合并,不同的是副分支的也会合并最新commit时间点之前的主分支commit
git branch -d xxx #删除本地分支 需要checkout到其它分支,同时需要合并分支 -D可以强制删除
git push -d origin xxx #删除远程分支
git remote show origin #查看远程和本地不同步的分支 out of date(过时)表示你要清除的东西
git remote prune origin #修剪,会对远程已经删除的分支进行删除同步
9. 合并分支
场景:将主分支和dev分支合并到主分支
git checkout master
git merge dev #当前分支与dev分支
git merge orgin/dev #合并远程分支
#解决冲突后
git add .
git commit -m "合并分支"
git push
注意:合并是合并在当前分支,如在master,其它分支dev是不受影响的。同时git add 的一些列操作,只有解决冲突时才需要,如果合并后旧文件没有冲突、改变是只用push就行的。
10. Gitflow工作流
在中大型项目使用:
有如下分支使用
master 用于上线版本 创建dev分支 (领导合并)
develop 用于相对稳定的版本,创建feature 和 release(领导合并,用于合并feature的代码)
feature 用于开发某几个功能,合并到develop 不同功能可能会创建不同的分支,可能有多个 (这个是程序员负责的)
release 用于代码上线前的准备,合并到develop,(测试,bug修复),创建bugfix和hotfix
bugfix 用于修复不紧急bug 程序员修复,合并到release
hotfix 用于修复紧急bug 程序员修复,合并到release
11. 文件状态详解
git status 查看状态,也可以使用小乌龟查看状态图标
文件状态:
1.没有被add过的文件叫untracked 【无足迹】
2.add之后文件处于staged 【已暂存】,等待commit
3.commit之后文件处于unmodified【未修改】
4.当unmodified【未修改】的文件被修改则会变为modified【修改】,modified【修改】是因为文件会跟仓库中的文件对比
5.modified【修改】之后的文件add之后将继续变为staged【已暂存】状态\
注意:git status实际显示的时候只有Untracked和Modified,关注信息的颜色由红【untracked】变为绿【staged】就可以了
12. 其它
可能还需要了解的信息
12.1 忽略文件
设置 .gitignore.txt 文件,内容为根目录的相对路径,如下:
#代表git下的相对路径
/前端工程化_webpack基本使用/node_modules
#会获取git下的所有这个文件
node_modules
12.2 通用配置
一些常需要的配置
git config --system core.longpaths "true"
git config --global core.autocrlf "false"
git config --global http.sslverify "false"
12.3 HEAD 是一个指针,它使得Git知道你在哪个分区工作
12.4 origin/master
“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。
“master”是github的默认分支名,由于美国某个运动,在2020年10月后github将默认分支名master改为了main
12.5 远程操作提示
origin/dev 有斜杠 代表分支路径
origin dev 没有斜杠 代表一些操作
12.6 github中的commits
每个commit都有记录,合并有单独的记录。而合并的主分支同样有其它分支的commit记录。
也就是说master分支合并了dev和fg分支,dev和fg分支各commit了一次,那么当master push 上远程时会有dev和fg的commit记录和merge记录。
12.7 tag
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
比如说,我们想为我们的 runoob 项目发布一个”1.0”版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)”v1.0”的标签。
-a 选项意为”创建一个带注解的标签”。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 我推荐一直创建带注解的标签。
git tag -a v1.0
当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
例如,假设我们发布了提交 85fc7e7(上面实例最后一行),但是那时候忘了给它打标签。 我们现在也可以:
git tag -a v0.9 85fc7e7