【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习

在这里插入图片描述

⌚️⌚️⌚️个人格言:时间是亳不留情的,它真使人在自己制造的镜子里照见自己的真相!
Git专栏:Git篇
JavaScript专栏:js实用技巧篇,该专栏持续更新中,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流
你的一键三连是对我的最大支持 ❤️

文章目录

  • ✅前言
  • ⭕️内容
    • Git三大区初认识
    • Git基本指令
    • git 常用命令
      • ◻️仓库
      • ◻️增加/删除文件
      • ◻️代码提交
      • ◻️查看信息
      • ◻️分支
      • ◻️标签
      • ◻️远程同步
      • ◻️撤销
    • 忽略文件配置(.gitignore)
    • 分支创建、合并、合并冲突
  • 总结

✅前言

当下,几乎所有开发者都要接触版本控制系统 ( Version Control System, 简称 VCS ), 这种工具让他们在分工合作时避免了不必要的重复与冲突,如果遇到什么问题,也可以及时回退到之前的版本。当今最流行的版本控制系统(至少在网络开发者中是这样的)是 Git,和与之关联的编程社区网站 GitHubGitee等等。

另外,版本控制系统在软件开发过程中是必不可少的:

  • 我们很少独自完成一个项目,而在分工合作的同时我们都会有与他人的工作相冲突的风险:尤其是当两个人同时尝试修改同一段代码的时候。所以我们需要有相应的机制用以避免这种情况。
  • 在开发一个项目的时候,我们希望能将代码及时保存,这样就可以避免像电脑突然崩溃辛苦全部白费这样的尴尬局面。
  • 如果后期发现了问题,我们可能还会需要退回更早的版本。有的小朋友也许想到可以通过创建一堆 Code_v1.js, Code_v2.js, Code_v3.js, Code_final.js, Code_really_really_final.js 之类的文件用于保存历史版本,但这个方法不妥,容易出错。
  • 不同的团队成员也会需要创建他们自己的独特的版本(在 Git 中叫做branches (分支)),他们在这里添加一些新的功能特性,然后通过一些可控的方法(在 GitHub 中我们使用 pull request (拉取请求))将它们贡献到原来的主干项目中。

版本控制系统提供了能够满足以上需求的工具。Git 是版本控制系统的典范,而 GitHub 是一个为个人或团队操作 Git 储存库 ( Git Repositories) 提供了 Git 服务器和一系列非常实用的工具的网站 + 基础设施。它提供了报告代码错误、检查工具以及分配任务和任务状态等项目管理工具等等。

❗️ ❗️ ❗️本篇短文将带你学习到Git环境搭建Git指令Git-FlowSSH公钥配对以及GitHub远程仓库部署等等

➡️下载安装:Git下载地址,个人推荐使用迅雷下载(亲测,超好用)

⭕️内容

Git三大区初认识

  • Git本地有三个工作区域:

    • 工作目录(Working Directory)
    • 暂存区(Index) 在这里插入图片描述
    • 仓库区(Repository)
    • 另外加上远程的git仓库(Remote Repository)就可以分为四个工作区域,文件在这四个区域之间的转换关系如下:
      【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第1张图片

Git基本指令

为使用 Git,开发人员使用特定命令来复制、创建、更改和合并代码。 这些命令可以直接从命令行执行,也可以使用 GitHub Desktop等应用程序执行。 以下是使用 Git 的一些常用命令(其中会有一些演示操作,注意文件目录变化):

  • 配置用户信息
$ git config --global user.name "Your Name"             
$ git config --global user.email "[email protected]"

该指令可以进行覆盖操作,git config演示:
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第2张图片
另外,输入git log可看到你的用户信息(即提交作者),前提时有提交记录
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第3张图片

  • git init 初始化一个全新的 Git 存储库并开始跟踪现有目录。 它在现有目录中添加一个隐藏的子文件夹,所以这里我们需要按下面操作使其显现,该子文件夹包含版本控制所需的内部数据结构。
    【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第4张图片

git init 演示:【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第5张图片

  • git clone 创建远程已存在的项目的本地副本。 克隆包括项目的所有文件、历史记录和分支。
  • git add 暂存更改。 Git 跟踪对开发人员代码库的更改,但有必要暂存更改并拍摄更改的快照,以将其包含在项目的历史记录中。 此命令执行暂存,即该两步过程的第一部分。 暂存的任何更改都将成为下一个快照的一部分,并成为项目历史记录的一部分。 通过单独暂存和提交,开发人员可以完全控制其项目的历史记录,而无需更改其编码和工作方式。
  • git commit 将快照保存到项目历史记录中并完成更改跟踪过程。 简言之,提交就像拍照一样。 任何使用 git add 暂存的内容都将成为使用 git commit 的快照的一部分。

Note:git commit -m "commit message",提交时按该指令进行提交

  • git status 将更改的状态显示为未跟踪、已修改或已暂存。

git-status-add-commit-log 演示 :

Note: 一张图带你加深对commitlog理解
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第6张图片

  • git branch 显示正在本地处理的分支。
  • git merge 将开发线合并在一起。 此命令通常用于合并在两个不同分支上所做的更改。 例如,当开发人员想要将功能分支中的更改合并到主分支以进行部署时,他们会合并。
  • git pull 使用远程对应项的更新来更新本地开发线。 如果队友已向远程上的分支进行了提交,并且他们希望将这些更改反映到其本地环境中,则开发人员将使用此命令。
  • git push 使用本地对分支所做的任何提交来更新远程存储库。

Note: 一个按键小技巧分享给大家
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第7张图片以上均为git最最常用指令,如果是第一次接触git,可能此时脑袋已经懵了,但千万不要着急,上面的统统不需要背,忘记时查询即可;此外,下面还有比较常用到的指令大全;最后,如要继续学习其它指令,可到git官方网站查询

最最重要的来了:本文后续操作都在Visual Studio Code编译器中进行,即将git init的文件夹用该编译器打开

git 常用命令

◻️仓库

在当前目录新建一个Git代码库

$ git init

新建一个目录,将其初始化为Git代码库

$ git init [project-name]

下载一个项目和它的整个代码历史

$ git clone [url]

◻️增加/删除文件

添加指定文件到暂存区

$ git add [file1] [file2] ...

添加指定目录到暂存区,包括子目录

$ git add [dir]

添加当前目录的所有文件到暂存区

$ git add .

添加每个变化前,都会要求确认
对于同一个文件的多处变化,可以实现分次提交

$ git add -p

删除工作区文件,并且将这次删除放入暂存区

$ git rm [file1] [file2] ...

停止追踪指定文件,但该文件会保留在工作区

$ git rm --cached [file]

◻️代码提交

提交暂存区到仓库区

$ git commit -m [message]  “message”在引号内

提交工作区自上次commit之后的变化,直接到仓库区

$ git commit -a

提交时显示所有diff信息

$ git commit -v

◻️查看信息

显示有变更的文件

$ git status

显示当前分支的版本历史

$ git log

搜索提交历史,根据关键词

$ git log -S [keyword]

显示某个文件的版本历史,包括文件改名

$ git log --follow [file]

显示指定文件相关的每一次diff

$ git log -p [file]

显示工作区与当前分支最新commit之间的差异

$ git diff HEAD

显示两次提交之间的差异

$ git diff [first-branch]...[second-branch]

显示今天你写了多少行代码

$ git diff --shortstat "@{0 day ago}"

显示某次提交的元数据和内容变化

$ git show [commit]

显示当前分支的最近几次提交

$ git reflog

◻️分支

列出所有本地分支

$ git branch

列出所有远程分支

$ git branch -r

列出所有本地分支和远程分支

$ git branch -a

建立分支:

新建一个分支,但依然停留在当前分支

$ git branch [branch-name]

新建一个分支,并切换到该分支

$ git checkout -b [branch]

新建一个分支,指向指定commit

$ git branch [branch] [commit]

切换到指定分支,并更新工作区

$ git checkout [branch-name]

切换到上一个分支

$ git checkout -

合并指定分支到当前分支

$ git merge [branch]

选择一个commit,合并进当前分支

$ git cherry-pick [commit]

删除分支

$ git branch -d [branch-name]

◻️标签

列出所有tag

$ git tag

新建一个tag在当前commit

$ git tag [tag]

新建一个tag在指定commit

$ git tag [tag] [commit]

删除本地tag

$ git tag -d [tag]

查看tag信息

$ git show [tag]

提交指定tag

$ git push [remote] [tag]

提交所有tag

$ git push [remote] --tags

◻️远程同步

下载远程仓库的所有变动

$ git fetch [remote]

显示所有远程仓库

$ git remote -v

显示某个远程仓库的信息

$ git remote show [remote]

增加一个新的远程仓库,并命名

$ git remote add [shortname] [url]

拉取请求(pull request):

取回远程仓库的变化,并与本地分支合并

$ git pull [remote] [branch]   //远程仓库remote默认名为 origin相当于一个指针指向改地址

允许不相关历史提交,并强制合并

$ git pull origin master --allow-unrelated-histories

推送给remote repository:

上传本地指定分支到远程仓库

$ git push [remote] [branch]   //远程仓库remote默认名为 origin

强行推送当前分支到远程仓库,即使有冲突

$ git push [remote] --force

推送所有分支到远程仓库

$ git push [remote] --all

◻️撤销

恢复暂存区的指定文件到工作区

$ git checkout [file]

恢复某个commit的指定文件到暂存区和工作区

$ git checkout [commit] [file]

恢复暂存区的所有文件到工作区

$ git checkout .

重置命令:

重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

$ git reset [file]

重置暂存区与工作区,与上一次commit保持一致

$ git reset --hard 

重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变

$ git reset [commit]

重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致

$ git reset --hard [commit]

重置当前HEAD为指定commit,但保持暂存区和工作区不变

$ git reset --keep [commit]

忽略文件配置(.gitignore)

首先,看到这个名字,肯定会有疑惑什么是.gitignore文件?gitignore文件的用途是什么?

首先,我们要清楚当前运行的Git存储库中的每个文件都有以下状态之一:

  • tracked:这些是Git所知道的所有文件或目录。这些是新暂存(用 git add 添加的)和提交(用 git commit 提交的)到主仓库的文件和目录。
  • untracked:这些是在工作目录中创建的任何新文件或目录,但还没有暂存(或使用git add命令添加)。
  • ignored:这些是Git在Git存储库中完全排除、忽略和不知道的所有文件或目录。从本质上说,这是一种告诉Git哪些未跟踪的文件应该保持不跟踪且永远不提交的方式。

所有被忽略的文件都被放置在 .gitignore 文件里。.gitignore 文件是一个纯文本文件,它包含来自项目的所有指定文件和文件夹的列表,Git应该忽略和不跟踪这些文件和文件夹。在 .gitignore 内部,您可以通过提到特定文件或文件夹的名称或模式,告诉Git只忽略单个文件或文件夹。您还可以使用相同的方法告诉Git忽略多个文件或文件夹。

  • 配置语法:

    • 以斜杠“/”开头表示目录;

    • 以星号“*”通配多个字符;

    • 以问号“?”通配单个字符;

    • 以方括号“[]”包含单个字符的匹配列表;

    • 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;

示例 解释
# 此为注释 表示注释, 将被忽略
/ *代表所有,即忽略.gitignore所在根目录下所有文件
*.html 忽略所有后缀名为.html的文件
file1/* 忽略 file1下面的所有文件
file1/*.css 会忽略 file1/ 目录内的所有后缀名为.css的文件, 但不包括子目录的
!.js 不忽略所有后缀名为.js的文件

Note:git 对于 .gitignore 配置文件时是按行从上到下进行规则匹配的,即如果上面的配置范围较大时,下面的配置可能无效

下面为可能无效原因:
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第8张图片

【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第9张图片

分支创建、合并、合并冲突

  • 分支简介

为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。或许你还记得起步的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照

在进行提交操作时,Git 会保存一个提交对象(commit object)。 知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第10张图片
Note: Git 的 master 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。

  • 分支合并冲突问题

当分支merge时,如果分支A的某个文件只是在分支B的该文件上进行了一些修改,当这两个分支合并时,便会出现以下情况,此时我们进入了另一个页面,相当于时对这次合并出现的分支conflict进行处理

图1:
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第11张图片
该页面我们只需要在图中step1中输入该冲突的备注信息,相当于前文当中commit是的“commit message”

图2:

【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习_第12张图片
此时是在VScode编译器中解决具体冲突

总结

好的,上篇就介绍到这里,内容可能有点多,但概念还是比较简单,下篇我们将带来GitHub、Sourcetree、SSH以及Git-flow工作流等知识,敬请期待,byebye

你可能感兴趣的:(Git,git,github,ssh)