什么是git?
- Git是一款源代码管理工具(版本控制工具)------我们写的代码需要使用git进行管理
- 源代码有必要管理吗? 有,因为人工的去处理不同的版本,做相应备份会很麻烦(一个项目会有很多的修改,就需要有很多的备份,以防领导万一说你之前写的就很好,如果这时候,你把之前的代码删掉了,那就悲剧了); 比如我们在使用qq的时候,有时候出来一个新的版本,你先下载使用了,但是觉得现在的版本还没有之前的版本好用,你就想能不能使用之前的上一个版本。这时候就用到了git管理,通过git,用户可以重新下载之前的版本
- 常用的版本控制工具有 svn,vss,vcs…
git来源
最早是linux之父当年为了维护linux版本— linus之前也是手动维护,之后他自己写了一个版本管理工具(Git)
Git安装
- 判断自己电脑的位数,相应的安装 全部按照默认的选项进行点击下一步(中间就选默认的选项 Use Git from Windows Command Prompt)
- 检测Git是否安装成功?在电脑中任意目录,右键 ,如果看到 Git GUI Here(Git的图形化操作界面,一般不用) 和 Git Bash Here(敲命令的操作界面) 就表示安装成功
使用Git
- 新建项目文件夹 右键打开git 操作窗口
从左往右:用户名,当前命令窗口所对应的路径(~前都表示用户的目录)
初始化git命令
git init
注意这里初始化生成的文件是隐藏的,开启隐藏文件,才可以看到(查看----隐藏的目录)git会把我们的代码都备份到 .git 目录下面去
开始写我们的项目
- 直接就在 .git 文件目录同级目录下新建文件就可以(和之前开发项目的方式一样)
备份我们的项目代码
-
在开发项目中,会有一个公共的文件目录,供我们所有的开发者,将自己的代码进行上传到同一个公共项目文件中。这时候,大家都用的是同一个操作命令就区分不出来,哪个文件代码时哪一个提交上来的了。所以我们要进行一个配置,用来区分自己的代码操作命令标识。也就是在git中设置当前使用的用户是谁
git config --global user.name “自己起的名字”
(config 表示 配置; --开头的表示我们要配置的参数,参数后面就是这个参数的值。global表示全局的意思,设置一次即可) 设置之后敲回车,看到还是当前的目录,表示名字设置成功!
设置我们自己的邮箱 只要是邮箱的格式就可以
git config --global user.email "xiaoming@xxx.com"
当我们每一次通过git把自己的项目代码备份到 .git 目录中去的时候,除了会带上我们的代码之外,还会把我们设置的自己的名字和邮箱等信息也会写入一份,备份(方便日后能看到代码时谁做的 )
把我们的代码存储到.git仓库中去
-
第一步:把readme.md文件放到大门口
git add ./readme.md 敲完回车显示没有任何变化表示添加成功
-
第二步:将文件放到仓库中去(在放之前,要告诉仓库你放的是什么东西,要做什么操作,有什么用)注意不需要指定目录文件,是一次性把所有大门口中的文件都放到仓库中
git commit -m “我们完成了第一个功能!” -m(message 描述)
注意 :如果不小心在第二步的时候没有 加 -m 就会进入编辑器界面。在这里可以写自己的说明内容或者代码。想要退出这个界面,只需要,按下 esc键+ ;+ q 注意是英文的分号
如果退出不成功,我们可以强制退出 esc+:+ q + ! 注意是冒号
整个流程功能
myproject 工作区
大门口 :暂存区
仓库房间:版本库
我们把我们的文件放入.git大门口,又把文件从大门口放入仓库区。这个过程执行了2次。这就相当于我们放入了2个版本的项目了。以后就可以进行回退到之前的任何版本了
查看我们的文件状态-----到底当前放到哪里了?是放在工作区,大门口还是在仓库中
git status
出现 modified: readme.md 只要出现 modified并且是绿色的。表示我们把文件放到了大门口。如果出现nothing to commint,working directory clean表示当前文件已经放到仓库中了,我们的东西都已经被保存了;如果出现·modified: readme.md 颜色是 红色 表示当前我们只是改了代码,并没有执行其他的命令,说明还在项目工作区。
- Git会帮我们比较在工作区中的代码和最终放到仓库中的代码是不是一样的。如果是一样的,表示工作区是干净的
添加文件的简写(可以一次性把多个文件放入仓库的大门口)
git add ./ 表示把当前目录下的所有文件都放到仓库的大门口
一次性直接把文件放到仓库中去,而不用先放大门口,再放仓库房间中(版本库)
git commit --all -m "这是一次性的操作" --all表示把所有修改过的代码一次性放到仓库房间中去 ,同时后面的说明也不能少
git中的忽略文件
.gitignore
创建文件,文件名叫.gitignore在这个文件中可以设置要被忽略的文件或者目录,被忽略的文件最终不悔被提交到我们的仓库房间中去
做法:
- 1.在当前项目目录中新建一个文件,文件名是 .gitignore ;
- 2.在文件中写上要忽略的文件 比如我们想忽略 名字叫 .idea 的文件。可以写 /.idea 这样就表明我们的git会忽略这个文件
- 3.记得也要忽略掉当前的自身文件 /.gitignore
- 4.注意是一行写一个路径的格式,这些路径所对应的的文件都会被忽略掉
-
- 如果想忽略一个目录可以写: /js 就会忽略掉js文件下的所有文件
-
- 如果想忽略js文件夹下的 .json 文件。可以写: /js/*.json * 表示通配符
查看提交的记录
git log
在git 中是根据提交的时间日期在存储的,每次显示的都是最新的版本
查看简洁版数据信息
git log --oneline 查看简洁版的数据,每个版本的数据显示一行
当我们提交的次数有很多的时候,数据就会有很多,如果指向查看提交的简介数据就用上面的方式
图片中表示,我们已经提交过2次的版本了
版本的回退
当我们想查看之前我们放进去的版本时候用这个命令
git reset --hard Head~0 --hard表示让现在工作室的代码呗以前的版本代码个覆盖掉 Head默认永远指向的是最新版本的代码 ~0 表示回退到上一次代码提交的状态 ~1表示往后退2个版本 回退到上上次的版本
Head只会指向自己和Head之前的版本代码,Head后面的并没有消失
通过版本号的唯一标识来进行回退
所谓的版本号,就是我们在使用 git log --oneline 命令显示的文件代码前面的唯一字符串标识,就是当前的唯一版本号。这就避免了,我们在通过索引进行回退的时候。回退到前面很远的版本,索引就很容易出错,从而回退错误的问题。
git reset --hard [版本号] 精确地回退到某次提交时的状态
查看每一次的版本切换目录
git reflog 通过这个方式可以看到以前的所有提交的版本号
master主分支
如果我们这一版本的代码和功能比较多,一次性写不完,但我们还是想先提交一次进行备份。但是又不能提交到住分支中,因为在主分支(master)中,其他人是可以拿到你提交的一半的代码的,而这个代码又功能没实现全。就不合适了,这样会影响别人写代码。所以我们需要一个再创建一条时间线,创建一条平行宇宙,别人不能访问,只能自己访问,但是当自己的全部功能写完之后,需要把两条平行宇宙打破,合并到一起,这样master就拥有了这个功能
创建分支 ,在刚创建时dev分支里的代码和master分支里的东西是一样的
git branch dev 创建了一个dev分支
查看我当前有哪些分支
git branch
切换分支
git checkout dev 切换到dev这个宇宙
完成全部的功能书写之后,再次切换到master分支中,让所有的成员都可以看到
git checkout master
合并分支 把当前分支(输入 git branch 回车显示前面有 * 号的分支就是当前分支,也是窗口后面的括号中的内容)与指定的分支进行合并 然后让2个世界合二为一 把 dev中的分支合并过来
git merge dev
就可以让dev中的合并到master中了
删除分支
git branch -d dev -d表示删除的意思,全部指令表示删除dev
当我们自己创建一个分支后,忘记已经创建了一个分支,然后又在住分支 master上又创建了一个,这时,如果想把分支合并到主分支上,会显示合并冲突。(dev分支中有某个功能代码,master中也有,git就不知道要保存哪一个了)如果有冲突了,必须手动的进行删除那个不重要的代码,才会真正保存成功。记得手动处理之后,再次提交一次
注意 .git文件已经把我们的项目文件转换成了二进制文件,再次进入是看不到我们所写的项目文件的
GitHub
- 不是git,只是一个网站。这个网站中提供了共用服务器的功能,这个网站提供了允许别人通过git上传代码的功能
如何将自己写的代码提交到GitHub上(充当了git服务器的工作)
-
1.在GitHub上新建仓库 create a repository
-
2.选择HTTPS,这里会产生一个链接,这个链接一定要保存下来,将来我们将自己本地的代码上传到GitHub上的一个链接地址。
-
3.在本地的git窗口中输入命令.在GitHub上也是有一个仓库,也有一个这个地址.将这个.git上传到GitHub上的master分支上
git push https://github.com/CirclePoint666/test.git master
-
注意如果是第一次上传是需要用户名和密码的(就是你想要上传到的项目中去,项目的建立者的GitHub的账户名和密码),之后再次上传就不需要输入账户名和密码了
-
刚刚复制的网址,刷新之后,就可以看到我们上传的文件了
-
如果想拿到别人的代码,点击 clone or download 选择 压缩包文件就可以下载了。( git push https://github.com/CirclePoint666/test.git)也可以在自己的本地通过命令行的方式从GitHub上下载。这个首先需要复制一下,别人的额链接,然后输入命令行:注意需要在本地初始化一个仓库
git pull https://github.com/CirclePoint666/test.git master
- 回车就会发现,当前的目录下多了文件。就是你想要下载的文件
- 通过 git log --oneline 就可以拿到每次提交的结果了。到此为止,就拥有了每个人每次提交的版本
git clone
会得到远程仓库相同的数据,如果多次执行会覆盖掉本地内容。这个方式不会在本地把下载好的文件放到文件夹中。git push 不会覆盖,而是会合并处理,一般在开发中多使用这个方式
git clone [地址]
day02
上一节我们知道了如何上传自己的项目到GitHub中去,通过链接 push 上去。但是这样有一个弊端就是,上传的人需要知道 GitHub中当前项目的建立者的账户名和密码。显然这样是不安全的,不能自己建立一个项目,别人想往你的项目中上传文件的时候,都需要知道你的账号的密码。所以我们可以还是用另外一种方式。
在GitHub上我们复制链接的地方,右上角有一个 use SSH 和 use HTTPS(就是之前我们复制的链接的方式) 。这是两种不同的上传方式
SSH方式上传代码
- 不需要验证用户名和密码,就可以验证上传者的身份
公钥 私钥
-
通过Git命令可以生成公钥 私钥(就是一串随机的字符串,两者之间是有关联的。私钥我们自己留着,公钥给GitHub网站。在上传的时候,两者会进行对比,两者匹配,身份就验证成功)
-
1.生成公钥和私钥
ssh-keygen -t rsa -C "xiaoming@sina.com"
-
2.指定生成存储的位置 默认存储在C盘下。回车会提示,已经有了公钥和私钥。选择 y 覆盖(如果是第一次输入不会有这个提示)
-
3.生成之后在自己电脑的用户名下就生成了一个 .ssh的文件夹( pub 文件就是公钥,id_rsa就是私钥)
- 打开公钥(不要做任何操作,复制好),到GitHub上,打开sitting设置,选择 SSH and GPG keys,添加公钥(new SSH key),把复制的公钥放到 key 中,起一个自己公钥的名字,点击 ADD按钮。然后再次输入自己的GitHub账号的密码
模拟两个用户进行同时开发
- 使用下载的 git Bash 窗口可以输入Git命令进行下载。使用window自带的cmd也可以下载
冲突
小明和小红同时进行开发,小明提交到服务器中的代码,小红需要使用,从服务器中下载下来,但是当小明再次修改的时候,小红必须再次重复之前的操作再进行一次 push 把小明提交的新数据拿下来。在这个过程中,如果小红对从服务器中拿过来的小明的代码做了修改的话,再次从服务器中拿小明的数据时,就会提示,发生冲突(git不知道要这2个版本的数据到底要哪个。)这时候,就需要我们手动的把我们不需要的数据删掉,只要需要的数据
先push还是先pull?
当2个人一开始拿到的是同一个版本的文件,两个人都对此作了修改。都想要把自己修改后的文件和对方修改后的文件,这时候就出现了,是先把自己的文件push到服务器上还是先把对方上传到服务器中的文件 pull 下来呢?
答案是:一定要先pull ,再push,如果先pull的话,如果服务器中的版本和自己本地的版本不一致的话,我们可以在本地进行解决,解决之后,再把解决完冲突的文件push到服务器
出现这种情况,写完之后,按下 esc +:+wq(wq表示保存并退出) 退出之后服务器会给我们自动生成一个合并之后的版本
push 和 pull的简写
每次我们在push和pull的时候,都要加上自己带的GitHub中的地址,这样会很麻烦。为了解决这个问题,我们可以用一个变量来代替这个地址
git remote add origin [git@....ssh地址] //remove 是远程的意思,add添加 一个变量,变量名是 origin 后面是地址
声明完变量之后,就可以使用变量名来上传或者下载(pull push)操作了
git push origin master git pull origin master
- 每次在往服务器中提交的时候,一定记得先把数据提交到本地的git中,再 push上GitHub服务器中的
本地和GitHub服务器中的分支建立连接
git push origin -u master //表明我们 让本地的master分支和GitHub中的master分支建立了关联,下一次我们就不需要在写 master分支了。自动的就提交到GitHub中的master分支上
建立了分支关联后,只需要
git push 就提交到GitHub服务器中了
查看本地仓库与远程仓库的关联详情
git remote -v
解除远程仓库
删除与远程仓库的关联就比较简单了,直接输入以下命令:
git remote rm github
The authenticity of host ‘github.com (13.229.188.59)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
错误
To github.com:CirclePoint666/test.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ‘git@github.com:CirclePoint666/test.git’
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push --help’ for details
出现错误的主要原因是github中的README.md文件不在本地代码目录中
解决方案:
可以通过如下命令进行代码合并【注:pull=fetch+merge]
git pull --rebase origin master
执行上面代码后可以看到本地代码库中多了README.md文件
- 此时再执行语句
git push -u origin master
即可完成代码上传到github