链接远程仓库与IDEA使用git
remote: Support for password authentication was removed on August 13, 2021
rebase 解决冲突流程及git项目使用总结
以前在没有使用版本控制的时候,我们通常在我们的项目根目录下这样命名项目:project_v1、project_v1.1、project_v2等,通过这种方式记录我们项目的不同版本的修改,有的时候我们还会在不同版本的文件中写一个说明,记录此版本项目新增、修改,删除等操作。
这样的操作是很繁杂的,有的时候还可能因为一些非人为因素导致文件丢失这样的事故。
有了版本控制系统,我们就不用再手动进行一些繁杂的操作,并且对于文件丢失这种事故我们也不用再担心,可以随便回到历史记录的某个时刻。
版本控制技术对文件进行管理主要有两种模式:
Lock-Modify-Unlock(锁-修改-解锁)。
Copy-Modify-Merge(拷贝-修改-合并)。
(1)Lock-Modify-Unlock(锁-修改-解锁)
在Lock-Modify-Unlock工作模式下,若用户想对某文件进行修改,必须先锁定该文件再进行修改,修改操作完成之后再对其解锁。
优点:
这种文档管理模式能够有效避免多人对某文件同时进行修改而造成的冲突。
缺点:
它减少了用户并发操作。
除此之外,该模式还有一个非常明显的缺点,即如果前面的用户完成修改后,忘了对文件进行解锁操作,则会导致后面想修改此文件的用户将永远处于等待解锁状态。
应用:
采用这种管理模式的版本控制工具主要有Visual Source Safe(VSS)。
(2)Copy-Modify-Merge(拷贝-修改-合并)
Copy-Modify-Merge工作模式下,当某一用户想修改文件时,可以先将服务器文件update到本地端,然后在本地端对副本进行修改,修改操作完成后,再将副本commit到服务器。
如果在此用户commit之前,原文件已经被其他用户修改并提交过,那么服务器上的版本号与本地端上的版本号不同,二者将产生冲突,服务器将中止提交。
此用户只有将服务器上的新版本update到本地端,将其与自己修改的文件进行合并,才能重新commit到服务器。在实际编程中,文件的合并过程一般需要编程人员共同协商决定。
优点:
这种“拷贝-修改-合并”虽然需要花费一定的时间,但却比“锁-修改-解锁”等待的时间短,能够增加操作的并发度,大大提高团队的编程效率。
应用:
大多数版本控制系统采用的是第二种方式,如Concurrent Versions System(CVS)和Subversion(SVN),而这其中SVN是最为流行的版本控制软件,许多开源软件都采用了SVN作为源码版本控制服务器。
在SVN版本控制软件的管理下,不管是在局域网还是在Internet上都可以对文件和目录进行管理,它突破了时间与空间的限制,促进了团队协作开发。
早期出现的版本控制系统有:SVN、CVS等,它们是集中式版本控制系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同合作的开发人员都通过客户端连接到这台服务器,取出最新的文件或者提交更新。
(1)SVN
中文名:SVN
外文名:Subversion
实 质:开放源代码的版本控制系统
SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
(2)CVS
中文名:CVS
外文名:Concurrent Version System
CVS是一个C/S系统,是一个常用的代码版本控制软件,主要在开源软件管理中使用。与它相类似的代码版本控制软件有subversion。
多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。
但是由于之前CVS编码的问题,大多数软件开发公司都使用SVN替代了CVS。
集中式版本控制系统,版本库是集中存放在中央服务器的,工作的时候,用的是自己的电脑,所以,我们首先需要从中央服务器上拉取最新的版本,然后开始工作,等工作完了,再把自己的工作提交到中央服务器。
集中式版本控制系统的一个最大问题就是必须联网才能工作,所以对于网络环境比较差的情况使用集中式版本控制系统是一件比较让人头疼的事情。
分布式版本控制系统没有中央服务器的概念,我们使用相关的客户端提取的不只是最新的文件,而是把代码仓库完整地镜像下来,相当于每个人的电脑都是一个完整的版本库,这样的话,任何一处协同工作的服务器出现故障,都可以用任何一个镜像出来的本地仓库恢复。并且,即便在网络环境比较差的情况下也不用担心,因为版本库就在本地电脑上。
客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds开始着手开发Git是为了作为一种过渡方案来替代BitKeeper。
Git(The stupid content tracker, 傻瓜内容跟踪器)。Linus Torvalds是这样给我们介绍Git的。
Git是一个版本控制系统。版本控制是一种用于记录一个或多个文件内容变化,方便我们查阅特定版本修订情况的系统。
Git产生背景:
同生活中的许多伟大事件一样,Git诞生于一个极富纷争大举创新的年代。
Linux内核开源项目有着为数众多的参与者。
绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。
到2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,于是整个项目组开始启用分布式版本控制系统BitKeeper来管理和维护代码。
到2005年的时候,开发BitKeeper的商业公司同Linux 内核开源社区的合作关系结束,他们收回了免费使用BitKeeper的权力。
这就迫使Linux开源社区(特别是Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。
Git诞生的历史
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
这就是git的诞生史了。
参考GitHub官网
归属公司:微软公司
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名GitHub。
GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。
目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目Spring、MyBatis、React、Vue等。
2018年6月4日,微软宣布,通过75亿美元的股票交易收购代码托管平台GitHub。
2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费使用。
GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。
GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者。GitLab被IBM,Sony,JülichResearchCenter,NASA,Alibaba,Invincea,O’ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX等组织使用。
Git是一种版本控制系统,是一种工具,用于代码的存储和版本控制。
GitHub是一个基于Git实现的在线代码仓库,是目前全球最大的代码托管平台,可以帮助程序员之间互相交流和学习。
GitLab是一个基于Git实现的在线代码仓库软件,你可以用GitLab自己搭建一个类似于GitHub一样的仓库,但是GitLab有完善的管理界面和权限控制,一般用于在企业、学校等内部网络搭建Git私服。
GitHub和GiLlab两个都是基于Web的Git远程仓库,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。从代码的私有性上来看,GitLab是一个更好的选择。但是对于开源项目而言,GitHub依然是代码托管的首选。
git是目前世界上最先进的分布式版本控制系统。
参考git官网
(1)安装路径D:\Program Files\Git
(2)配置环境变量
(3)CMD>git --version查看版本2.24.0
分为用yum安装和下载git源码编译安装两种方式。
#yum list git【版本1.8.3.1-23】
没有yum新版本的源,所以选择yum安装git依赖,源码安装git相结合的方式。
(1)安装依赖
yum install -y curl-devel expat-devel gettext-devel gcc
yum install -y openssl-devel zlib-devel perl-ExtUtils-MakeMaker
(2)下载安装包
git下载地址
最新版本git-2.32.0.tar.gz。
#yum -y install wget
#wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.32.0.tar.gz
(3)解压安装
tar -xzvf git-2.32.0.tar.gz
cd git-2.32.0
make prefix=/usr/local/git all #编译
make prefix=/usr/local/git install #安装
(4)配置环境变量
#vi /etc/profile
export PATH=$PATH:/usr/local/git/bin
#source /etc/profile
这里可能出现一个问题,如果你之前已经安装过git了,版本比较低,这里展示的可能就是你之前的版本,因为系统默认是使用/usr/bin/git下的git。
卸载原来的Git
yum remove git
rm -rf /usr/bin/git
git --version
参考Git 常用命令大全
一、使用git之前,要先报家门,否则代码不能提交到本地仓库。
git config --global user.name #你是谁
git config --global user.email #怎么联系你
二、查看已有的配置信息
git config --list
Git操作其实没有什么可说的,重要的是要记住git指令及其每条指令的含义。
(1)第一次提交
mkdir mytest 新建一个文件夹,即工作目录
cd mytest 切换到工作目录
git init 初始化一个代码仓库【会自动出现一个.git文件夹】
vi index.txt 新建文件输入hello git。
git status 查看一下工作状态
文件index.txt并没有被git跟踪,我们使用git add对文件进行跟踪。
git add index.txt #跟踪单个文件
git add . #将当前目录的所有文件进行跟踪
git rm --cached index.txt # 撤回你放入暂存区的文件
git commit -m "第一次提交" #将该文件提交到代码仓库
-m是注释的意思,引号内写明你对此次提交的注释信息
到这里,我们就完成了一次版本管理。
注意,在git中有一个暂存区的概念,可以先不用知道暂存区是什么,你只需要知道,我们add文件之后,文件是会先放在暂存区,此时文件并没有被提交,所以你可以随时撤回你放入暂存区的文件。当你commit之后,文件才会从暂存区被提交到代码仓库。
(2)对文件进行修改
vi index.txt 输入修改为hello git today
git status 查看一下工作状态
git add index.txt
git commit -m "再次提交"
修改就会被同步到我们的代码仓库中。
(3)删除
cd mytest
vi demo.txt 输入hello demo
git add .
git commit -m "第三次提交"
git rm demo.txt 删除创建的文件
git status
此时git就发现我们删除了文件,注意,现在如果想将工作区与代码仓库进行同步,不需要add了,而是直接输入。
git commit -m "第四次提交"
这样,代码仓库的demo.txt文件也就被删除了。
如果你自己手动删除文件,你是需要进行add操作的,但是如果你使用git rm命令进行文件删除,git会帮助你直接把操作放入暂存区,所以,你可以直接提交你的删除操作。
学习git,必须要了解3个重要区域。
工作区:即开发者的工作目录
暂存区:修改已被记录,但尚未录入版本库的区域
版本库:存储变化日志及版本信息
当在工作区进行开发工作时,git会记录你的改动,此时,你使用git add指令,该工作区的内容会被加入到暂存区,你仍然可以对你提交的文件进行撤回操作,然后你使用git commit指令,暂存区的内容会被提交到版本库。
每个文件/目录发生的版本变化,我们都可以追溯,命令为 git log。
常用格式:
git log 查看项目的日志
git log 查看某文件的日志
git log . 查看本目录的日志
git log --pretty=oneline
可以看到,我们对该项目进行了四次修改,形成了四个版本,现在我们学习一下版本切换。
用版本号来进行版本的切换。版本号很长,但是我们不需要写出全部的版本号,只需要你写的版本号与别的版本不一致就可以。
git reset --hard 4d957
网站已有支付宝在线支付功能,要添加"微信支付",修改了两个文件,wechat.php、pay.php。
刚做到一半,突然有个紧急bug:支付宝支付后不能修改订单状态。
你需要立即马上修改这个bug,需要修改的文件是,ali.php、pay.php。
问题是,pay.php文件,已经被你修改了过,而且尚未完成,直接在此基础上改,肯定有问题。把pay.php倒回去?那之前的工作白费了。
此时你肯定会想:在做"微信支付"时,能否把仓库复制一份,不影响原仓库的内容,修改完毕后,再把副本上的修改合并过去。
这时已经有了分支的思想。
前面见过的master,即是代码的主干分支。
事实上,在实际的开发中,往往不会直接修改和提交到master分支上,而是创建一个dev分支,在dev分支上,修改测试,再把dev分支合并到master上。
如果有了分支,刚才的难题就好解决了。在做"微信支付"时,我们创建一个wechat分支,把wechat分支commit,此时,master分支内容不会改变,因为分支不同。
当遇到紧急bug时,创建一个AliBug分支,修复bug后,把AliBug分支合并到master分支上。
再次从容切换到wechat分支上,接着开发"微信支付"功能,开发完毕后,把wechat分支合并到master分支上。
git branch #查看分支
git branch wechat #创建新分支wechat
git checkout wechat #(检出)切换到分支wechat
vi index.txt #输入wechat todo
git add .
git commit -m "wechat todo"
git checkout master #切换分支master,查看文件没有变化
git branch bugfix #创建分支bugfix
git checkout bugfix #切换分支bugfix
vi newbug.txt 创建新文件
git add .
git commit -m "new file"
git checkout master # 切换分支master,查看文件没有新增
git merge bugfix # 在master分支上操作,将bugfix分支合并到master分支上
这时候,我们又可以切回到wechat分支,进行我们刚才未完成的工作。
当完成后,我们就可以将该条分支也合并到master分支上。
git branch -d wechat 删除分支
注意了,当我们在两个分支上修改了同一个内容时,在master分支上进行合并的时候,就会产生冲突,因为此时git无法确定你需要的是哪个版本的信息。
git checkout bugfix
vi index.txt
git add .
git commit -m "提交1"
git checkout master
git merge bugfix
git checkout wechat
vi index.txt
git add .
git commit -m "提交2"
git checkout master
git merge wechat
自动合并失败;修复冲突,然后提交结果。我们看一下冲突的文件。
来解决一下冲突,如果我们对值都需要的话,就直接把标记删了就行,如果哪个不需要,就把不需要的值删了。
修改完成,重新提交一下就可以了。
git add .
git commit -m "hebing"
git remote -v #查看远程仓库
#添加一个远程库的标记
git remote add origin https://github.com/bingran-maker/ooo.git
git remote remove origin #删除远程库地址的别名
# GitHub有新的验证方式
git remote set-url origin https://[email protected]/bingran-maker/web-example.git
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
omit 删除,忽略
安装好git,不需任何配置,可以直接克隆远程的public仓库。
(1)克隆远程仓库分支(默认克隆的master)
git clone 仓库地址
(2)克隆远程仓库指定分支
git clone 仓库地址 -b 分支名
例如代码仓库地址https://github.com/bingran-maker/web-example.git。
克隆完成后会出现web-example文件夹。
(1)新建一个分支,但不切换
git branch [-f] <branchname>
例如git branch test0728
(2)创建远程分支,origin指代远程地址代号。
git remote add origin https://github.com/bingran-maker/example-web.git
(3)git branch 查看本地所有分支
(4)git branch -a 查看本地和远程所有分支
(5)git branch -r 查看远程所有分支
(6)重命名分支
语法git branch (-m | -M) <oldbranch> <newbranch>
-m --move:移动或重命名
-M --move --force的快捷键
使用-M则表示强制重命名。
例如git branch -m test0728 test0727
例如git branch -M main当前分支重命名为main
如果需要重命名远程分支,推荐的做法是:
首先,删除远程待修改分支。
然后,push本地新分支名到远程。
例如,把远程分支dev重命名为develop,操作如下:
git push --delete origin dev # 删除远程分支
git branch -m dev develop # 重命名本地分支
git push origin develop # 推送本地分支
(7)删除分支
语法git branch (-d | -D) <branchname>:
-d --delete:删除
-D --delete --force的快捷键
例如git branch -d <branchname>删除本地分支,
例如git push --delete origin <branchname>删除远程分支
(1)git checkout develop 切换分支
(2)git checkout -b produce 创建并切换分支
参考git pull与git fetch区别
(1)更新最新版本,自动merge
git pull
(2)更新最新版本,需手动merge
git fetch
参考git merge与git rebase的区别
假如当前处于develop分支,把master合并到develop分支,合并有以下两种操作
(1)合并分支(合并最新的commit后,会形成一个新的提交)
git merge --no-ff master
(2)合并分支(临时取消并保存当前分支的历史提交,把公共分支代码合并后,再把保存的生成新的commit hash)
git rebase master
在dev中操作后,切换回master,合并。
git checkout -b dev创建分支并切换
git branch dev创建分支
git checkout master切换
git merge dev合并
把版本仓库放在互联网上,开发者把自己最新的版本推到线上仓库,同时,把线上仓库的最新代码拉到自己本地,这样,就可以配合工作了。
对这个仓库地址给个标记,也就是给这个仓库起个名字,名字为origin,
这个名字你是可以任意取的。
git remote add origin https://github.com/bingran-maker/ooo.git
git push -u origin master
等价于
git push -u https://github.com/bingran-maker/ooo.git master
(1)pycharm设置git和github
Files->Settings->Versions Control->Git->D:\Program Files\Git\bin\git.exe
Files->Settings->Versions Control->GitHub->[email protected];bing@1992
(2)pycharm中文件颜色区分
新建未add的文件颜色是红色的
add之后是绿色的
做过修改是蓝色的
忽略的文件是灰黄色的
安装好git,不需任何配置,可以直接克隆public仓库。
一、命令行操作
(1)克隆远程仓库分支(默认克隆的master)
git clone 仓库地址
(2)克隆远程仓库指定分支
git clone 仓库地址 -b 分支名
二、相当于pycharm中的VCS->Git->Clone。
也相当于pycharm中的VCS->Get from Version Control
例如代码仓库地址https://github.com/bingran-maker/BankUse.git。
克隆完成后会出现BankUse文件夹。
一、命令行操作
(1)git checkout -b 20210920 创建并切换分支
二、相当于Pycharm中的VCS->Git->Branches->New Branch,勾选Checkout branch。
或者右下角的快捷方式,如图创建新分支所示。
(1)创建新文件use.py
import pandas as pd
print("新分支20210920中第一次提交")
(2)添加和提交相当于pycharm中的
VCS->Git->Add。
VCS->Commit。
(3)如图切换分支20210920和main,可以看到有无use.py文件。
(1)git remote add origin [email protected]:bingran-maker/BankUse.git
git push -u origin 20210920
(2)相当于pycharm中的VCS->Git->Push。
配置远程地址https://github.com/bingran-maker/BankUse.git,。
pycharm中进行本地合并或者远程合并。
(1)切换到本地当前分支master
(2)待合并本地分支20210920
(3)对比查看不同
(4)将本地分支20210920合并到本地分支master。
本地分支master合并完成以后,可以通过推送push更新远程master分支。
(1)修改分支20210920代码use.py
import pandas as pd
print("新分支20210920中第一次提交")
print("修改分支20210920增加一行代码")
文件use.py颜色变为蓝色(做过修改是蓝色的)。
(2)提交修改
VCS->Git->Commit Files。
文件颜色恢复正常
(3)推送到远程分支
VCS->Git->Push。
1、新建工程
2、本地创建git仓库
相当于VCS->Import into Version Control->Create Git Repository
【会弹窗询问是否在指定目录进行git init操作】
添加
提交
(1)pycharm中创建工程BankUse。
创建代码文件main.py
import numpy as np
if __name__ == "__main__":
print("第一行代码")
(2)网址https://github.com/,账号密码登录。
新建一个仓库BanUse。
(3)现在这个仓库是空的,需要对仓库初始化。
首次使用,可以选择上传已有的文件uploading an existing file。
首次使用,可以先在本地命令行创建仓库master分支,然后与远程仓库连接maste分支。
(1)echo "# BankUse" >> README.md
相当于pycharm中创建的main.py文件。
(2)git init
相当于pycharm中提供的VCS->Import Into Version Control->Create Git Repository。
选择工程名文件夹,自动形成本地master分支。
文件main.py颜色变为红色(新建未add的文件颜色是红色的)。
(3)git add README.md
相当于pycharm中提供的VCS->Git->Add。
文件main.py颜色变为绿色(add之后是绿色的)。
(4)git commit -m "first commit"
相当于pycharm中提供的VCS->Git->Commit Files。
选择要提交的文件,输入commit message。
文件main.py颜色变为正常(提交之后颜色恢复正常)。
(5)git branch -M main
修改当前分支名为main。
可以不做修改,保持pycharm中的master分支名,如图一修改分支名所示。
(6)git remote add origin [email protected]:bingran-maker/BankUse.git
git push -u origin main
相当于pycharm中的VCS->Git->Push。
配置远程地址https://github.com/bingran-maker/BankUse.git,如图二定义远程仓库地址所示。
已经配置好了git的用户。
使用git之前,要先报家门,否则代码不能提交。
git config --global user.name #你是谁
git config --global user.email #怎么联系你
(1)IDEA设置git
Files->Settings->Versions Control->Git->D:\Program Files\Git\bin\git.exe
(2)VCS->Get from Version Control
填入仓库的URL
自动拉取代码
(3)打开拉取的目录