文章目录
Git与svn对比
SVN是集中式版本控制系统,
版本库是集中放在中央服务器,干活的时候首先要从中央服务器得到最新的版本,然后干活,干完后,把自己做完的活推送到中央服务器。
集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。
集中式版本控制工具缺点很明显:
服务器单点故障
容错性差
Git是分布式版本控制系统,
没有中央服务器,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。只需把各自的修改推送给对方,就可以互相看到对方的修改了。
一般工作流程如下:
1.从远程仓库中克隆 Git 资源作为本地仓库。
2.从本地仓库中checkout代码然后进行代码修改
3.在提交前先将代码提交到暂存区。
4.提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
5.在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。
git使用
安装直接下一步即可
最好默认路径
查看版本,支持linux命令,模拟出来的
git自带的图像化界面并不好用,因此安装其他的
配置邮箱,作用不大,只是用来标明这是某个人提交的,其相关信息,以便联系
小乌龟可以安装中文包,下载相应的汉化包安装后
右键点击设置,选择语言即可
创建本地仓库
使用git自带的gui创建,会有.git文件生成,代表创建完毕
或者命令行创建
也可以使用小乌龟
不要选择这个,这个给服务器用的
安装小乌龟后应该重启电脑,以便一些资源加载,比如添加文件时应该有绿色的图标,不重启看不出来
添加文件
文件仅仅是放到了暂存区,并没有真正提交。
为正式提交提供了一个缓冲
这是git里的一个概念
cc是工作区,.git才是版本库,类比
版本库里最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
add添加到暂存区,commit才真正提交到本地仓库
工作区与暂存区
提交文件
只要创建了本地仓库,master分支就必定存在了
对于提交文件,必须要写更新信息,否则无法提交
这是一个好习惯,对于修改了什么bug,方便后续维护
此时会在文件上看到一个勾
查看本地仓库文件信息
如果后续修改了文档,文档颜色变化
接下来需要放到暂存区,然后提交,然而小乌龟已经将步骤简化了,直接提交就行
查看历史版本
可以看到每次提交的更改注释
以及比较版本的不同信息,按住ctrl可以多个选择
删除文件
选择文件,删除,但是如果误删了,可以还原
删除可以直接按键删除,也可以选择命令
仅仅删除了本地文件,版本库中仍然有此文件,因此可以还原
会显示出当前文档不存在的文件
如果真的想删除这个文件
就点击提交,会提示某个文件缺失,不用管,写入备注,提交,文件就真的被删除了
版本库中也无法找到了
删除目录
但是如果想删除版本库中的文件,但本地不想删除呢?
比如运行代码生成的class文件,本地还有需要,但是没必要上传
如图,本地文件会显示打叉,此时仍然提交文件会显示被选择的文件在版本库中缺失了
提交完成更改,此时媒体浏览器也找不到版本库中的已经删除的文件了,但是本地的文件还在
如果想要忽略的是一个目录呢?
忽略所选目录下所有文件,并生成配置文件
可以看到有减号
查看新生成的配置文件
当然这个忽略文件也应该添加到版本库中
配置文件语法规范
没什么用,软件会自动生成,了解即可
空行或是以 # 开头的行即注释行将被忽略。
可以在前面添加正斜杠 / 来避免递归,下面的例子中可以很明白的看出来与下一条的区别。
可以在后面添加正斜杠 / 来忽略文件夹,例如 build/ 即忽略build文件夹。
可以使用 ! 来否定忽略,即比如在前面用了 *.apk ,然后使用 !a.apk ,则这个a.apk不会被忽略。
* 用来匹配零个或多个字符,如 *.[oa] 忽略所有以".o"或".a"结尾, *~ 忽略所有以 ~ 结尾的文件(这种文件通常被许多编辑器标记为临时文件); [] 用来匹配括号内的任一字符,如 [abc] ,也可以在括号内加连接符,如 [0-9] 匹配0至9的数; ? 用来匹配单个字符。
看了这么多,还是应该来个栗子:
# 忽略 .a 文件
*.a
# 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件
!lib.a
# 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO
/TODO
# 忽略 build/ 文件夹下的所有文件
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/**/*.pdf
创建远程仓库并推送
不要选择readme文件,否则后面更新会麻烦
国内有码云也可以使用,中文更加亲切,但是知名度不如,使用广度不如
创建仓库后有两个地址可供选择
向github提交代码有两种方式,https url,ssh url
后者不需要频繁的账户密码验证,更加方便,一次配置永久使用,前提是保存好本地私钥,但是前者有记忆密码功能,所以后者仅仅胜在加密程度高
SSH 为 Secure Shell(安全外壳协议)的缩写,ssh是目前可靠,加密好的协议,
1,创建公钥私钥,公钥放到ssh服务器
2,客户端向服务器发送公钥请求连接,服务器接到公钥和存储的公钥对比,一致则使用公钥加密,将质询(challenge)发给客户端
3,客户端接到质询(challenge),使用私钥解密,将最初的信息发给服务器,成功则认证完成
ssh推送信息
创建公私秘钥
配置用户名与email
git config --global user.name "git用户名"
git config --global user.email "email地址"
生成秘钥
ssh-keygen -t rsa -C "email地址"
会提示ssh key将要保存的地点与密码,自己设置
注意文件路径问题
- 问题?ssh key存储在本地的哪里?
在生成秘钥的时候建议跳转到 用户名./ssh目录,id_ras文件就会自动生成在下面
即cd ~/.ssh
如果是c盘idea文件夹下就应该写成/c/idea 而不是c:/idea ,路径特殊,看范例,我默认地址
ssh-keygen -t rsa
cd进入目录,ls查看当前目录下文件以及文件夹,ll显示更详细
查看公钥
cat id_rsa.pub
将公钥设置到github
得到秘钥后复制进入github-》setting
new ssh key,然后将公钥复制到其中,随便起一个名字
将工程放入文件夹下
怎莫看设置成功了?
如下图第一行命令,成功后会提示Hi
- 怎么使用git的ssh下载文件?
在github的下载栏中找到ssh地址,使用git clone XX即可,如下图
因为我下载的时候ctrl c中断了,所以并未下载,仅仅作为演示 - 如果使用git的ssh下载文件,文件又会下载到哪里?
如果是已经下载好的,使用ls查看下载的目录
然后cd /跳转一下
然后pwd打印出完整路径即可
使用图形界面推送
同步
先设置需要将工程推送到github哪个仓库
先设置git的ssh.exe位置
设置本地秘钥路径,以及推送路径,保存
推送工程
或者使用命令行,不推荐,不直观
git init 初始化
git add README.md 添加文件
git commit -m "first commit" 提交更新信息,本地仓库建立
git remote add origin url 建立连接
git push -u origin main 推送本地仓库信息
如果本地仓库已经存在,直接执行
git remote add origin url 建立连接
git push -u origin main 推送本地仓库信息
-已经使用https提交的项目如何改为ssh提交?
跳转到使用的项目下
例如: cd /c/Users/Adminstrator/IdeaProjects/total_case`
查看提交方式
git remote -v
将https提交方式重新设置为ssh提交方式,ssh路径可以由你的项目再github上获得,比如
git remote set-url origin git@github.com:Jonekaka/for_web.git
或者直接修改项目目录下 .git文件夹下的config文件,将地址修改一下
可以看到https提交方式
修改后重新看配置文件
可以看到地址已经修改了
项目路径.git文件下的config文件内容
http推送信息
需要用用户名密码验证身份,不需要秘钥,设置简单
推送时会提示输入密码
如果起名字不是origin会提示,不用管
依次输入用户名密码即可
从远程仓库克隆
命令行方式
得到远程仓库地址,克隆
克隆后各个版本历史可见,就是复制一份
图形界面方式
将工程clone到何处去
推送修改的文件和解决冲突
不能每次都下载完整工程,只需要提交修改的文件即可
A右键选择文件同步
会提示已经修改的文件,选择推送方式推送即可
B人员想要拉取更新,只需右键同步,选择拉取即可,会将变化的文件拉取下来
同时可以根据日志看到修改的内容注释,修改的文件
冲突问题
A从工程下载了a文件,B从工程也下载了a文件
A对a修改了,提交
B在A之后对a修改了,此时a已经不是最新的了,再提交报错,会提示不是最新的a文件,无法提交,需要重新拉取a文件,修改提交
重新拉取最新的a文件
此时也提示错误,因为远程仓库和本地仓库的信息不统一,都更改了a文件,不用管
此时重新打开a文件,会合并冲突的信息,将服务端的信息罗列到下方,上方为自己修改的信息
上面《自己的信息
会把不同的地方合并到一起
冲突只能手动合并
此时删除git额外添加的信息,按需修改,解决冲突即可
接下来提交到本地仓库,再提交到远程仓库即可
创建git私有仓库
有些项目内部自己玩就行,不开源
在linux上安装git服务器,
拿到的不是安装包,而是源代码,gz是c语言开发 ,因此编译之前应该配置好c的开发环境
1、安装git服务环境准备
yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc
2.安装包,下载git-2.5.0.tar.gz
对于虚拟机中的linux使用crt连接,可以便捷的使用sftp,将安装包拖动过去即可
或者使用命令
put url路径
3.查看文件
可见root目录下已经有此文件
4.解压文件
5.配置,安装文件
autoconf
./configure
完成后生成makefile文件,c语言编译需要这个文件
make编译
make install安装
cd git-2.5.0
autoconf
./configure
make
make install
检查安装是否成功
设置用户
似乎是以用户为分级权限的系统
adduser -r -c ‘git version control’ -d /home/git -m git
此命令执行后会创建/home/git目录作为git用户的主目录。
设置密码
passwd git
此时在home目录下可见git文件夹
此时切换到git用户下
查看当前用户
查看当前路径
创建服务器的本地仓库
在linux上创建等效于win服务器的本地仓库
命令为:
不带本地仓库目录
从私有仓库上传下载工程
查看当前工程目录
右键设置git客户端,url
设置路径,推送
输入远程仓库用户密码,保存用户密码,接受
下载工程
分支管理
svn里的分支方便不如git
当本地仓库建立,便有了一个master主分支
HEAD指针指向master,master指向提交,所以,HEAD指向的就是当前分支。
master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
随着你不断提交,master分支的线也越来越长。
当创建了一个新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:总之就是加一个dev指针,改改HEAD的指向,就代表分支已经建立了
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
这意味着之前的master可用,dev也可用,分出了另外一个版本,并行存在并不干扰,可以根据需要对不同的分支进行升级
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?
直接把master指向dev的当前提交,就完成了合并:所以Git合并分支很快!就改改指针
将分支合并,并且也可以根据之前的版本开发,分支之间并不会相互干扰
合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支,回到了最初的状态。也可以不删
查看当前分支
可以看到当前仅仅有一个master分支
并且为这个分支建立了三个连接
创建分支以及重新指向
创建分支
此时提交的对象就已经改变了,前面是创建并切换的意思
此时选择切换,检出就会发现分支有两个
当然也可以选择创建分支
但是不会立即切换,还需要手动选择
浏览分支
查看分析图
dev1,master分支管理案例
平行分支
切换到master
添加一个test文件,添加到本地仓库
提交到本地仓库
修改master的hello3文件,提交到master
此时这些操作仅仅在master中修改,修改了两次
此时dev仍然指向之前的版本,而master已经迭代了两次
切换到dev1,查看内容
此时文档目录中没有test文件,以及对hell03的更改
切换回master一切又回来了。
因此他们的操作是平行的。
合并分支
最终要保留谁,就选择当前是谁
将dev1合并到master
先切换到master
开始合并
谁从哪里合并
如果对同一个文件进行了不同修改,就会产生冲突,如图上面一样,需要手动解决,提交,解决冲突
解决冲突文件
此时流程图走到了这里
可以提交了
此时用切换与检出管理分支
对于不需要的删除即可
idea中使用git
配置git.exe路径
进入同一目录下的github,选择密码输入格式,输入账户名密码,或者tocken都可以,如果选择tocken点击一下生成,一看就懂,不想说
如果发现登陆不了账户,提示找不到www.jetbrains.com的服务器IP地址,应该是修改了host文件,或者网络不佳,我相信大部分是前者,你懂得,host中删掉就好了,如果提示没有权限就把host文件复制到桌面上修改,修改好后再替换原来的文件
host文件地址:C:\Windows\System32\drivers\etc
#是注释
127.0.0.1 localhost
然后test,有时会无法ping通,我也是时灵时不灵,网络问题吧
看到下面的git的ssh?就是上面的,终于不用每次上传下载都写账户密码了,但是注意,新的项目注意使用新的git地址,好像也不太方便,还是取消勾选吧,idea有记录账户密码的功能
如果你选择的账户密码,点击下面的测试,会提示
如果确认账户密码没有错可以不用管,仍然可以提交项目
或者选择tocken方式
进入github,选择设置,最后一行开发者设置,选择生成tockent
输入 Token 名称 , 有效时间 , 权限范围 , 然后点击页面底部的 Generate token 按钮 ;
生成tocken后复制即可
创建版本库
选择需要创建仓库的工程。注意a/b格式,如果想要包含b需要选择a,
因为他会在选择的目录下创建.git文件,选择上级目录最好
选择后工程会提示添加到git
选择项目,然后里面所有的文件都会变成红色,表明选择了,将本地项目添加到本地仓库
右键项目,将文件放到暂存区,此时还未上传到github,文件变成绿色
提交项目变成白色,会提示为项目创建仓库,添加描述,然后就可以在github中找到了,为本地仓库提交数据
还没有结束,然后最后一步上传到github
去仓库里看看吧
- 项目有更新?
文件分分钟变成了绿色提示你还没有上传,如上步骤只会更新新的文件。
为什么是绿色?仓库已经建好了,已经默认放到暂存区了
或者这样提交也可以
出现管理图标
如今这些文件还在暂存区,需要提交到本地仓库
选择需要提交的文件,信息,out文件会自动忽略
后续可以更新并提交
可以查看更改历史
当然也可以选择,比较修改的差异
将工程推送到github
从远程仓库clone
在idea中使用分支
当前就一个master分支
当然可以新建一个分支
如何查看当前在那个分支呢?
谁有标签就是谁,当期那是dev
点击checkout进行切换分支
分支并行开发,不受影响的,就像上面一样
删除仓库
点击之后拖到最后,输入项目路径名确认
将多个项目放到一个仓库里
我不建议这么做,因为当你要git你的项目的时候,你所有的项目都会下载下来,你会哭的
有时候不想一个仓库放一个项目,就可以尝试将多个项目放到一个仓库里便于管理
首先先在git中创建一个仓库,如果不想创建使用以前的仓库也行,需要的就是一个仓库的地址
然后在本地创建一个文件夹,把需要上传的项目放进去,然后
比如
然后写入如下命令:
①$ git init
②$ git add . 描述:用来上传文件夹里所有的项目,注意点.,不想全部就写具体名字,
(—解释—:)【可以在这里使用命令,git status,查看添加的文件,显示白色,提交后会显示绿色】
③$ git commit -m “你给写个项目描述?”
(—解释—:)【注意这里,如果提示
那就标明提交的是空目录,git是不能提交空目录的,因此检查目录
最主流的做法是,在空目录下创建 .gitkeep 或者 .keep 空文件,或者 .gitignore 文件,这只是一个约定俗成的空目录识别文件名,其实除了占位识别空目录,其他并没什么卵用。就是写了也没用,乖乖回去填充文件
我们再在空目录中创建一个空文件:
touch .gitkeep然后再用 git status 查看状态:现在可以感应到 src 目录了。另外需要注意,在项目的 .gitignore 中不要忽略此文件
git错误 error: failed to push some refs to
问题原因:远程库与本地库不一致造成的,在hint中也有提示把远程库同步到本地库就可以了。
解决办法:使用命令行:
git pull --rebase origin master
该命令的意思是把远程库中的更新合并到(pull=fetch+merge)本地库中,–-rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中。执行pull执行成功后,可以成功执行git push origin master操作。
执行 git pull -–rebase origin master 操作,意为先取消commit记录,并且把它们临时保存为补丁(patch)(这些补丁放到”.git/rebase”目录中),之后同步远程库到本地,最后合并补丁到本地库之中。
】
④$ git remote add origin 仓库地址
这里如果提示remote origin already exists.(报错远程起源已经存在。)
那么删掉重新添加就行了,删除的方法是git remote rm origin
⑤$ git push -u origin master
刷新仓库就能看到添加成功了
如果还要添加其他项目?
方进入然后上传如上。
github怎么删除仓库中的某个文件
github网页只能删库跑路,具体删除文件还是需要git,为什么要删除某个文件?因为上传的时候可能会提供一些不必要的文件,
首先git要在git提交的文件夹下打开,否则会提示
识别不到git仓库
需要注意的是这里命令删除的是github仓库里的文件,本地的不受影响,那些不想上传但是上传的文件可以安静的呆在本地看你删掉它在github在云端的备份
连接到库
我觉得看命令能明白的就需要多说了,接下来是
dir 查看有哪些文件夹
git rm -r --cached xxx 删除xxx文件夹(这里的文件夹名有空格命令行需要用"\ "来拼接)
git commit -m ‘删除了xxx文件夹’ 提交,添加操作说明
最后提交操作
git push -u origin master