本人博客: 好吃懒洋洋的CSDN博客
【Git|GitHub|SSH|Sourcetree 下篇】
✅前言
当下,几乎所有开发者都要接触版本控制系统 ( Version Control System, 简称 VCS ), 这种工具让他们在分工合作时避免了不必要的重复与冲突,如果遇到什么问题,也可以及时回退到之前的版本。当今最流行的版本控制系统(至少在网络开发者中是这样的)是 Git,和与之关联的编程社区网站 GitHub 、Gitee等等。
另外,版本控制系统在软件开发过程中是必不可少的:
- 我们很少独自完成一个项目,而在分工合作的同时我们都会有与他人的工作相冲突的风险:尤其是当两个人同时尝试修改同一段代码的时候。所以我们需要有相应的机制用以避免这种情况。
- 在开发一个项目的时候,我们希望能将代码及时保存,这样就可以避免像电脑突然崩溃辛苦全部白费这样的尴尬局面。
- 如果后期发现了问题,我们可能还会需要退回更早的版本。有的小朋友也许想到可以通过创建一堆
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-Flow、SSH公钥配对以及GitHub远程仓库部署等等
➡️下载安装:Git下载地址,个人推荐使用迅雷下载(亲测,超好用)
⭕️内容
🕐Git三大区初认识
Git本地有三个工作区域:
-
- 工作目录(Working Directory)
- 暂存区(Index)
- 仓库区(Repository)
- 另外加上远程的git仓库(Remote Repository)就可以分为四个工作区域,文件在这四个区域之间的转换关系如下:
🕜Git基本指令
为使用 Git,开发人员使用特定命令来复制、创建、更改和合并代码。 这些命令可以直接从命令行执行,也可以使用 GitHub Desktop等应用程序执行。 以下是使用 Git 的一些常用命令(其中会有一些演示操作,注意文件目录变化):
- 配置用户信息
$ git config --global user.name "Your Name"
$ git config --global user.email "youremail@163.com"
该指令可以进行覆盖操作,git config
演示:
另外,输入git log
可看到你的用户信息(即提交作者),前提时有提交记录
git init
初始化一个全新的 Git 存储库并开始跟踪现有目录。 它在现有目录中添加一个隐藏的子文件夹,所以这里我们需要按下面操作使其显现,该子文件夹包含版本控制所需的内部数据结构。
git init
演示:
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: 一张图带你加深对commit
和log
理解
git branch
显示正在本地处理的分支。git merge
将开发线合并在一起。 此命令通常用于合并在两个不同分支上所做的更改。 例如,当开发人员想要将功能分支中的更改合并到主分支以进行部署时,他们会合并。git pull
使用远程对应项的更新来更新本地开发线。 如果队友已向远程上的分支进行了提交,并且他们希望将这些更改反映到其本地环境中,则开发人员将使用此命令。git push
使用本地对分支所做的任何提交来更新远程存储库。
📌Note: 一个按键小技巧分享给大家
以上均为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 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。或许你还记得起步的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。
在进行提交操作时,Git 会保存一个提交对象(commit object)。 知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象
📌Note: Git 的 master
分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init
命令默认创建它,并且大多数人都懒得去改动它。
- 分支合并冲突问题
当分支merge
时,如果分支A的某个文件只是在分支B的该文件上进行了一些修改,当这两个分支合并时,便会出现以下情况,此时我们进入了另一个页面,相当于时对这次合并出现的分支conflict
进行处理
图1:
该页面我们只需要在图中step1中输入该冲突的备注信息,相当于前文当中commit
是的“commit message”
图2:
此时是在VScode编译器中解决具体冲突
🔳总结
好的,上篇就介绍到这里,内容可能有点多,但概念还是比较简单,下篇我们将带来GitHub、Sourcetree、SSH以及Git-flow工作流等知识,敬请期待,byebye👋👋👋