Git快速上手

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/qq_31192383/article/details/53389358

What is Git

首先我们需要知道Git是什么,Git是一个分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,在此之前,人们都是使用的集中式的版本控制系统(CVS,SVN)。要知道分布式版本控制系统的优先,就需要先了解集中式版本控制系统是如何工作的。

  • 集中式版本控制系统
    集中式版本控制系统的版本库是集中存放在中央服务器的,大家在工作时需要从服务器下载最新的版本(要是电信把你宽带停了,你就不能愉快的下载了),然后将自己工作的内容再推送到服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
    工作示意图:
    这里写图片描述

  • 分布式版本控制系统
    分布式版本控制系统就没有一个统一的中央服务器了,每个人的电脑上面都有一个完整的版本库(感觉就是空间换取时间。。。),然后你只需要把你修改的部分推送给你的小伙伴们。
    和集中式的版本控制系统相比,分布式版本控制系统安全性高不少,因为每个人电脑都有一份完整的版本库,也就不用担心中央服务器出问题而导致大家都不能工作的尴尬情况。
    在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
    工作示意图:
    这里写图片描述

基本用法

  • Git的初始化
    安装:
    这里写图片描述

    创建自己的Git用户信息:
    这里写图片描述
    查看一下自动创建的目录的内容:
    这里写图片描述
    这个配置文件就是Git的全局配置文件,一般配置方法是【git config –global<配置名称><配置的值>】

    如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 –global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

  • 获得一个Git仓库

    • clone一个仓库
      clone一个项目,我们需要知道这个仓库位于哪儿(Git URL),Git不仅支持常用的http(s)://协议,也支持ssh://和git://等。
      这里我从一个已有的仓库中clone一份项目到本地:
      这里写图片描述
      (项目会自动保存到当前目录,这里是根目录)
      这时你就可以在这个项目中完成属于自己的任务了。

    • 初始化一个新仓库
      我们先创建一个目录,假设它就是我们的项目目录,然后将它创建成一个Git仓库:
      这里写图片描述

  • 正常的工作流程
    git的基本流程如下:

    • 1、创建或修改文件
    • 2、使用【git add】命令添加新创建或修改的文件到本地的缓存区(Index)
    • 3、使用【git commit】命令提交到本地代码库
    • 4、使用【git push】命令将本地代码库同步到远端代码库(可选)

    这里写图片描述
    (图片来自菜鸟教程)

    模拟正常工作流程的实验:
    1、在之前初始化的myProject仓库中,添加三个“源文件”:
    这里写图片描述

    2、查看当前仓库的状态:
    这里写图片描述
    (可以看到有三个文件处于未跟踪(untracked)状态)

    3、将文件添加到本地缓存区,并查看其状态改变:
    这里写图片描述
    (这时文件就等待着被commit到本地代码库中)

    4、如果你想查看刚刚add之后的文件是否再次被更改,你可以通过:【git diff】只可以查看未被add到缓冲区但是曾经被add过的文件的修改(“i am forever”为添加后未add),【git diff –cached】只能查看缓存区中的文件修改
    这里写图片描述

    这里写图片描述

    5、使用【git commit -m [注释]】来提交到本地代码库,之后在查看状态发现无可上传的文件了:
    这里写图片描述

    这里写图片描述

    6、这时更改了test1内容,我们可以再次把它add到缓冲区,然后进行提交,也可以直接使用【git commit -a -m [注释] 】直接提交(未被commit过的文件不会被-a直接commit):
    这里写图片描述

    7、如果本地仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:
    这里写图片描述
    成功上传到我的GitHub上:
    这里写图片描述

    在我上传的时候遇到了一个问题:
    这里写图片描述
    点击这里可以解决该问题 解决方案

    以上就是一次完整的工作流程,【git rm -f】可以强制删除包括本地文件、本地缓存和本地仓库中的文件,而【git rm –cached】则只保留了本地文件。
    注意:想要删除远仓库中的文件,需要在删除仓库中的文件后,然后commit,最后push一次,远程仓库中也就删除了该文件:
    这里写图片描述

  • 分支与合并
    Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。
    当前目次下代码

    • 分支
      一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫myBranch的分支:
      这里写图片描述
      这里写图片描述
      master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下。【git checkout 分支名】就可以切换到对应分支中去:
      这里写图片描述

      这里我们再做一些实验:
      1、我们先在myBranch中修改一个文件,然后提交,最后回到master分支:
      这里写图片描述

      2、然后我们再在主分支查看刚刚做的修改,发现看不见,然后我们再在主分支做一些修改:
      这里写图片描述

      3、先在两个分支中都有属于自己的修改,现在需要合并他们:
      这里写图片描述

      注意:这时你不仅可以从主分支master上面push到你的github上,也可以通过myBranch分支push上去。

      4、上面的修改是基于两个不同的文件,如果两个分支同时修改并提交了同一个文件再merge:
      这里写图片描述
      注意:这个时候虽然提示合并失败,但是其实file3中有在master和在myBranch中修改的内容,只不过用‘<<<<<<’‘>>>>>>’‘========’符号区分开了,这时你可以手动改动。
      这里写图片描述

      5、如果你不在需要分支,你可以删除它【git branch -d】:
      这里写图片描述
      (参数-d只能删除已merge的分支,对于未merge的分支要用-D参数来删除)

    • 撤销一个合并
      如果你觉得你合并之后的状态不是你想要到,你可以回到合并之前的状态【git rest hard HEAD^】:
      这里写图片描述

    • 快速向前合并
      还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。
      但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前”(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。

  • Git日志

    • 查看日志
      【git log】命令可以显示所有的提交(commit):
      这里写图片描述
      (说明:可以使用git help log查看所有选项)

    • 日志统计
      【git log –stat】会显示每个提交中的具体改变的内容:
      这里写图片描述

    • 格式化输出日志
      使用命令【git log –pretty=格式】:
      这里写图片描述
      这里写图片描述
      你也可用medium,full,fuller,email 或raw。 如果这些格式不完全符合你的相求, 你也可以用–pretty=format参数定义格式。

      【git log –graph】可以可视化你的提交图:
      这里写图片描述

    • 日志排序
      日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log命令添加顺序参数。
      按默认情况,提交会按逆时间顺序显示,可以指定–topo-order参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示):
      这里写图片描述

  • 比较内容
    实验之前,先将我自己GitHub上的一个测试项目clone下来:
    这里写图片描述

    • 比较提交
      我们先对这个项目做一些修改:
      这里写图片描述

      然后用【gif diff】命令查看修改的内容:
      这里写图片描述
      (说明:因为此时缓存区并无文件,所以用【git diff】只能查看到file1,因为file2/file3是新建的文件,不会查看到。)

      这时候将所有的修改add到缓存区,所以此时用【git diff】什么都看不见,而【git diff –cached】能看见三个文件:
      这里写图片描述

      最后我们提交所有修改,这时【git diff】和【git diff –cached】都什么都看不见:
      这里写图片描述

    • 比较分支
      我们先新建一个分支myBranch,然后在这个分支里,新建一个文件再修改file1,最后commit:
      这里写图片描述

    • 更多的比较选项
      当前分支与指定分支比较:
      这里写图片描述
      当前分支与指定分支的指定文件比较:
      这里写图片描述
      【git diff 分支 –stat】可以统计一下有哪些文件被改动,有多少行被改动:
      这里写图片描述

  • 分布式的工作流

    • 分布式的工作流
      这里我们假设我们有一个伙伴,也在同一台机器上面工作,我们把之前的仓库clone到这个partner,并命名为partRepository:
      这里写图片描述
      (clone的时候,被克隆的仓库处于哪个分支,默认就会被clone哪个分支)

      然后让你的partner做了些修改打算提交,却遇到了问题:
      这里写图片描述
      解决:
      这里写图片描述

      现在我想将我的partner所做的修改拉pull下来:
      这里写图片描述
      (说明:【git pull】=【git fetch】+【git merge】)

      如果是我的partner想把我后来做的修改pull下来,可以直接使用【git pull】,不用加仓库地址,因为它配置文件中默认了它clone时的地址:
      这里写图片描述

      这里写图片描述

    • 公共Git仓库
      开发过程中,通常大家都会使用一个公共的仓库,并clone到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来pull自己的代码。
      如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对 方的仓库目录里直接拉所作的修改,git命令里的仓库地址也可以是本地的某个目录名:
      这里写图片描述
      也可以是一个ssh地址:
      这里写图片描述

    • 公共Git仓库
      通过http或是git协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们 没有写权限。如何将本地私有仓库的最近修改主动上传到公共仓库中呢?
      最简单的办法就是用git push命令,推送本地的修改到远程Git仓库,执行下面的命令:
      这里写图片描述
      或者:
      这里写图片描述

    • 当代码推送失败时怎么办:
      如果推送(push)结果不是快速向前fast forward,可能会报像下面一样的错误:
      这里写图片描述
      这种情况通常是因为没有使用git pull获取远端仓库的最新更新,在本地修改的同时,远端仓库已经变化了(其他协作者提交了代码),此时应该先使用git pull合并最新的修改后再执行git push:
      这里写图片描述

参考资料:
https://www.shiyanlou.com/courses/4#


注:转载请注明原文出处:
作者:CUG_UESTC
出处:http://blog.csdn.net/qq_31192383/article/details/53389358

猜你喜欢

转载自blog.csdn.net/qq_31192383/article/details/53389358