gitlab特性和实用技巧
目录结构:
- 第一章 git概述
- 1.1 本地仓库结构图
- 1.2 文件状态
- 1.3 生命周期
- 第二章 git于svn比较
- 第三章 Git及基本特性及应用
- 3.1.获取git仓库
- 3.1.1 初始化版本库
- 3.1.2 首次推送本地项目到远程仓库
- 3.1.3 克隆远程仓库
- 3.2. 分支管理
- 3.2.1 svn和git
- 3.2.2 本地分支操作
- 3.2.3.分支合并
- 3.3 关于版本回退
- 总结:
- 3.4 撤销修改
- 1. 存在两种情况
- 2.处理办法:
- 总结:
- 3.5 删除文件
- 3.6.git的暂存功能
- 场景
- 总结
- 3.7.多人协作
- 3.8关于标签
- 3.8.1 创建标签
- 3.8.2 操作标签
- 3.1.获取git仓库
- 第四章 git 删除远程仓库文件
- 4.1 预览将要删除的文件
- 4.2 确定无误后删除文件
- 4.3 提交到本地并推送到远程服务
- 4.4 修改本地 .gitignore 文件 并提交
第一章 git概述
1.1 本地仓库结构图
1.2 文件状态
已提交(committed):数据已经安全的保存在本地数据库中。
已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已修改(modified):修改了文件,但还没保存到数据库中。
工作流程:
1、检出工程。
2、在工作目录中修改文件。
3、暂存文件,将文件的快照放入暂存区域。
4、提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
1.3 生命周期
使用Git 时文件的生命周期:
第二章 git于svn比较
总结对比,如下所示:
|
SVN |
Git |
管理方式 |
集中式 |
分布式 |
联网 |
Commit/log必须联网 |
本地可进行任何操作 |
服务端软件支持 |
必须有服务端 |
不需要 |
数据保存 |
按文件保存 |
按元数据保存 |
分支管理 |
另开一个目录,完全拷贝一份 |
同一个目录,文件只一份,存快照 |
第三章 Git及基本特性及应用
3.1.获取git仓库
3.1.1 初始化版本库
在计算机上任意地方创建一个文件夹,进入文件夹目录右击鼠标点击git bash here打开git命令窗口,执行git init命令。
3.1.2 首次推送本地项目到远程仓库
将要推送的项目拷贝到本文件夹下,然后执行如下命令:
$ git add . #跟踪文件并将文件添加到暂存区 $ git commit -m “提交信息” $ git remote add origin git@gitlab.com:mingming/projectName.git(关联一个远程库) $ git push -u origin master |
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
3.1.3 克隆远程仓库
git clone git@gitlab.com:mingming/projectName.git(即:[url])
3.2. 分支管理
3.2.1 svn和git
SVN中的分支?
完全拷贝,与其他分支是不同的文件
实践中往往开发分支没有及时同步到主分支
结果:开发分支与主分支差异越来越大,以至于无法同步……
本地提交前须update,可能造成:本地代码正常,update后冲突,解决冲突时不小心覆盖了自己新加代码
Git分支
git保存的是快照
不同分支都是在同一份文件上,git保存不同版本快照
分支的迁移很容易 —— 改变“指针”指向
3.2.2 本地分支操作
基本命令:
1)查看分支:git branch
2)创建分支:git branch branch-name
3)切换分支:git checkout branch-name
4)创建并切换分支:git checkout -b branch-name
5)合并某分支到当前分支:git merge <要合并的分支name>
6)删除分支:git branch -d branch-name(对于未合并的分支,使用此命令无法删除,需要换成-D强制删除,但会丢失掉此分支所做的工作)。
7)哪些分支合并到当前分支:git branch --merged(反之,git branch --no-merged)
8)删除远程分支:git push origin --delete 远程分支。
基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。
9)git提交历史查询:git log --graph --pretty=oneline --abbrev-commit。
3.2.3.分支合并
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
可以看到,不使用Fast forward模式,merge后就像这样:
3.3 关于版本回退
git reset --hard HEAD^或 git reset --hard 版本号(可回到任一个版本)
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
如何获得删除掉的版本号:
Git提供了一个命令git reflog用来记录你的每一次命令。
总结:
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
3.4 撤销修改
1. 存在两种情况
1)一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2)一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
2.处理办法:
1)对于第一种情况:
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。
2)对于第二种情况:
用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
通过git reset HEAD <file>回到了第一种情况。
总结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
3.5 删除文件
现在你有两个选择,一种是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt |
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
3.6.git的暂存功能
场景
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交。
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stashSaved working directory and index state WIP on dev: f52c633 add merge |
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
修复完成后,切换到master分支,并完成合并,最后删除issue-101分支。
现在,是时候接着回到dev分支干活了!
$ git checkout dev |
工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
$ git stash liststash@{0}: WIP on dev: f52c633 add merge |
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一种方式:用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式:用git stash pop,恢复的同时把stash内容也删了:
$ git stash pop On branch dev Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: hello.py Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a) |
再用git stash list查看,就看不到任何stash内容了:
$ git stash list |
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:$ git stash apply stash@{0}
总结
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
3.7.多人协作
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突(手动处理)。
3.8关于标签
3.8.1 创建标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签。
3.8.2 操作标签
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签。
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
第四章 git 删除远程仓库文件
第四章 git 删除远程仓库文件
项目开发初期由于.gitignore 文件配置不正确很有可能导致某些不需要的目录上传到 git 远程仓库上了,这样会导致每个开发者提交的时候这些文件每次都会不同。除了一开始提交的时候注意配置好 .gitignore 文件外,我们也需要了解下出现这种问题后的解决办法。
具体操作步骤如下:
4.1 预览将要删除的文件
git rm -r -n --cached 文件/文件夹名称加上 -n 这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览。 |
4.2 确定无误后删除文件
git rm -r --cached 文件/文件夹名称 |
4.3 提交到本地并推送到远程服务
git commit -m "提交说明" git push origin master |
4.4 修改本地 .gitignore 文件 并提交
git commit -m "提交说明" git push origin master |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统