一、git介绍

  git是由 Linus 开发的一种“分布式版本控制”软件,而在此之前,版本控制基本上都是“集中式版本控制”,如:CVS,SVN 等。两者的区别:
  1. "集中式版本控制系统"中,版本库是集中存放在中央服务器中的,开发人员在干活的时候,要先去访问中央服务器调取项目代码,然后才能修改,最后再提交到中央服务器中,供别人拉取使用。因此它有一个很大的缺点,那就是必须链接到中央服务器才能够正常工作。


  

2. 相比较“集中式版本控制”,“分布式版本控制” 并没有真正意义上的中央服务器,而是开发者的每台电脑都可以作为一个中央节点来使用,因此工作时就无需链接主机,更不需要在只有有网络的环境下才能工作,而且分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。如果集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。


  

“分布式版本控制”也有中央节点的概念,这是因为在实际使用“分布式版本控制系统”的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

二、git的基本结构

git整体框架由两部分组成:工作区和版本库。工作区是指本地的工作目录;版本库是指通过git init命令创建的git仓库。  
     版本库”用于监控文件的更改状态。它又有两个主要的部分构成,它们分别是:“暂存区”与“分支”,“暂存区”中保存的就是本地进行修改后等待提交的文件,而分支则是用于记录已经提交但是等待推送的文件。git默认的分支只有一个,那就是master分支,但是git也支持多个分支,并且分支之间可以切换,可以合并。而 HEAD 便是分支的索引标识,类似于一个指针,用于确定当前活动的分支。

三、git发布版本的基本流程:  

总的来说在git中发布一个版本,必须要经过以下几个步骤:

    1. 在工作区中新建,编辑,保存文件。
    2. 将编辑好的文件,添加至暂存区缓存
    3. 确认无误后,将暂存区中的文件提交到分支中,等待推送。
    4. 发布版本后,将本地仓库的文件推送至远程,以供别人拉取使用。

而在没有推送之前,这个文件的修改在“工作区”与“版本库”之间是可以相互重置撤销的。

四、git的常用命令

1.设置用户名和邮箱
   Git通过检测用户名和邮箱来跟踪进行commit的用户
     git config --global user.name "Firstname Lastname"
     git config --global user.email "your_email@youremail.com"
2.创建版本库。选择一个目录dirname执行如下命令:
     git init dirname
     执行此命令会生成.git的隐藏目录,这个目录是Git用来跟踪管理版本库的,不能修改删除,否则破坏版本库。注意git仓库只能跟踪文本文件的操作,
而图片、视频、word文档这些二进制文件虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能跟踪文件大小的变化。
为了更好的使用版本控制系统,就要以纯文本方式编写文件,并且强烈推荐文件的编码为UTF-8
3.添加文件,即指将文件添加至版本库的暂存区(stage),而暂存区中存放的内容,便是等待提交到版本库的内容。命令如下:
     git add filename ------添加单个文件,要加文件后缀
     git add . ------在版本库的根目录下,添加所有的文件
4.提交文件
  如果暂存区中的文件确认无误的话,便可使用以下命令将内容提交至分支中:
     git commit filename -m '提交的注释内容,便于查看更改,这个必须填写' ------提交单个文件
     git commit -m '提交的注释内容,便于查看更改,这个必须填写' ------提交所有文件
  此外,也可以合并git add和git commit操作,结合在一起使用:
    git commit -a -m 'add & commit'
5.查看状态
    git status
   如果想看简明扼要一点的状态信息,可以加一个 -s 参数
    git status命令可以列出当前目录所有还没有被git管理的文件或者是被git管理且被修改但还未提交(commit)的文件。
6.查看提交日志
   在提交了若干版本之后,想回顾下提交历史,可以使用如下命令查看:
    git log
   git log命令提供了很多可供自定义提交日志输出的格式参数:
    git log --pretty=oneline ------每个提交记录显示成一行
    git log --pretty=oneline --stat ------显示提交文件的更改信息
    git log --pretty=oneline -p -2 ------显示提交文件的更改信息与更改内容,其中-2可以指定只显示前两条的提交信息
7.查看更改对比
  (1)查看文件在工作区与暂存区的更改对比:
   git diff filename ------切换到根目录下
  (2)查看文件在暂存区与分支中的更改对比,可以通过附加--cached 实现
   git diff --cached
  (3)查看文件在工作区与分支中的更改对比,可以通过附加HEAD参数实现
   git diff HEAD
8.版本回滚
  通过git reset命令可以重置分支中最新的提交:
  首先,我们先通过 git log --pertty=oneline 来查看提交的历史记录。
   git log --pretty=oneline
       b602d2600c2a4f84d427ff2a414a90384e77dfed commit1
       d27ea06b28a91095921ac55b2fb3c1f078e10a9b commit2
       0c2dc5716fc3b1ba0b8690a91e5dcad5d2b1dd24 commit3
  其中像 b602d2600c2a4f84d427ff2a414a90384e77dfed 的这样一串字母与数字的混合,就是该提交的索引,一般我们取前6位 b602d2,
拿到该提交索引,便可以告诉git重置到那个提交版本。
   git reset --hard d27ea0
       HEAD is now at d27ea0 commit2
 此时我们便将分支中保存的最新提交commit1重置为了commit2了。此时如果再使用git log去查看提交历史记录,便会惊讶的发现,commit1版本已经看不到了,但是如果你现在又要重新返回到commit1版怎么办呢?不要担心,虽然git log无法查看之前的版本,但是通过git reflog命令还是可以看到的提交的命令记录。
   git reflog
       b602d26 HEAD@{26}: commit: commit1
       d27ea06 HEAD@{27}: commit: commit2
       0c2dc57 HEAD@{28}: commit: commit3
  在常规的使用时,git的版本重置还有一种简写方式。
   git reset --hard HEAD ^ //返回到当前版本下一个版本
9.撤销操作(git checkout的另一种用法,他还有一种用法是切换分支或创建分支并切换)
  这里说的撤销操作,是指将暂存区的内容或者是提交后的内容撤销到工作区的操作。
   git checkout --filename ------将暂存区的内容撤销到工作区,即用暂存区的内容覆盖工作区的内容
   git checkout HEAD --filename ------将提交到分支的内容撤销到工作区,即用提交后的内容覆盖工作区的内容
10.删除操作
  可以选择是否将工作区与暂存区的文件同时删除,还是保留工作区只删除暂存区。
  git rm filename ------同时删除工作区与暂存区的内容
  git rm --cached filename ------删除暂存区内容,但保留工作区内容

五、git的远程仓库

所谓的远程仓库,就是git的中央节点,即远程服务器上的git版本库,与本地的git版本库并没有什么区别,纯粹是为了7x24小时开机并交换大家的代码修改。git的远程仓库或者是中央节点,既可以是自己搭建的一个内部git服务器,也可以使用目前网上流行的github远程项目托管平台。
     1.克隆远程仓库
     既可以将远程版本库直接克隆到本地;也可以先创建本地的git版本库,然后关联远程的git版本库。直接克隆的方式是最简单的,但是远程的git仓库必须已经创建好。
         git clone 远程版本库地址 克隆后的git版本名(可选,没指定名字的话默认远程库的名字) ------直接克隆
         git remote add origin 远程版本库地址 ------先创建本地版本库,然后关联远程版本库
     但如果关联的远程版本库有误的话,就需要先删除remote的origin,再重新设定remote的origin
         git rm remote origin ------删除remote的origin
         git remote add origin 远程版本库地址 ------重新设定remote的origin

git重新定位服务器地址重新设置origin对应的url,先用get-url查看origin目前的地址,命令如下:

git remote get-url origin

然后用set-url重新设置url即可,具体命令如下:

git remote get-url origingit remote set-url origin git@192.168.1.101:MyProject/MyGame.git

2.推送与拉取
         git push -u origin master ------指定分支推送并关联远程库,origin为远程库,master为分支。
         git push ------默认分支推送,这种方式默认推送的就是当前分支中的提交内容。
     3、分支
      前面已经说过HEAD类似于指针和索引的概念,在git中,HEAD指向的是分支,分支用于保存提交结果,并面向最后的推送。git默认的分支是master分支,在没有其它分支的情况下,所有的提交操作都会被保存保存到master分支上,最终这个分支的时间线会不断的进行延伸。但不变的是 HEAD 指向master,master再面向最后的推送。分支的优势在于其类似于一个平行独立的个体,不同的分支可以用来保存不同的提交和推送结果,从而避免在开发时产生的代码冲突。
        git branch <branchname> ------创建分支
        git checkout <branchname> ------切换分支
        git checkout -b <branchname> ------创建并切换分支
        git branch ------查看本地分支
        git branch -a ------查看所有分支
        git branch -r ------查看远程分支
        git merge <branchname> ------fast forward 模式合并
        git merge --no-ff -m "merge width no-ff" <branchname> ------非fast forward 模式合并

fast forward与非fast foward模式在于前者属于一种快速合并方式,不会保存历史记录,而后者会在合并时,创建commit提交,从而保留被合并分支之前的记录,通过git log --graph --pretty=oneline --abbrev-commit命令可以查看--no-ff模式下的合并提交记录。

git branch -d <branchname> ------一般删除分支
        git branch -D <branchName> ------强行删除分支
        git branch -r -a <branchName> ------删除远程分支

分支的注意事项:
      git中的分支分为本地分支与远程分支,本地分支就是使用者自己在本地仓库中创建的分支,所以远程分支便是使用者自己在远程仓库中建立的分支。先简单的介绍本地分支的操作流程,当我们在本地的git中创建一个dev的分支时,在没有切换下,HEAD依然指向的是默认的分支master,当我们通过git checkout dev 切换到dev分支时,HEAD便会指向dev分支。然后我们进行的提交操作,都会保存到dev分支中再面向最后的推送(push),如果此时再通过git命令切换到master 分支,那么HEAD就会自然的再指向master, 然后master面向提交,当我们在master基础上合并dev分支时,git就会将dev分支上的参数信息合并到master上,这样master上就可以看到之前的dev分支的所有提交内容了。

接着再介绍一下远程分支的概念,虽然我们说git中的分支分为“本地分支”与“远程分支”,但实际上这个区分并不突出,这是因为我们在本地git仓库中创建的分支,只要本地仓库origin与远程仓库origin是相连的情况下,git会自动帮我们将本地与远程同名的分支进行关联,除此之外,在进行fetch操作时,git也会将本地的分支自动同步到远程仓库中。除此之外当我们直接切换本地不存在但远程存在的分支时,git都会自动帮我们创建,切换并进行关联。示例:
       git checkout dev ------如果远程仓库存在dev分支,而本地不存在,git会自动帮我们创建,关联与切换dev分支
      需要注意的一点是,在本地同一个机器下创建的多个分支,其工作区中的文件是可以共享的,但是一旦该文件在某个分支中推送到了远程对应的分支时,那么该文件边只会是该分支独有的文件。

最后,关于分支的使用和注意事项,我做了几条简单的总结:
    (1)远程分支中的内容是独立的,但是对于同一个机器的本地分支而言,所创建的资源文件都是共享的。但是如果本地分支中的内容,推送到对应的远程文件,那么该内容在其它分支将会不可见。
    (2)每个分支都会保存自己的提交状态。
    (3)分支面向最后的推送,而推送的内容不会影响其它分支下的同文件。但是一旦分支合并后,那么在参与合并的这几个分支下,该文件便会是相同的内容。
    (4)当前的分支如果文件发生了变更时,是无法进行分支切换的,只有提交操作后才能够切换。
4、分支合并冲突
     分支在合并的时候,有可能会产生冲突。冲突的产生是因为在合并的时候,不同分支修改了相同的位置。所以在合并的时候git不知道那个到底是你想保留的,所以就提出疑问(冲突提醒)让你自己手动选择想要保留的内容,从而解决冲突。示例如下:

//第一步:
git checkout -b feature
vi readme.txt // 修改内容为 feature branch
git commit -a -m 'commit'

git checkout master
vi readme.txt //修改内容为 feature branch & master branch
git commit -a -m 'commit'

//第二步:
git merge feature
// 此时应该会提示冲突(CONFLICT)
git status
// 查看状态会看到更多的冲突提示信息。

//第三步:重新编辑冲突文件,然后提交

很全的命令:http://blog.csdn.net/langb2014/article/details/53063883

六、多人协作开发(包括bug分支与标签tag,很重要值得学些)

参考博客:http://www.cnblogs.com/HCJJ/p/6650038.html

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

git使用基础的更多相关文章

  1. git学习基础教程

    分享一个git学习基础教程 http://pan.baidu.com/s/1o6ugkGE 具体在网盘里面的内容..需要的学习可以直接下.

  2. Git入门基础详情教程

    前言 写了一篇文章<一篇文章了解Github和Git教程>还觉得不错,继续写了<为了Github默默付出,我想了解你>,那么继续写Git 基础知识. Git 官网:https: ...

  3. Git使用基础篇

    Git使用基础篇 前言 Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多 ...

  4. Git使用基础篇(zz)

    Git使用基础篇 您的评价:          收藏该经验       Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体 ...

  5. Mac下Git的基础操作

    目前最火的版本控制软件是Git了吧,今天简单梳理一下Mac下Git的基础操作~~ 一.什么是Git Git是一个分布式代码管理工具,用于敏捷的处理或大或小的项目,类似的工具还有svn. 基于Git的快 ...

  6. Mac 下 Git 的基础命令行操作

    Mac 下 Git 的基础命令行操作 sudo apt-get install git-core //安装Git 用户配置 git config --global user.name "Yo ...

  7. Git及基础命令的介绍以及如何向本地仓库添加文件

    在介绍Git的使用之前,我们得要先来了解一下Git.那么什么是Git? Git是一个版本管理工具(VCS),具有以下的特点: 分布式版本控制: 多个开发人员协调工作: 有效监听谁做的修改: 本地及远程 ...

  8. Git Bash基础使用(初始化)

    前提是在码云上已经新建一个空的项目,可参考:https://www.cnblogs.com/babysbreath/p/9170455.html 1.新建一个目录,存放下载下来的项目,我在D盘新建了一 ...

  9. git的基础使用

    GIT """ 什么是git:版本控制器 - 控制的对象是开发的项目代码 代码开发时间轴:需求1 > 版本库1 > 需求2 > 版本库2 > 版本 ...

  10. Git 实用基础(配置,建库,提交,推送 GitHub)

    Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...

随机推荐

  1. 关于OBJC

    http://www.objc.io/ objc这个站点是:关于objective-c语言的最佳实践和高阶技术的期刊. 看了几期非常不错,所以计划每天抽出时间翻译一篇文章和大家一起分享.

  2. js事件循环机制(Event Loop)

    javascript从诞生之日起就是一门  单线程的  非阻塞的  脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...

  3. 第10步:DBCA创建实例

    注意,创建磁盘组时需要以oracle用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su - ...

  4. (转)使用.NET Reflector 查看Unity引擎里面的DLL文件

    当你查看unity里面API的时候,是不是有时候追踪了一两步就碰到DLL文件走不下去了呢?很是不爽吧. 这种问题我也是经常碰到.这是人家商业引擎不想让你看到底层代码啦,所以着急不得. 不过,今天我终于 ...

  5. TF-IDF(词频-逆向文件频率)用于文字分类

    SVM分类器:支持向量机Support Vector Machine. 一个普通的SVM就是一条直线,用来完美划分linearly separable的两类.解决线性 要解决非线性需要到高维处理: 核 ...

  6. WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室

    from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录]   WebSocket入门教程--大纲   [实例简介]   ...

  7. Eclipse UML插件

    Green UML http://green.sourceforge.net/ AmaterasUML http://amateras.sourceforge.jp/cgi-bin/fswiki_en ...

  8. uiautomatorviewer.bat使用方法

    在android目录下找到uiautomatorviewer.bat,然后双击,页面的第二个按钮连接设备 D:\Program Files\android-sdk-windows\tools\uiau ...

  9. mysql数据库如何设置表名大小写不敏感?

    转自:https://blog.csdn.net/iefreer/article/details/8313839 在跨平台的程序设计中要注意到mysql的一些系统变量在windows和linux上的缺 ...

  10. Oracle 的安全保障 commit &checkpoint

    Oracle 的安全 commit &checkpoint commit ---lgwr 事务相关的操作,保证事务的安全. commit标志着事务的结束.意味着别人对你事务操作的结果可见. c ...