git+svn
下载和安装就不说了,从官网去找
1,新建一个文件夹,然后右击鼠标,点中git Bash Here,
2,这个是空文件夹,就去指定地址clone=====>git clone 地址(然后回车即可下载完成,这里下载的都是master分支代码,如要指定分支,如下操作)
要clone指定分支的代码,可以把分支参数加上
git clone -b dev https://github.com/xxxx/xxxx
这里就是克隆下来dev分支的代码
2,1如果不是空文件夹,就先执行git init ===> git add . ====> git commit "描述信息"
3,创建分支,(前提必须是init,add,commit都执行完成才可以创建分支,否则会报错) git branch dev
4,切换分支git checkout dev
5,查看当前所有分支,git branch (所处分支会有绿色高亮显示)
6,查看当前状态 git status
7,查看提交信息 git log
8,第一次推代码,git remote add origin(这个origin是默认的值,我们可以自定义其他的名字,以后自己记得即可,就是url地址的别名,) https://gitee.com/dream-bule/based_on_flask.git
这个是完整的命令: git remote add origin https://gitee.com/dream-bule/based_on_flask.git
这样就是建立了连接,然后就能push了,否则是无法提交的
9, git push --set-upstream origin lmj # 这样就行了,就推上去了
这下面是我踩到的坑
$ git push origin 我直接执行了这个命令,然后就有下面的提示信息了,照着提示信息输入即可 。
fatal: The current branch lmj has no upstream branch.
To push the current branch and set the remote as upstream, use 这里是提示信息:
git push --set-upstream origin lmj
如果push的时候报错就具体情况具体解决吧,会遇到冲突,然后把冲突手动解决掉,然后还会遇到pull问题,要先pull下来,再push上去
文件的目录格式需要保持一致,这个很重要,否则的话,开发过程中合并代码,然后遇到冲突都会很麻烦,要保持一致就把git创建在你所需要展示的文件目录中即可
我们执行push命令的时候,它内部是把当前的分支push到远程地址中的同名分支中
如下所示:
flask_check_list git:(dev-flask) git push dream dev-flask
我当前所在的分支是dev-flask分支,然后我推到远程地址dream的dev-flask分支中去,就像上面这样写命令
如果我往远程地址推送的分支a不是我当前本地所在的本地分支b中,我要如何硬推呢
flask_check_list git:(dev-flask) git push dream dev-flask:master
需要指定我当前的分支名:远程地址的分支名,这两个参数都要加上才可以。
这就是我当前所在的本地分支名称是dev-flask,想要推到远程地址的master分支中去,就像这样写即可。
10,强行push的命令
# 如果遇到这样的报错,就要强行推到远程仓库中去
fatal: refusing to merge unrelated histories
这是强行推的命令:
git push -f <remote> <branch>
remote就是远程仓库的地址,branch就是远程仓库的分支。
冲突中区分哪里是自己负责的部分
<<<<<<<<<<<<head
这里是我自己本地的代码
================
这里是别人的代码(有可能是你需要push上去的远程仓库的代码,也有可能是跟别人合并时候的本地别人的代码)
>>>>>>>>>>>>>>>>

1 模块和包之间的功能解耦,我们的django里面的中间件和setting配置项都是利用这样的方式,我们把模块和文件之间分割好,然后建立一个setting文件,在包里创建一个init文件,然后把所有的文件引入到init里面,写代码执行它们,在setting里面写成这样的字符串的格式,然后先用rsplit把字符串分割,得到模块名,然后使用importlib,以及反射,把模块路径取出来,就可以执行代码了,我们如果不想用这些配置文件,只需要把它注释掉即可,这里就是我们的功能解耦,不需要改哪怕一行代码,如果需要增加功能,只需要增加配置文件即可,然后就像我们创建App一样把路径放到setting里面即可. 2 3 MIDDLEWARE = [ 4 'django.middleware.security.SecurityMiddleware', 5 'django.contrib.sessions.middleware.SessionMiddleware', 6 'django.middleware.common.CommonMiddleware', 7 'django.middleware.csrf.CsrfViewMiddleware', 8 'django.contrib.auth.middleware.AuthenticationMiddleware', 9 'django.contrib.messages.middleware.MessageMiddleware', 10 'django.middleware.clickjacking.XFrameOptionsMiddleware', 11 ] 12 13 今日上午内容回顾, 14 一开始我们是回顾了restful api,里面有10中规范, 15 协议, 16 域名, 17 版本号, 18 路径 19 method请求类型,post/get/patch/delete/put/trace/options/header 20 过滤条件, 21 状态码, 22 错误处理, 23 返回结果, 24 Hypermedia link 25 26 27 28 还有rest_framework里面的10个组件 29 router 30 APIView 31 serialzer 32 parsers 33 视图 34 permission 35 authenticate 36 throttle 37 render 38 pagination 39 40 41 42 43 44 以及我们的rest_framework里面的源码,我们的那10个组件里面,所有的源码都需要走一遍,然后要把流程,如何跳转的都记录下来,每一步的跳转的返回值,返回给谁了,都需要做记录. 45 在源码流程里面我们总结了一个点,为我们以后写代码提高水准,那就是我们的中间件和setting里面的配置项,他们就是使用我们上面说的那种模块之间的调用功能解耦,把每一个模块写到一个单独的文件里面,然后把这些文件存入到一个包里面去,再这个包里面写一个init文件,它是配置文件,程序会从它里面开始加载,把执行代码写到init里面去,然后我们在包外面开一个包,里面开辟一个setting文件,把那些模块的路径写到我们的setting里面以字符串的形式写入,再从setting里面开一个文件夹,把setting里面的东西都引入,同时开始拆解我们的setting里面的那些字符串,先把模块名拆出来,再把路径给还原,使用importlib模块和方法,就是这个逻辑,我们以后开发的时候就按照这个逻辑去处理我们的模块之间的调用关系,什么时候不想用哪个模块了就直接注释掉即可,不需要改动哪怕一行代码,实现功能解耦,如果要添加模块的话,就在setting里面把路径添加上即可. 46 47 然后就是今天的内容, 48 content_type 49 50 from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation 51 from django.contrib.contenttypes.models import ContentType 52 它是一个django里面的App,项目启动后就会自动生成的一个表格,这个表格就是content_type,它里面是我们的django项目创建后所有的App名字以及App下面的表格名字,我们在model里面创建的表格,要关联数据,对数据做操作,可以通过这个content_type来执行,它是一个桥梁,使用它会更加便捷,当然了,否则也不会用到它, 53 我们在model里面创建数据的时候,要引入模块,然后对于跨表操作的时候, 54 使用content_type这个桥梁直接就能获取到对象,它是一个类实例化出来的方法,它通过这个GenericForeignKey类外键关联我们的django里面自动生成的contenttype表里面的与之对应的App和表格, 55 56 57 cors 58 它是处理跨域请求用的,所谓的跨域就是简单来说我的电脑上有两个服务器,同样的ip,不同的端口127.0.0.1:9000,127.0.0.1:8000他们彼此之间互相访问,就是跨域,跨领域访问进行数据交互,这种行为是被浏览器默认禁止的. 59 我们如果就一定要访问,那么就可以使用除了jsonp以外的cors来解决这个问题,请求发过来的时候我们会进行区分,有简单的模式,还有复杂的模式,两种模式下我们的处理方式也是不一样的.要判断是否是简单模式要同时满足两个条件,请求类型是post,或者get,还有不携带请求头,如果请求类型不是post/get同时还携带请求头,那么我们在处理的时候就需要把两个条件都加上才可以实现跨域. 60 access-control-allow-origin 61 有固定用法, 62 git 63 用做版本控制 64 资源管理器,我们把所有的代码都上传到这个软件Git里面它可以帮我们检测我们上传的文件,有任何改动都能检测出来,然后把改动的部分进行保留,存储,同时我们还可以恢复改动,这样类似于资源共享,它里面还有更多的功能,异常强大有待挖掘,使用简单的命令就可以调出里面的内容,在简单的命令的基础上会有参数的增加,会有更复杂的命令. 65 66 67 68 69 我们的更加复杂的Git命令,使用背景简单介绍一下, 70 比如我们在开发过程中,先把第一个版本推送了,运行,然后我们再对其进行重构,进行升级,这个时候我们就会在Git里面创建另一个版本,这里我们叫分支,也就是我们的 71 git branch version2 这里的version2是分支的名字,这一句是创建分支, 72 73 然后我们需要切换到该分支里面, 74 git checkout version2 75 76 我们在这个分支里面进行代码升级和重构,git ls就是获取到所有文件名,我们如果是简单的在指定文件里面添加简单的内容的话就可以使用这个命令 77 echo "添加的内容" >> 文件名 然后我们要查看内容的话就cat 文件名 得到的就是我们刚刚添加的内容 78 79 一般我们就是直接找到文件名然后改里面的代码,再输入指令把改动过的文件提交即可这一步比较简单就是上面我们的初始步骤 80 然后我们的版本是需要合并的,提交的仅仅是我们切换到的这个版本,我们的其他的版本并没有我们所提交的这些内容,所以我们需要在主版本master里面把version2的内容合并到一起, 81 82 git merge master 这里就是合并了当前版本和master版本的命令,合并的时候会有冲突出现,我们在工作中是协同开发的,那么就需要大家每一个人都创建一个自己的分支,这样我们各自改动自己负责的功能,最后大家都把自己的代码合并到review这个分支里面(这个时候每个人都在自己的分支里面创建的代码都跟同一个分支去合并,这个时候就会产生冲突),这个时候就会出现我们彼此都会对于同一个文件的同一个地方进行更改,如果有冲突出现那么系统就不会让它合并成功,它会困惑不知道你要保留哪一部分,所以就默认保留有冲突的部分,然后给出提示,如果是我合并的时候有提示冲突出现,那么就会在我的文件里面出现冲突提示,我需要去做更改,然后再提交就可以了,把有冲突的部分解决,解决的方案就是删除掉多余的部分,剩余的保留即可. 83 84 我们的文件一般是不保存在本地的,因为是受限于硬件条件,所以我们会存到类似于云端的地方,这里我们一般是使用github,它是全球最牛逼的代码管理器, 85 我们在github里创建一个代码仓库,然后往这个仓库里面提交代码,我们的git软件支持使用url远程推送版本信息或获取版本信息,所以我们在git里面指定url信息就可以把代码推送到该url,然后还可以从该url里面取出我们所推送进去的代码. 86 87 git remote add origin(这里是给url地址起别名) https://github.com/WuPeiqi/pondo.git # 这里就是建立url连接 88 89 然后开始推送代码 90 git push origin master (在push的时候我们需要push的分支是master,要在push之前把我们的分支和master合并然后再push上,如果你不合并到master上,那么你push之后它就不在master里面,到时候clone的时候就不会clone上,我们的clone只能clone到master分支,而不是其他分支,所以我们提交的时候都在master里面合并一下,然后再提交,这样下次pull的时候就会直接从master里面pull回来即可,或者我们使用什么分支去push,那么就使用什么分支去pull回来,也是一样的)这里是把我们的该版本下的文件推送到上面的地址里面 91 在push的时候也会有冲突产生,如果我们都使用同一个分支,然后往同一个分支里面去push文件,就会有冲突 92 93 推送的时候第一次操作会有系统提示登录用户名和密码(github的用户名和密码) 94 然后我们按照提示操作即可 95 96 我们下次要获取我们存入到github里面的文件的时候就从里面去取出来(取出来的时候我们选定一个文件夹,然后右键打开gitbash,就可以看到我们的Git命令窗口,然后再输入命令操作即可) 97 第一次使用的时候需要从url里面进行clone, 98 git clone https://github.com/WuPeiqi/pondo.git 99 100 clone下来之后就创建分支继续开发代码,然后开发好之后合并再提交上传到仓库里面 101 102 第二次开始往后就不需要clone 103 直接pull即可 104 105 git pull origin master 106 从github仓库里面拉下来我们的最新版本的文件,然后就可以继续开发了 107 108 我们的文件在进行版本控制的时候有一些文件我们不想进行检测,比如我们的数据库比如我们的静态文件,我不想检测它的一切变化,那么我们就创建一个.gitignore文件, 109 使用touch .gitignore命令创建即可, 110 然后我们把我们不想进行修改内容自动检测的文件给写入到.gitignore里面, 111 我们写入的这个文件不仅仅是可以写文件名,还可以加上正则匹配,还有具体规则, 112 以斜杠“/”开头表示目录; 113 114 以星号“*”通配多个字符; 115 116 以问号“?”通配单个字符 117 118 以方括号“[]”包含单个字符的匹配列表; 119 120 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录; 121 我们的github里面,有自动创建.gitignore的选项,我们在上传代码的时候会自动给我们检测到一些不需要检测变化的文件,其中就有_pycache自动生成的这种文件
我们在开发过程中,就是在默认的master里面建立一个dev分支,然后每个人在dev的基础上建立自己的个人分支,然后开发完之后要合并的时候,就创建一个review分支,由组长进行审阅,最后所有的冲突都解决了,没有问题了就提交到dev分支,要上线了就把dev分支合并到master分支.这就是我们的整个流程
2024-5-29
进阶用法:
试一下git的撤回功能。 先创建两个文件a.py和b.py,提交commit hash000; 把其中一个文件a.py,单独修改,提交commit hash111; 再把这两个文件a.py和b.py的修改,一起提交到一个commit hash222; 再保留b.py的修改同时commit hash222,让a.py回到创建之初的commit hash000. 尝试用git reset commit hash000 -- a.py 预期结果,a.py只保留了commit hash000的修改,与此同时,b.py是commit hash222的版本。
ps:commit hash000就是commitId000
git截取功能
把某个commit提交中的某个文件的修改,复制到当前的分支中:
git checkout commit hash000(commitID000) -- file_path
>>>pwd
>>>/tmp/test/code_dir/b.py
>>>git checkout 230d9872de092sfe498s -- tmp/test/code_dir/b.py
以上三行就是,在同样的路径下,把230d9872de092sfe498s这次commit的tmp/test/code_dir/b.py这个文件的修改,复制到当前的对应路径下的这个文件中,
如果没有同样路径的文件,就会创建一个。这里只是把代码复制过来,并没有commit操作。
使用场景:在大项目中,某一次的commit中,有多个文件,这多个文件中,有部分文件的代码,需要粘贴到另外的分支处理,就这么操作。
如果没有加-- file_path,就是git checkout commit hash000,把这个commit中的所有代码修改,全部复制过来。checkout不会保留冲突,直接复制。
--------------------------------------------------------------------------------------------------------------------------
还有cherry-pick功能,也可以达到截取的效果,只能截取某次commit的所有提交,无法从该次提交中摘取指定文件的代码修改。
git cherry-pick -n commit hash000
-n是不自动commit,只把代码复制过来,如果有冲突,会保留冲突;如果不加-n,直接就把代码粘过来提交,形成了新的commit hash值。
svn
svn也是跟git一样的远程仓库管理系统,不过svn有GUI,分服务端和客户端。这是比较不一样的地方。
可能git也有图形化界面的版本,我本人没有用过,也没有接触过,这里不多赘述。
VisualSVN是客户端,一般安装在远程服务器上面,使用时,需要在安装路径bin目录下,鼠标双击 "VisualSVN Server.msc" 即可启动服务端的操作界面,在Repository目录下面创建仓库即可。
注意这里的服务端程序不是.exe而是msc。因为我第一次用的时候就搞混了,所以这里特意强调一下。
TortoiseSVN是服务端,安装在自己电脑上面。使用时,右键就可以看到选项,点击即可。