一、git简介

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

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

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

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

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

git config --global user.name "YourName"//设置用户名
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提交到仓库:

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

3.1 版本穿梭

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

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

3.2 管理修改

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

3.2.1 撤销修改

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

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

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

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

3.2.2 删除文件

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

四、远程仓库

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

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

 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上新建一个远程仓库,并关联,如下

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

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

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

五、分支管理

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

5.1  分支使用方式

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

5.2  Feature分支

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

//我们在dev分支上开发,接到通知要求加一个新功能

//no 1 新建一个feature-newFunc分支
git check -b feature-newFunc
//add commit...
//newFunc has done //no 2.1 情况1:通知不要新功能了
git checkout dev
git branch -D feature-newFunc//-d不能删除,提示没有合并,会丢失数据 //no 2.2 情况2:新功能并入dev
git checkout dev
git merge --no-ff -m "add a newfunc" feature//添加新功能
git branch -d feature //删除新功能分支

5.3  多人协作

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

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

4.1 推送分支(push)

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

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

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

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

六、标签和忽略文件

6.1 标签管理

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

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

6.2 忽略文件

忽略特殊文件的原则:

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

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

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

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

Thumbs.db
*.css
dist //文件夹

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

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. PDB自动启动以及Oracle Pfile的参数修改示范

    1. Oracle12c 可以使用PDB的模式进行创建, 但是他一般不会自动启动,所以可以穿件一个触发器进行处理 创建语句 CREATE TRIGGER open_all_pdbs AFTER STA ...

  2. Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法

    USE mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';FLUSH PR ...

  3. liunx速查

    文件和目录 Linux 主要目录速查表 /:根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目 ...

  4. wordpress文章页两侧添加分页导航箭头

    分页导航 如果添加在文章页的两侧,很方便读者翻阅,小编发现好多站长的博客都添加了这一功能,百度了一下,就是JS和css的功能,经过测试成功,分享一下流程. 1.添加Js 在headr.php或者foo ...

  5. Cuba项目配置IDEA,如何dubug

    1.在cuba中编辑端口,如下图: 2.在IDEA中添加一个远程链接,添加为对应的端口号,然后运行debug即可 如果两个端口号不对应,就会报出以下的错误:unable to open debugge ...

  6. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  7. 01 自学Aruba之功率单位和相对单位

    点击返回:自学Aruba之路 01 自学Aruba之功率单位和相对单位 功率单位是用来测量传输振幅和接受振幅的大小,功率单位测量的是绝对功率 相对单位是用来计算增加电缆或天线后的损耗和增益的大小,相对 ...

  8. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  9. LCT模板(指针版)

    本来是想做THUWC2017的泰勒展开xLCT题的-- 然后觉得数组写很麻烦-- 然后就决定挑战指针版-- 然后写得全是BUG-- 与BUG鏖战三千年后,有了这个指针版LCT板子! #include ...

  10. 洛谷 P1627 [CQOI2009]中位数 解题报告

    P1627 [CQOI2009]中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式 ...