Git-学习-从基础到实战-宇宙最详细

Git 简介:

Git 介绍:

Git是目前世界上最先进的分布式版本控制系统(没有之一),在处理各种项目时都十分高效,而且非常的高大上。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git是分布式版本控制系统,它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上

Git和Svn区别

Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。

Git 与 SVN 区别点:
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。

2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。

3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。

4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。

5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

工作原理 / 流程:

在这里插入图片描述

什么是分布式版本控制系统?

首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
这里举个例子,你需要编写一个文档,这个文档呢财务部需要,产品部也需要。那么你要怎么写呢。无非这样做,先写一部分部门的材料,保存下来一个版本,交给他们,再添加一部分材料保存另一个版本交给另外的部门。如果涉及到多个部门,可能你需要写多个版本,都保存下来。然而,电脑桌面乱糟糟的,却又不敢删除任何一个版本。
  这并不是最糟糕的。最糟糕的是这么多部门又给你返回了他们各自部门的信息。你还要将它们统一到一个版本里。
  这时你会不会希望有一个管理系统不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

Git安装

最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
Git 各平台安装包下载地址为:Git下载地址官网
在这里插入图片描述
如上图所示,选择自己的系统下载安装即可;
下载下来以后,闭着眼睛,一路安装即可,安装成功以后在Windos上,点击鼠标右键,会出来git的选项
在这里插入图片描述
在这里我们点击Git Bash Here会出现像cmd黑窗口一样的命令窗口,Git就安装成功了。
安装成功以后我们可以去Github官网注册自己的账号 Github官网地址
我们要做的第一件事就是打开git的命令窗口,输入如下命令:

# 配置用户名
git config --global user.name "username"    //( "username"是自己的账户名,)
# 配置邮箱
git config --global user.email "[email protected]"     //("[email protected]"注册账号时用的邮箱)

以上命令执行结束后,可用 git config --global --list 命令查看配置是否OK

Git 工作区、暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:版本库(repository)也叫仓库,可以看做一个目录,这个目录里的所以文件都由Git进行管理,每个文件的修改、删除,Git都能跟踪。

Git 创建仓库

使用git init

在自己电脑上随便创建一个文件夹,比如叫test,我们进入这个文件夹以后,右键打开Git Bash Here窗口,执行以下操作
命令: git init

$ git init
Initialized empty Git repository in /Users/Administrator/learngit/.git/

该命令执行完后会在当前目录生成一个 .git 目录。
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository).

介绍

git init
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。

使用git status 命令

$ git status //查看仓库当前的状态
On branch master
Changes not staged for commit: //没有文件将要被提交
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   readme.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

上面的命令告诉我们,test.txt 文件被修改过了,但还没有准备提交的修改。

如果我们想知道上次是怎么修改readme.txt 文件的,需要用 git diff 命令:

使用git add

在使用git init 以后没,我们的电脑会出现一个.git文件,我们在当前文件夹地下创建一个文件,比如test.txt,然后在里面随便输入一些内容以后保存退出。

git add test.txt  # 把本地文件(工作区)添加到缓存区

这里我们只是添加了一个文件到暂存区,而我们在工作当中一般使用

git add .

将本文件夹下所有文件添加到暂存区,注意,后面的不能丢

使用git commit

git commit 是将我们的代码或者文件提交到了本地的仓库,而不是远程的仓库,这和SVN有很大的区别。

$ git commit -m "first commit"  #每一次提交都要写清楚提交的内容,这对后面版本回退很重要
[master e475afc] add distributed
 1 file changed, 1 insertion(+), 1 deletion(-)

再用 git status 查看一下当前仓库状态:

$ git status
On branch master
nothing to commit, working tree clean //当前没有需要提交的修改,而且,工作目录是干净的。

版本回退

以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较。每一次,改完这些我总感觉心好累啊!!!然后,我就发现了 Git 一个非常强大的功能:回滚。当然我还是喜欢叫它:版本回退。

git log

输入该命令,会显示从最近到最远的提交日志(所有日志)。每一次提交都有对应的 commit id 和 commit message。
如果嫌弃输出的信息杂乱无章,那么加上 --pretty=oneline 参数试试吧!

git log --pretty=onelin

在这里插入图片描述
也可以使用这个命令查看日志:

git reflog

在这里插入图片描述
我们可以根据你每次提交代码的信息,回退到任意一个版本

git reset --hard accXxXXXX #这个就是你要回退的的版本id

版本回退有很多种命令可以实现,比如下面这种,不推荐,还是采用上面的最好

$ git reset --hard HEAD^ //HEAD表示当前版本,则HEAD^表示上一个版本,那么上上版本就是HEAD^^
HEAD is now at e475afc add distributed

Git 远程仓库

创建远程仓库

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在这里插入图片描述
最后点击create repository就创建成功了
在这里插入图片描述
新创建的,Github都有给你提示,怎么将代码放到你新建的仓库,提示有三种方法,你可以根据自己的情况,将本地代码提交到你创建的远程仓库。

将本地代码提交到远程仓库

首先进入自己的本地代码文件夹目录,打开git命令窗口,依次执行一下代码:

git init   // 初始化版本库
 
git add .   // 添加文件到版本库(只是添加到缓存区),.代表添加文件夹下所有文件 
 
git commit -m "first commit" // 把添加的文件提交到版本库,并填写提交备注

到目前为止,我们完成了代码库的初始化,但代码是在本地,还没有提交到远程服务器,所以关键的来了,要提交到就远程代码服务器,进行以下两步:

git remote add origin 你的远程库地址  // 把本地库与远程库关联
 
git push -u origin master    // 第一次推送时
 
git push origin master  // 第一次推送后,直接使用该命令即可推送修改

注意在这里可能会出现错误,就是你的代码已经和远程仓库有了关联,那么我们可以这样操作:

git remote remove origin

在继续执行上面的命令即可

从远程仓库clone代码

打开空文件夹,打开git命令窗口:

git clone https://github.com/chxxx/xxxxxx.git

在这里插入图片描述

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
在这里插入图片描述

首先,我们创建dev分支,然后切换到dev分支:

创建分支命令:

$ git checkout -b dev
Switched to a new branch 'dev'

切换分支命令:

$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:
git branch命令会列出所有分支,当前分支前面会标一个*号。

$ git branch
* dev
  master

合并分支

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
我们在dev分支修改了代码以后,通过commit命令提交以后,切换到master分支以后,想要合并dev分支修改的内容

$ git checkout master
Switched to branch 'master'

合并分支命令:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

删除分支

删除分支命令:

git branch -d (branchname)

分支冲突解决

人生不如意之事十之八九,合并分支往往也不是一帆风顺的。
在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决

$ git status -s
UU runoob.php
$ git add runoob.php
$ git status -s
M  runoob.php
$ git commit
[master 88afe0e] Merge branch 'change_site'

在这里我就不做过多的关于冲突介绍了,因为在实际开发当中,我是使用IDEA的,它的git图形化界面非常友好,我们可以根据图形化界面的提示,进行修改,重新上传就可以了。

Git查看提交历史

使用 git log 命令列出历史提交记录。

# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

Git命令大全

在这里插入图片描述
以上就是本人学习使用Git的一些记录,如有错误,欢迎指正交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章