文章目录
Git基础
1 基本概念
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。Git 是目前世界上最先进的分布式版本控制系统(没有之一)
GIT 和 SVN 的区别:
⚫ GIT 是分布式的,SVN 不是,这是 GIT 和其它非分布式的版本控制系统,例如 SVN,CVS 等 最核心的区别。
⚫ GIT 把内容按元数据方式存储,而 SVN 是按文件,所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs 等的文件夹里。
⚫ GIT 分支和 SVN 的分支不同:分支在 SVN 中一点不特别,就是版本库中的另外的一个目录。
⚫ GIT 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 GIT 缺少的最大的一个特征。
⚫ GIT 的内容完整性要优于 SVN:GIT 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
1.1 工作流程
⚫ 克隆 Git 资源作为工作目录。
⚫ 在克隆的资源上添加或修改文件。
⚫ 如果其他人修改了,你可以更新资源。
⚫ 在提交前查看修改。
⚫ 提交修改。
⚫ 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
1.2 几个概念
⚫ 工作区:就是你在电脑里能看到的目录。
⚫ 暂存区:英文叫 stage, 或 index。一般存放在 “.git 目录下” 下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
⚫ 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库
本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作区,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。
2 安装配置
http://www.runoob.com/git/git-install-setup.html
作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中。打开终端(Windows 打开安装 git 时安装的 git bash)执行如下命令,配置个人的用户名称和电子邮件地址:
$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com
连接服务器:
以连接码云为例讲解,因为国内基本都连接码云,速度比较快,介于 GitHub 已经被微软搞定,就不说连接 GitHub 了,流程基本一致。
码云官网: https://gitee.com/
自行注册账号。
码云的参考文档:http://git.mydoc.io/
连接码云的官方参考文档:http://git.mydoc.io/?t=180845
3 基本命令
- git init:创建新仓库(有一个隐藏目录.git,不可删除)
- git status:检测状态
- git add filename/* /. :提出更改(添加到暂存区)
- git commit -m “提交说明信息”:提交
- git remote add origin< 远端仓库地址>:
commit 的只是保存在了本地的仓库,为了和别人交换代码,我们需要提交代码到远端仓库(在码云) - git push origin master:推送
如果在执行 git push orgin master 的时候报错
解决步骤:
先执行:git pull origin master --allow-unrelated-histories
再执行:git pull origin master(类似svn的update)
再执行:git push origin master
第一次提交 需要输入码云的账号(用户名)和密码,输错了的话,他会一直记住错的密码,在哪儿修改呢???就要去电脑的控制面板–>用户账户–>管理Windows凭据,进去编辑就OK
- git clone < 远程仓库地址>:克隆
- .gitignore设置忽略文件
强制添加忽略文件:git add -f info.log;git commit -m “强制提交” - git log:查看提交信息(有一个每一id)
- git reset --hard HEAD^/HEAD ^ ^/HEAD~100:版本回滚(3.0回到2.0)
HEAD表示当前版本
git reset --hard 5fsfg:你想回到的那个版本 id的前6,7位,又可回到3.0版本 - git checkout – filename:撤销文件在工作区的全部修改,回到之前的版本(–前后有空格)
上面第一种情况很简单,要是我们已经提交修改到了暂存区,如果只是做上面的操作肯定不能回到之前的状态,那么还需要利用:git reset HEAD < file> 可以把暂存区的修改撤销掉(unstage) ,重新放回工作区。
总结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file.
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD < file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节。 - 删除
一,直接 git rm filename 删除掉然后再提交 (正常删除)
二,直接 git checkout --filename恢复到原来的版本 (失误删除)
4 分支基本操作
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
分支的创建与合并
●查看分支: git branch
●创建分支: git branch < name>
●切换分支: git checkout < name>
●创建+切换分支: git checkout -b < name>
●合并某分支到当前分支: git merge < name>
●删除分支: git branch -d < name>
1 合并冲突解决方案
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log --graph命令可以看到分支合并图。
2 合并分支的模式
Fast-forward:这种模式删除分支后,会丢掉分支信息
加上参数–no-ff:普通模式合并,合并后的历史有分支,能看出来曾经做过合并
3 分支策略
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev 分支是不稳定的,到某个时候,比如1.0 版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
4 bug分支
git add-----git stash(冻结)-------git stash list,git stash pop(解冻 并删除冻结区)
5 feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
如果要丢弃一个没有被合并过的分支,可以通过git branch -D < name>强行删除。
6 分支的推送
●master分支是主分支,因此要时刻与远程同步;
●dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
●bug分支只用于在本地修复bug, 就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
●feature 分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
7 分支的抓取
抓取远程的dev分支:git checkout -b origin/dev
注意:如果此时改动origin/dev分支是提交不了的,因为本地没有dev分支所以我们必须先在本地创建一个dev分支然后git pull拉取,再git push就可以了。
总结:
●查看远程库信息, 使用git remote -v;
●本地新建的分支如果不推送到远程,对其他人就是不可见的;
●从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
●在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
●建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/ branch-name;
●从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
跟idea结合
远端设置