一、git简介

  git是一个 分布式版本控制系统 ,学习git之前首先要了解什么是分布式版本控制系统。

 集中式版本控制:版本库集中存放在中央服务器,我们工作的时候先从中央服务器获取最新版本,干完活后把自己的活推送给中央服务器。缺点是必须联网。

  分布式版本控制:不需要中央服务器,每个人的电脑都有一个完整的版本库。虽然不需要中央服务器,但分布式版本控制通常也会有一个(如github),这个服务器的作用仅仅是方便“交换大家的修改”,没有它也无所谓。

二、windows下安装git及简单使用

  在Git官网下载windows版本下的git,按照默认选项按照即可,因为git是分布式版本控制系统,所以每台机器都要自报家门,安装完成进行如下配置:

  1. git config --global user.name "YourName"//设置用户名
  2. git config --global user.email "YourEmail"//设置用户邮箱
    git confit user.name//查看用户名
    git config user.emai//查看用户邮箱

  版本库又叫仓库(repository),可以简单理解成一个目录,这个目录的所有文件都可以被Git管理起来,每个文件的修改、删除,git都能追踪,以便以后可以追踪历史或者在将来的某个时刻可以还原。

  进入创建仓库的目录执行 git init 就可以创建一个版本库,在这个目录下生成一个.git文件夹,用于追踪版本库。

三、本地使用git

  把文件放到版本库只需要两步 add 告诉git把readme.txt添加版本库, commit 把readme.txt提交到仓库:

  1. git diff "readme.txt" //查看工作区和版本库中文件的不同
  2. git add "readme.txt" //把文件修改添加到暂存区
  3. git commit -m "write a readme.txt" //把暂存区的所有内容提交到当前分支
  4. git status //查看文件状态

3.1 版本穿梭

  如果我们想回退到历史版本可以使用 git reset 命令,head指针指向当前的版本,

  1. git reset --hard head //回到版本初始状态,清除暂存区
    git reset --hard head^ //上一版本
  2. git reset --hard head^^ //上上个版本
  3. git reset --hard commit_id //回到指定版本
  4.  
  5. 通过git reset --hard commit_id 回到指定版本后:
    使用git log不能查到未来的版本
    可以通过git reflog查看未来的版本 

3.2 管理修改

  在 git中跟踪并管理的是修改 ,添加/删除一行,新建一个文件都属于修改。git add将修改保存到暂存区,git commit则将暂存区的修改一次性提交到仓库中去

3.2.1 撤销修改

  有时候我们改乱了工作区的某个文件,还没有添加到暂存区时,撤销修改(丢弃工作区的修改)使用命令(checkout本质是用版本库中的文件替换当前工作目录中的文件)

  1. git checkout -- filename
    //把工作区的修改丢弃掉,返回的上一次的add/commit的状态

  有时候我们把错误的修改添加到了暂存区,想要清除暂存区的内容,使用reset命令

  1. git reset --hard head
  2. //清除暂存区和工作区的修改,恢复到commit版本的初始状态

3.2.2 删除文件

  1. git rm filename //删除文件
  2. git commit -m "the file has deleted" //提交文件,新版本中文件被删除了

四、远程仓库

  git是一个分布式的版本控制系统,最早只有一台电脑有一个原始版本库,其他电脑可以克隆这个原始版本库, 每台电脑的版本库都是一样的,并没有主次之分 。

  第一步:创建SSH KEY。查看用户文件夹下有没有.ssh目录,有的话就跳过这一步,没有新建秘钥:

  1. ssh-keygen -t rsa -C "youemail"

不添加密码时一路回车即可,在用户目录下有两个文件:id_rsa(私钥),id_rsa.pub(公钥)

  第二步:登陆gitHub,Setting-->SSH and GPG keys-->添加SSH,Title自定义,Key为id_rsa.pub。如果有多台电脑可以设置多个key,这样就可以在不同的电脑上工作了。

  第三步:gitHub上新建一个远程仓库,并关联,如下

  1. //测试SSH是否可用
  2. $ ssh -T git@gitee.com
  3. //添加远程主机,名字为orgin
  4. git remote add origin git@yourpath.git
  5. //把本地仓库的当前分支内容推送到远程仓库的master
  6. //-u把本地master分支和远程master分支关联
  7. git push -u origin master

当主机地址变化时需要修改主机地址,采用先删除后添加的方法:

前边使用的是先建本地仓库,后与远程仓库关联。我们也可以先在github上建一个仓库,通过git clone remotePath生成本地仓库。

五、分支管理

  分支:如果我们要开发一个新功能,需要两周完成,第一周完成了50%,如果提交的话,由于代码没完成导致别人不能工作,但是不提交又担心丢失。怎么办呢?创建一个自己的分支,在自己的分支上干活不影响别人,等活干完了在提交。(自己的分支和别人的分支,主分支相当于处于平行宇宙,互不干扰)

5.1  分支使用方式

  1. //-----------no.1 创建和切换分支
  2. git branch bname //创建分支
  3. git branch //查看分支
  4. git checkout bname //切换分支
  5.  
  6. //-----------no.2 在分支上工作
  7. //在当前分支上,git add ,git commit.....
  8. //任务完成了..........
  9.  
  10. //-----------no.3 工作完成后合并分支,并删除
  11. git checkout master //回到主分支
  12. git merge bname//fast forward形式合并分支,直接把master指向最新的分支,删除分支后丢失分支的信息
  13. //******出现冲突时,手动修改冲突的文件后重新add,commit
  14. git merge --no-ff "merge with no-ff" bname
  15.   //no-ff形式合并分支,这种形式会创建一个新的commit
  16. git branch -d bname //删除分支
  17.  
  18. //-----------no.4 本地仓库同步到远程仓库
  19. git push origin //同步到远程仓库

5.2  Feature分支

  添加一个新功能时,不希望一些实验性的代码把主分支搞乱了,所以每添加一个新功能都在新的feature分支上开发,完成后合并删除feature分支。

  1. //我们在dev分支上开发,接到通知要求加一个新功能
  2.  
  3. //no 1 新建一个feature-newFunc分支
  4. git check -b feature-newFunc
  5. //add commit...
  6. //newFunc has done
  7.  
  8. //no 2.1 情况1:通知不要新功能了
  9. git checkout dev
  10. git branch -D feature-newFunc//-d不能删除,提示没有合并,会丢失数据
  11.  
  12. //no 2.2 情况2:新功能并入dev
  13. git checkout dev
  14. git merge --no-ff -m "add a newfunc" feature//添加新功能
  15. git branch -d feature //删除新功能分支

5.3  多人协作

   当从远程仓库克隆时,实际是Git自动把本地的master分支和远程的master分支对应起来。远程仓库的名字默认是origin,克隆的仓库默认只有master分支

  1. git remote //查看远程仓库
  2. git remote -v //查看远程仓库的详细信息,可显示地址

4.1 推送分支(push)

  1. //把该分支上的所有提交推送到远程的对应分支
  2. git push origin branch-name
  3.  
  4. //-----不是所有的分支都要推送的
  5. //1.master分支是主分支,必须时刻与远程同步
  6. //2、dev分支是开发分支,所有成员都在上边工作,所以也要同步//3、feature分支是否推送,取决于这个功能是否是合作完成的

4.2 抓取分支(pull 解决协作冲突)

  多人合作时,大家都会往master和dev分支推送自己的修改。当你clone完仓库,建立一个dev分支,对一个文件进行了修改,你想把一个修改同步到远程的dev分支上去,但是有一个小伙伴修改了同一个文件并且已经提交到了远程仓库。这时就会出现冲突,不能完成推送了,怎么解决呢?

  1. git clone git@path //克隆一个仓库,默认只有master分支
  2. git checkout -b dev //新建一个dev分支
  3. git branch --set-upstream-to=origin/dev dev//本地的dev和远程的dev关联
  4. git pull dev//获取远程仓库dev分支
  5. //add commit... 我修改了一个文件
  6. //有一个小伙伴也修改了这个文件并同步到远程仓库了
  7. git push origin dev //推动到远程dev分支,报错,因为有冲突
  8. git pull dev//获取最新的远程分支dev,这时修改的文件会出现冲突
  9.   //手动修改冲突 (不能把别人的改错了!!!)修改完成
  10. git push origin dev//推送成功,现在远程分支的dev和我的dev分支同步了

六、标签和忽略文件

6.1 标签管理

  发布一个版本时通常在版本库中打一个标签(tag),这样就确定了打标签时刻的版本,将来无论什么时候,都能很方便地取出打便签的版本。 tag的本质是一个commit的指针 。

  1. git tag v1. //建一个v1.0的标签指向当前commit
  2. git tag -a v1. -m "测试版本" 1094adb //-a指定标签名,-m指定描述
  3. git tag //查看所有的标签
  4. git show v1. //查看标签v1.0的信息

6.2 忽略文件

忽略特殊文件的原则:

  1、忽略操作系统自动生成的文件,如缩略图

  2、忽略编译生成的中间文件、可执行文件

  3、忽略带有敏感信息的文件

如下是一个.gitignore文件示例,忽略了缩略图、css文件和dist文件夹中的文件,注意:.gitignore文件本身要放在版本库中。

  1. Thumbs.db
  2. *.css
  3. dist //文件夹

如果我们忽略了*.css文件,但是想让一个特殊的a.css被追踪,则可以强制添加到Git

  1. git add -f a.css //-f强制添加

7.踩坑汇总

7.1 clone时密码输错

  问题:Windows平台下,输错密码,没有再次提供输入密码的机会,直接报错 “fatal:Authentication failed for xxx”

  解决方法:控制面板-->凭据管理器  -->Windows凭据  找到输错git的账号,修改即可

参考文章:

[1] https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000

[2]  http://my.oschina.net/gal/blog/141442

版本管理——git的更多相关文章

  1. 分布式版本管理git学习资料整理推荐

    一.什么是git? Git is a free and open source distributed version control system designed to handle everyt ...

  2. 版本管理——Git和SVN的介绍及其优缺点

    版本管理 概念:版本管理是软件配置管理的基础,它管理并保护开发者的软件资源.   好处:可以保留我们的历史版本,在代码开发到一半的时候,不至于无故丢失,还可以查看BUG的来龙去脉.   版本管理种类: ...

  3. 项目版本管理Git使用详细教程

    前言 记得刚开始做项目开发的时候都是一个人完成一个项目,单打独斗的开发,也不知道什么是团队开发,没有这个概念,随着工作后来知道公司里项目都是团队开发,这个时候这么多人怎么开发一个项目呢,难道用u盘拷贝 ...

  4. Android Studio开发第四篇版本管理Git(下)

    前面一片介绍了在as下如何关联远程仓库,这篇就介绍在开发过程中怎么应用. 提交+Push 如果本地开发代码有改动了或者你觉得某功能做完了,你打算把改动代码提交到远程仓库,这个时候很简单, 还是在工具栏 ...

  5. Android Studio开发第三篇版本管理Git

    创建项目在前一篇讲了,这里就讲一下怎么把创建的新项目关联到远程仓库呢. 在as的菜单栏找到VCS/Import into Verson Control/Create Git Repository 弹出 ...

  6. GIT \ SVN 版本管理 git + gitHub

    场景1   想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件"另存为--"一个新的Word文件,再接着改,改到一定程度,再"另存为--"一个新 ...

  7. 本地创建的项目使用版本管理(git)推送至远端。

    1.创建项目 mkdir nidexiangmu cd nidexiangmu touch README.md 2.使用 git 命令管理 git init // 建立本地仓库 git add . / ...

  8. 版本管理git

    Git 是目前世界上最先进的分布式版本控制系统. git的主要操作步骤 git.init  初始化,显示成功后去相应的文件夹中查看是不是多了一个git文(版本库)  命令1.    git confi ...

  9. 版本管理 - Git 使用入门

    Git 是一个分布式的版本管理系统,而 SVN 是一个集中式管理系统. 版本控制 Git与SVN的对比 对比 SVN Git 工作方式 集中式 分布式 文件管理 增量式 系统快照 权限控制 对团队中参 ...

随机推荐

  1. react + dva + ant架构后台管理系统(一)

    一.什么是dva dva是蚂蚁金服推出的一个单页应用框架,对 redux, react-router, redux-saga进行了上层封装,没有引入新的概念,但是极大的程度上提升了开发效率: 二.安装 ...

  2. node的router路由。

    使用router可以实现一个小型的express. router继承了大部分的app = express()的方法. 使用router可以工程化管理项目.router使用以后app只能在最开始去存在. ...

  3. delphi 右键删除dbgrid行

    Delphi DBGrid右键删除行并提交至数据库.在form上添加,控件TPopupMenu,并指定右键名称:删行 2.编写删除语句: If ADOQuery1.State in [dsEdit, ...

  4. 【Spring】—— 自动装配

    一.Spring中装配bean的方式 1.在XML中显式配置 2.在Java中进行显式配置 3.隐士的bean发现机制和自动装配 二.自动装配示例 1.在需要装配到其他bean中的类中加入@Compo ...

  5. 使用pygal_maps_world展示世界地图

    pygal.i18n在2.0版本以后改为pygal_maps_world.i18n获取国家码和国家名对应关系下载安装包:pygal_maps_world-1.0.2.tar.gz解压后命令行安装: p ...

  6. codeforces471B

    MUH and Important Things CodeForces - 471B It's time polar bears Menshykov and Uslada from the zoo o ...

  7. std::binary_serach, std::upper_bound以及std::lower_bound

    c++二分查找的用法 主要是 std::binary_serach,  std::upper_bound以及std::lower_bound 的用法,示例如下: std::vector<int& ...

  8. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  9. 自学Zabbix11.1 Zabbix 配置SNMP监控

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.1 Zabbix 配置SNMP监控 1. 概述 zabbix采集数据方式: ...

  10. 【CF961G】Partitions(第二类斯特林数)

    [CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...