Git进阶知识
第一次使用git是在接触gitee两个月后的暑假,最开始知道gitee的时候,我只会用web版手动上传OJ代码,之后就了解到了git这个版本控制工具,也略微了解了其原理及命令,简单来概括就是,git分三个区:缓存区、本地提交区、远程仓库
从这三个区展开来说其分别的最简单命令
git add . #将git归属文件夹的的所有文件加入到缓存区
git commit -m "[commit message]" #将缓存区文件提交到本地仓库,并将其附着标记信息,以方便查找
git push #将本地仓库文件提交到远程仓库(github,gitee)
初始化
当然我们在最开始的时候还需要安装GitBash,还有将git仓库init(初始化)
git init
就这样我开始了git push之旅
包括前期的OJ题,中期的Java,JavaWeb练习,一些简单的shell脚本,当然还有现在只做的markdown文档归档,虽然说很少我回看代码,但还是说明自己的当期状态
ssh密匙
Gitee新建仓库有关初始化与关联仓库
GitHub初始化仓库
中间也间间断断的学了几个简单的命令
下载到本地
git clone [Project URL] #从某个仓库克隆一个项目到本地
git pull [Project URL] #同步并合并到当前分支
密匙和access tokens
当然其中我在Gitee密匙和github Personal access tokens上也栽了不少跟头
- 提交的不是已认证的账号
- 推送不上github
一系列的原因,因为其中21年的10月,我回家路上把固态摔了,所有环境必须重配(虽然用Windows的账户和谷歌的一些备份稍微回了下本)
而github的token我当时也是不是很知情,只是想尝试下github,因为接触了部署博客等一系列事,故想将静态博客部署在GitHubPage上,但由于英文功底和知识浅薄,没将静态博客部署在github上,github Personal access tokens就是这个时候恶心了我半天
github使用Personal access tokens的方法
签出并新建分支,及状态查看
要是多会儿说起对git有个更深层次的认知就是做Music项目的时候
https://github.com/programmer-yili/yili-music-doc
这次这个项目让我对敏捷开发及版本更迭有了更深层次的理解和认知
当然这些都是用git来当做载体,就又学到下面这几个命令
git checkout -b [Branch name]/[Version Number] #新建并签出一个新分支
git status #查看目前git 缓存提交状况 多用于与git add 添加缓存配合使用
本地版本回溯
由于这个项目比较大,很多次复刻服务及功能也有经常失误的地方,在提交之后,我都想怎么回溯到没将代码写错的时候,这个时候,我终于想起了用版本回溯来复原之前的代码
git log #查看本地提交版本号
git reset --hard [Target Version ID] #将本地版本回退到目标版本
git reset --hard HEAD~1 # 回退到上一次的提交, 如果是上n次就将1改成对应的数字
敏感文件提交
之后我又面临提交敏感代码的问题(出现将node_modules(我好像没写那么多JS啊??),password上传到远程仓库),在Web页面上即使删除,也可通过commit来进行查看
故我搜索了一番,找到了所谓的新手时光穿梭机,之前做过一个后台管理项目,也涉及到了敏感内容,但由于现在的项目提交的版本不多,故对迭代功能查看没有什么影响,而之前那个项目,多个版本提交全部覆盖,导致如果时间很长,你都不清楚那个项目加了什么组件,怎么实现的功能。
虽然其中磕磕绊绊不断,但上一个项目(前后端分离后台管理那个项目)给我的启示也是很多的,就单从每个项目的提交代码上就可以学到不少新知识
吃了一天的瘪,我长记性了,知道有.gitignore这个东西,用这个文件来对git敏感文件及不必要文件提交管理
现实情况上,千万不可将重要的环境配置提交或固定到公开仓库
什么是合并和变基,合并和变基有什么区别?
时间一久代码量多了,分支多了,就自然而然的涉及到了变基和合并
由于我使用的是IDE来对分支进行变基和合并,故这里没有涉及到命令
我们要清楚每次的合并和变基都有一个目标,而这个就是合并或变基的目标
比如上图是对本地分支进行合并和变基,而下图
而上图图是对本地main分支进行合并和变基
至于变基和合并有什么区别呢?
我理解的变基就是将当前分支与目标分支的进行差异版本比较,将差异版本按本分支提交队列重新提交到目标分支
而合并就很简单了,只是对比两个分支的差异代码,若出现冲突,进行选择保留,然后重新提交合并,没有就可以直接将差异代码对目标分支进行合并
可能这里说的不是很严谨
这里贴出详情
在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?
什么是签出
我理解的签出,就好像多线程中的锁一样,只要你对其进行签出,那么这个锁就只有你拿到,来对该分支的代码进行编辑和修改,而别人不能对这个分支进行任何操作,因为这个锁在你这里,所以在我们这个锁没有归还之前(没有签出其他分支之前),其他人是不可对该项目进行签出的,这样保证了仓库代码的同步性和一致性
重置分支置至目标提交
当然我在重置某个分支到目标提交的时候还遇到过
有的时候我怕影响到目标提交的代码纯净度,所以经常会使用硬重置,当然如果玩熟的话,完全可以根据自身需要来进行混合重置等
当然这些知识只是git的冰山一角,如果后续在工作或学习中学习到新的知识,会新增到这里
git原义就是饭桶的意思,当初由于没有可靠的版本控制工具,Linus在处理Linux内核的开源分支PR(合并)时,抱怨开源贡献者提交的代码不规范所开发的。
代码不规范,Linus两行泪
说个题外话,前些天不是Gitee由于涉及很多政治敏感问题,将很多开源项目重新闭源,我其实也是最开始使用的就是Gitee,只能说我对Gitee这样的行为表示可惜,开源注定无法在当下有好的发展
**24/1/6 更新
多远程仓库设置
一般我们在使用git进行提交的时候,通常只设定了一个对应的远程仓库即origin,但是假如我们要将该仓库的代码对另外一个远程进行提交的话,再拉一个项目再重设远程这样可能不太优雅,所以为了就决这个问题,我研究了对应git设定多个远程仓库的情况同样包括远程仓库的分支
- 你需要在当前的Git项目中添加新项目的远程仓库。你可以使用git remote add命令来添加新的远程仓库。例如,如果你想要添加一个名为new_origin的远程仓库,你可以使用以下命令:
git remote add <new_origin_name> <remote_report_url>
eg: git remote add new_origin git://github.com/user/repo.git
- 然后,你需要获取新的远程仓库的所有数据。你可以使用git fetch命令来获取新的远程仓库的所有数据。例如,你可以使用以下命令:
git fetch <new_origin name>
eg: git fetch new_origin
- 创建新添加的远程仓库的分支, -b选项用来设置新的分支追踪的心得远程仓库分支,下面例子是跟踪新仓库的dev分支
git checkout -b new_branch new_origin/dev
- 将对应的修改commit推送给指定分支
git push origin <推送给原远程仓库>
git push <new_branch_name>
**请注意以上的所有new_branch_name仅仅是你本地该git commit中的对另一个远程仓库的别名,而非由远程仓库的属性或定义而来,该别名只是在本地的推送或更新起到作用而非命名远程仓库
Q.E.D.