CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

git笔记(学会了吗)git简书,Git初步,丞旭猿免费源码交易平台,

1.git csdn

一、前言Git算是程序员必备的知识技能吧,我也断断续续在用着,但也有长期不用的时候写此文用以备忘同时也希望能帮助初学的一知半解者理解掌握本文将介绍Git的相关概念、应用工作流、常用的操作指令以及Git的基本原理机制。

2.git快速入门教程 简书

注:阅读本文需要有一定的版本控制系统应用基础。二、准备三军未动,粮草先行。先无脑安装一波。这是官网:Git​git-scm.com/

3.git教程详解

Git安装完后,再装个比较流行的图形操作界面工具(TortoiseGit):Windows Shell Interface to Git​tortoisegit.org/download/三、概念Git是一个免费并开源的版本控制系统。

4.git用法详解

官网也不客气:我大Git比Svn、Perforce等版本工具叼的多It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase…

5.了解git

CVS、Perforce等我没用过,综合上说Git比Svn更优秀我完全认同Git的主要特点是分布式怎么理解这个分布式呢?我们使用Git的组织结构和Svn往往是一样的:有一台Git/Svn服务器,多名开发者在自己的本地向这个服务器上传内容,从这个服务器下载内容。

6.如何git

给人的感觉上,二者都是集中式的,怎么就分布式了呢?重点是Git本地仓库是自治的首先我们从本地内容版本怎么获取开始Git从服务器上获取内容的操作名字叫做Clone(克隆),而Svn的叫做Checkout(检出)。

7.懂得git

从名字上就暗示了二者本质的区别Git是让你本地克隆出一个几乎完全相同的仓库,这个本地仓库理论上是和远程仓库平级的我们在本地的修改,首先是通过Commit操作提交到本地仓库上,此时已经意味着修改内容正式登记入库了,且在日志上可以看到我们的提交内容,而远程仓库完全不知情。

8.关于git

我们可以持续Commit内容变更,完全不用搭理什么Git服务器,当它不存在好了由于我们工作需要协同,其他同事想获取你修改的内容,那么好的,通过一个Push(推送)操作,将我们本地仓库登记在案的内容上传到我们指定的地方去。

9.怎么git

甚至,我们可以把自己这个本地仓库变成服务器,让其他同事的去克隆,去上传内容到自己的仓库来对那个同事来说,你的本地仓库,就是他的远程仓库所以,Git的每个仓库是独立自治的只不过,自治的仓库附带有一个功能,可以设置一个甚至多个目标远程仓库,与之做数据交互。

10.git 操作

而Svn仓库则不然,你本地所检出的是一个工作副本,不能称之为仓库服务器上的仓库和你本地的工作副本是主从关系我们每次提交都是必须直接提交到服务器上如果断网,那么我们就无法提交内容,并且连日志都看不了Svn的诸多操作都是在和服务器通讯,从服务器获取信息展示给本地。

Git则相反,绝大部分操作的都是在本地进行,本地就是中心!举个简单例子,Svn不存在创建本地分支的概念,Git可以创建本地分支,至于要不要把这个分支同步到远程,完全由自己控制决定和Svn相比还有一个重要不同是数据的存储方式。

Svn是基于每个文件的历史差异变更叠加存储,形象的说是单一线性的结构而Git对待文件是快照的方式,同一个文件的不同版本是不同的快照Svn创建分支,是将原本分支的文件全部复制一遍,产生了全新的文件Git创建分支,只是创建了一个“指针”,指向了原分支的快照。

所以Git分支功能在性能上和存储优势上均完爆Svn四、工作流程

Git工作流示意图下面来解释上图中的各个区域和操作本地仓库本质就是本地的一个文件夹(例如 /MyProject)文件夹里包含了本地仓库的所有内容版本库指的是本地仓库里隐藏文件夹 .git (例如 /MyProject/.git)。

该文件夹下包含了Git仓库的内容数据以及这些数据的控制信息和Git仓库的配置信息

.git文件夹下的内容一般来说,这里的文件都是Git程序负责读写的,我们不会去手动编辑工作区工作区就是我们平常工作编辑的区域(例如/MyProject目录下,除了/.git以外的地方)我们在工作区里随时添加文件,删除文件,修改文件内容。

索引指的是版本库里index文件(例如 /MyProject/.git/index)这个文件是版本库中的底层数据库和工作区之间桥梁在我们准备把工作区的变更正式提交入库之前,需要先走一个申报程序,名曰git add。

git add是一个git命令操作,用于指定我们准备要提交那些文件内容完成这个操作后,这些文件就会被缓存到Git底层数据库中(.git/objects),index文件也因此发生变更注意index并不存储具体内容数据,而是用于追踪这些数据文件。

index记录了这些文件的基本信息,并索引到Git的底层数据库中也有人把index叫做暂存区,因为预提交文件内容被暂存起来了(staged),这个说法显得更容易理解如果接下来我们又执行git commit操作,就是从index那拿到数据库地址,获取预提交的文件快照,然后正式提交到版本库中。

已暂存的内容如果没被提交,可以通过git rm命令来解除暂存综上,我给index的定义是:index用于存储工作区预提交内容的控制信息,这些控制信息用于协同未来的commit操作,从而完成正式提交入库需要注意的是,如果用图形操作界面(TortoiseGit)Commit,实际上是把git add和git commit一并做了,将两步走变成了一步走。

所以我们往往意识不到有index的存在那么为什么需要暂存机制呢?个人感觉主要是为了方便选择性提交试想在linux环境下,没有图形化界面辅助,我们修改了50个文件,然后准备提交其中的48个,怎么办?先看看Svn怎么办。

要通过命令:$svncommit-mLogMessagepath1path2…path48这个命令长度,敲得让人绝望而Git呢,我可以改一个文件add一下可能的命令是这样:$gitaddpath1$git

addpath2…$gitaddpath48$gitcommit-mLogMessage最后一个commit命令,把index里的所有暂存一波带走也许暂存区还有其他妙用,毕竟多了个功能,就多了份可能嘛。

贮藏这个名词听起来有点陌生,查了官网的中文文档是这么翻译的( ̄^ ̄)一般更习惯用stash来称呼它(注意区别上文中的staged)stash对应的存储文件是/.git/refs/stash指令git stash push会把工作区所修改的文件(不论是否已被index暂存)贮藏起来。

这时候工作区被还原回干净的目录,没有任何修改常用于把暂时不想提交的修改内容隐藏,以便Git 拉取,合并、切换分支等操作能执行下去(这些操作都要求干净的工作目录)指令git stash pop可以将贮藏起来的内容还原回工作区中。

以上把图中的各个区域介绍完了,接下来讲Git工作流中的各个操作git add指定工作区中的变更文件,更新到索引/暂存区里,为下次提交(commit)做准备在commit之前可以多次执行addgit commit。

根据index获取已staged的内容,正式提交到当前分支上而TortoiseGit的Git Commit按钮实际上是把git add和git commit合并执行注意区别Svn的Commit,git commit不会影响远程仓库。

commit时要求必须写提交描述(Message),例如:$gitcommit-m修复空指针报错git stash将工作区中的修改隐藏,还原回干净的工作区可通过git stash pop将隐藏起来的内容恢复到工作区中。

git push将本地分支推送到远程仓库$gitpush[remote][branch-name]命令中remote指的是远程机器的名字,默认是origin,branch-name指的是本地的分支名字推送成功就意味着我们本地该分支的所有commit内容成功同步到远程对应分支(如果远程没有这个分支,那么会创建)。

这个命令需要我们拥有对应远程仓库的写入权限,比如会要求我们登陆输入账密git clone在本地克隆一个世界上已经存在的仓库例如把Python源码仓库克隆到本地(该命令要求对指定仓库拥有读取权限):$git

clonehttps://github.com/python/cpython.git假设cpython这个仓库拥有3个分支:main、3.10、3.9当克隆到本地时,它们就变成3个远程分支origin/main、origin/3.10、origin/3.9。

同时Git会帮我们自动创建其中一个本地分支,比如main,并检出到工作区中此时,只有一个本地分支main关于分支后面会继续介绍git fetchfetch译为抓取将远程仓库同步到本地仓库我们克隆的远程仓库过了一段时间后,可能别人对远程仓库做了变更,我们想要获取远程仓库最新数据的话则通过fetch来将本地仓库同步到最新。

注意fetch不是更新一个分支,而是将远程仓库的所有分支、Tag等数据全部下载fetch不会自动对本地分支进行合并,也不会影响工作区当前的状态可以这么认为:本地仓库中,存在两种分支类型,一种叫远程分支,一种叫本地分支。

我们无法改变远程分支内容,只能通过fetch来更新它们,这也正是fetch的作用git mergemerge即合并,将指定分支合并到当前分支上,同时更新内容到工作区#假如当前正处于main分支,下面指令意为将origin/main分支合并到main分支。

gitmergeorigin/maingit pullpull,拉取一般情况下git pull等同于git fetch+git merge,即抓取远程数据并自动尝试合并到当前所在的分支从结果表现上说,pull可以将远程仓库内容直接更新到工作区中,但实质不是这样。

所以前文的工作流示例图将pull流程画成虚线pull指令要求我们当前所处在的分支和远程分支有对应追踪的关系,否则将无法执行例如我们自己在本地创建了一个featureA分支,但远程分支中并存在,则pull会失败。

可以将featureA分支push到远程,之后再pull才可成功或者我们可以指定从哪个远程分支拉取git pull origin 再或者可以设置当前分支featureA和一个远程分支的追踪关系,之后亦可pull成功。

git branch –set-upstream-to=origin/ featureAgit checkout检出,我理解它字面上的意思是从仓库取出内容到工作区checkout之后跟一个分支名字即表示将该分支检出。

检出成功则Git切换到了该指定分支,同时工作区内容也随之变化git checkout [branch-name]五、特色功能变基Rebase整合2个分支内容,常常用的是合并这个方式但还存在另外一种颇受青睐的方式——变基。

假设你基于master分支创建了一个feature分支,然后一直待在feature分支上开发一周后,你完成了开发功能,打算把feature分支内容合并到master分支但master分支可能在这期间被同事给改过了,此时feature分支即便毫无冲突地合并过去也无法保证正常工作。

比如你的同事把master上的一个函数删除了,而你却在feature里调用了这个函数所以我们必须把最新的master分支合并到feature,在feature分支上排除万难一切正常后,再从feature合并到master。

这种做法虽然可行,但形成的commit链比较纠葛,产生的日志会也比较复杂利用变基的做法是,feature依据最新的master进行变基呃,听君一席话,如听一席话- -feature这个分支的基础原先是一周前的master,变基就是将它构造成基于今天的master(有点gaygay的?)。

相当于是把feature上所有修改集成一个补丁,在最新master的屁股后面插入这个集成补丁丁,构成了新的feature当然,变基改造之后,也要将feature合并到master,但此时的合并得到的将是整洁的提交历史和线性的commit链。

操作流程如下:# 切到master分支gitcheckoutmaster# 更新一波仓库和master分支gitpull# 切到feature分支gitcheckoutfeature# 基于master的意志对feature进行改造

gitrebasemaster# 切换到master分支gitcheckoutmaster# 完成feature到master的合体gitmergefeature拣选提交Cherry Pick选择其他分支的一个commit记录,提交到当前分支上。

如下指令,将f1b48…这个commit记录提取出来形成一个新的commit应用到当前分支# 下面指令中的参数是SHA-1值,可以在提交日志里查到gitcherry-pickf1b48b81f8010f82bdad88ed0506cce055ec8887

应用场景:我们有时并不想将某分支的所有提交的内容都合并或变基到当前分支,只想将其中的一个commit更新到当前分支,此时可以使用Cherry Pick如果使用TortoiseGit,操作如下(示例将skills分支的一条提交记录同步给comment分支):。

首先切换到comment分支,打开skill分支的日志界面

打开Cherry Pick界面后,点击执行即可。

压缩提交Squashsquash是merge命令的一个参数选项,用于将指定分支的多个commit归并成单个commit合并到当前分支,同时会更新到索引中,之后需要执行commit提交# 提取feature分支的所有改动压缩成一个提交。

gitcheckoutmastergitmerge–squashfeaturegitcommit-m提交feature分支内容压缩提交的应用场景是:不在乎feature分支开发过程的细节,只要功能完成的一次提交。

如果没用squash参数,则feature分支的每次commit日志将在master上体现子模块SubMoudle指的是仓库里可以引用其他仓库例如我们开发的一个项目,需要依赖某些第三方库,每个第三库都有一个对应仓库。

我们就可以创建多个子模块来对应引入每个第三方库# 默认引入到仓库根目录,也可以在后面加参数指定具体路径gitsubmoduleaddhttps://github.com/xxxxxxxx# 如果我们简单克隆(不带操作参数)一个带有子模块的仓库,则还要执行下面指令才能得到子模块内容

# 初始化本地配置文件gitsubmoduleinit# 更新子模块命令,recursive参数表示递归子模块更新gitsubmoduleupdate–recursiveTortoiseGit操作如下:

打开Submodule界面:右键仓库根目录->TortoiseGit->Add Submodule

图中,Repository里填子模块的Git链接。 Path决定引入到本地仓库的哪个目录。添加成功后会在本地生成或更新 .gitmodules文件(里面记录子模块的Git链接等信息)​

​当克隆一个带有子模块的项目时,会发现子模块的目录是空的,没有任何文件子模块要执行额外操作才能检出(确保你有子模块的权限)右键仓库根目录->TortoiseGit->Submodule Update,打开如下界面,选中所有子模块,点OK。

TortoiseGit似乎没有提供删除子模块的操作那就用命令行了gitrm [submodule-name]往往可以用子模块来实现目录权限的控制例如对子模块内容可读不可写标签Tag是和分支并列的一个概念。

git tag 命令用来为历史提交记录中的某一个点指定一个永久的书签 一般用于发布版本标注,例如v1.0、v1.1标签分为两种:轻量级标签和附注标签,前者等同于是某个特定提交的引用,后者能附带更多信息# 列出标签

gittag-list# 创建当前提交的附注标签-a表示附注annotated,v1.0是我们自定义的标签名字gittag-av1.0-m”软件正式版v1.0″# 创建当前提交的轻量标签gittagv1

.1# 创建指定提交的附注标签gittag-av1.29fceb02d0ae598e95dc970b74767f19372d61af8# 查看指定标签的具体信息gitshowv1.0# 将标签同步到远程

gitpushoriginv1.0# 将工作区切换到指定标签,注意在此状态下提交内容等操作将无效gitcheckoutv1.0# 基于指定标签创建分支gitcheckout-b[branch-name]

v1.0# 在本地删除标签gittag-dv1.0# 删除远程标签gitpushorigin–deletev1.0忽略文件文件名是.gitignore应存放于工作区根目录下用于标记工作区中不需要受版本库管控追踪的文件或目录。

我们可以创建一个名为.gitignore文件,通过文本的方式来编辑该文件举个应用场景,用Visual Studio开发项目时,会在项目目录下产生一个.vs的文件夹,里面都是VS才要用的信息,我们并不关心。

那么可以将”.vs“这个文本写入.gitignore文件这样就标记了忽略.vs,可以避免我们把.vs文件夹提交到版本库中等误操作钩子英文名曰Hooks,存在于/.git/hooks目录下Git钩子是一个自定义脚本调用机制。

Git程序在某些节点会调用钩子脚本比如,commit,push等节点举个钩子作用的例子要求commit时的提交描述要按下面格式规范来写:【功能-778899】商店界面开发【BUG-887772】修复购买数量为负数的问题。

但我们可能在commit时忘记遵守这个规则编写一个commit时触发的钩子脚本就能杜绝这个问题,脚本逻辑就是检查描述信息的文本内容,若不符合规范则禁止commit具体怎么实现还是看官网文档吧,这里就不展开了。

六、常用指令查看当前分支状态gitstatus查看本地分支列表gitbranch查看远程分支列表gitbranch-r切换到指定分支gitcheckout[branch-name]创建新分支#基于当前所在分支创建,创建完,切过去

gitcheckout-b[branch-name]#基于当前所在分支创建,创建完,仍留在原地,不切到新分支上gitbranch[branch-name]#基于指定分支(例如remotes/origin/3.9)创建,创建完,切过去

gitcheckout-b[branch-name]remotes/origin/3.9–删除本地指定分支#普通删除,如果该分支未合并过,会给个友善提示,并拒绝删除gitbranch-d[branch-name

]#强制删除gitbranch-D[branch-name]删除远程分支gitpushorigin–delete[branch-name]创建仓库#新建一个文件夹后在该目录下执行initgitinit

查看配置#查看当前仓库配置,一般看这个gitconfig–local–list#查看当前用户配置gitconfig–global–list#查看系统配置gitconfig–system–list

还原/删除上一个提交# 移除上一次commit,并将其修改内容还原到工作区中gitresetHEAD^# 彻底移除上一次commit,修改内容也不会还原到工作区中gitreset–hardHEAD^更多

Git命令手册:https://git-scm.com/docs暖男提示,大家发现没有,有的命令行参数用的一横“-”,有的是双横“–”这其实是linux命令行风格,一横后面跟的是单个字母,双横之后跟的是一个单词。

好记吧七、Git原理这个部分介绍一些Git内部原理机制,加深我们对Git的理解掌握Git中每次提交都会形成一个快照存储对象每个快照对象都有一个唯一地址来索引它这个地址是一个40位的十六进制哈希值,在日志中就可以看到。

每个提交一般都会存在一个父节点。即新的提交插在上一个提交的屁股后面。

上图中,Cn表示的是Commit记录/快照对象,橙色方块表示的是分支分支其实就是指向了某一次的提交我们从图中解读出:master分支,产生了C1,C2两次提交最近一次提交是C2基于master的C2,创建了develop分支,并在此分支上做了一次提交C5。

基于master的C2,创建了ruby_client分支,并在此分支上进行了两次提交,C3,C4继续看下图

从上图可知,develop分支合并了ruby_client,产生了C6。继续看下图

从上图可知,master分支合并了develop另外,存在一个HEAD的概念HEAD类似一个指针,一般是指向一个分支,HEAD指向谁,就代表着当前工作区处于哪个分支特殊情况下HEAD不是指向一个分支,而是指向一个提交,这个特殊状态就是所谓的头分离。

进入这个状态后会有些限制,Git会给出提醒:You are in detached HEAD state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this

state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may

do so (now or later) by using -c with the switch command. Example: git switch -c

Or undo this operation with: git switch -Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at da98c2e八、GitLabGitLab是一个构建Git服务器的web应用,也可以理解成是远程Git仓库的一个图形化界面工具仓库创建,账户管理等皆在网页上便捷完成此外它还为软件项目开发提供了完备的功能。

这部分内容参考此文:Over~

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容