抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

超好用的现代简明时空魔法 Git+GitHub 可以帮助记录一个项目的历史状态,实现回溯、分支、合并等功能。

本地初始化 Git

初始化 git init
链接远程库 git remote add origin SHH码
首次提交 git push -u origin master

本地通用工作流

加入暂存 git add
提交入库 git commit -m "注释"
提交至远程仓库 git push

Github 克隆

初始化 git init
克隆到本地 git clone SSH码

1 初始化仓库 init

首先创立一个 repository,即仓库。这个仓库中的所有文件将会被 Git 追踪管理,在创立仓库的时候都需要进行初始化来建立必要文件。

git init    # Initialized empty Git repository in 仓库目录

此时文件夹中新增 .git 文件,它是 Git 的仓库目录。

有以下的其他命令来完成更复杂的操作

git init 文件夹名 # 在当前目录下新建文件夹,并将新建文件夹目录作为空仓库
git init --bare 文件夹名 # 初始化裸仓库

2 文件入库

在仓库文件夹中的所有文件都可以入库,只有入库的文件才会被记录在目录当中,享受Git服务。

入库的文件需要经过两个过程:add 存入暂存区commit 提交入库

提交暂存区的指令是 add,有以下几种形式:

git add .       # 【推荐】当前文件夹下所有文件存入暂存区

git add --all   # 仓库文件夹下所有文件存入暂存区
git add -A      # 上述代码缩写
git add *.后缀名 # 该后缀所有文件存入暂存区
git add 文件名   # 该文件存入暂存区,多个文件用空格隔开
# 这个操作是没有反馈输出的

提交入库的指令是 commit

git commit -m "说明注释"

可以在很多行 add 后进行一次 commit 全部提交

此时就形成了本地的文件仓库

每一次的修改想要提交的时候都需要add到暂存区,commit只会提交存储在暂存区的文件。

分布式管理的优势就在于每一个不同的设备终端都能提交不同的分支项目版本,为实现这个功能,就需要引入远程仓库的概念。

一般我们使用的远程仓库是 Github 或者 Gitee,这里用 Github 举例。

3 远程仓库

连接远程仓库 remote add

连接远程仓库将自己的本地终端与远程仓库连接在一起,此时需要一个“钥匙”来进行确认,让远程仓库知道提交这个推送信息的是被允许的自己的本地终端,这个钥匙是 SSH key

仓库创建完成后,在 【Quick setup】 当中找到 【HTTP/SSH】 的选项,选择 一项 复制

之后在本地仓库路径下打开终端:

git remote add origin 复制的SSH/HTTP # 连接本地仓库与远程仓库
# git remote add 别名 <server>
关于标识名称 origin

origin 是命名给仓库的别名,取任何名字都是可以的。

在 GitHub 中,默认的标识名是 origin,所以一般不做修改。

推送远程仓库 push

将本地仓库推送到远程仓库里

git push -u origin master # 首次推送
git push # 首次推送时加上 -u ,之后就可以只写 push 简化推送了
git push origin master # 通用的远程推送指令

其中 master 可以更改为任意想要推送的分支,而 -u 的作用可以看作为设定默认推送分支。

解除远程绑定 remote rm

首先查看远程库的信息

git remote -v
# origin git@github.com:仓库名称(fetch)
# origin git@github.com:仓库名称(push)

即这个仓库标识名称为 origin
之后直接通过标识名称删除即可

git remote rm origin # 删除origin仓库

这里的删除只是解除绑定,GitHub 的远程库文件并不会被删除。可以根据需求再次绑定别的本地仓库,或者直接在 GitHub 后台删除远程仓库。

4 克隆远程库 clone

除了从零创建本地库连接远程库实现分布式版本控制以外,还可以直接从已经存在的远程库中克隆下来存储到本地形成本地库。

在github远程仓库的界面复制下面的SSH,这里与连接远程的SSH是相同的。

SSH
SSH
cd 本地仓库路径 # 设定本地库工作区
git clone 复制的SSH/HTTP # 克隆远程库

此后,将会出现一个和远程库完全一致的本地仓库,再之后的修改与推送就和之前的没有什么区别了。

5 时间魔法 - 版本管理

git可以进行版本回溯的功能,这就是现代简明时间魔法

版本回溯也分为两个步骤: log 查找版本号 → reset 到之前版本

仓库状态 status/diff

在施放时间魔法之前,首先最好用 status 确认一下自己所在的时间坐标和状态,查看一下仓库中那些文件出现了变动,使用 diff 确认文件中具体哪些细节出现了改动

git status      # 查看修改状态
git diff 文件名  # 查看具体改动

其实也不是非要确认

在回退之前,首先需要获取当时的坐标,即版本号。直接调出管理日志,用 log 指令确认改动的信息

git log         # git日志,改动的作者,时间,说明

输出

commit 7f3b98f4b259a0d6a3f680b2ec2786ceff9e4e44 (HEAD → master, origin/master) # 最新版本号
Author: Lyrik <liulike74@163.com>   # 作者
Date:   Thu Jul 15 14:07:55 2021 +0800  # 时间

    20200715    # 说明

commit 687e86133697ee5a77c527e3edad93a9e153052a # 版本号
Author: Lyrik <liulike74@163.com>   # 作者
Date:   Thu Jul 15 01:29:45 2021 +0800  #时间

    优化存储结构    # 说明

commit ...
...
# 会出现所有的日志

退回版本 reset

我们需要关注版本号的前几位,这个是我们使用的坐标

使用 reset --hard 版本号 指令就可以重新设置到对应版本号

不加 --hard 时只有暂存区回退了版本,加上后会将工作区一起修改,在文件夹的可见文件中才会被显示。

git存在一个HEAD指针,指向当前的版本
只是从现在回退上一个或者前几个版本的话不需要这么麻烦,用 ^ 设定指针向回移动就可以了

回退上一个版本的话,使用 reset --hard HEAD^

git reset --hard HEAD^ # 回退上个版本
git reset --hard HEAD~100 # 回退前100个版本
git reset --hard 687e # 退回特定版本 “优化存储结构”,写几位就可以了,不要太少就行

版本列表时按照时间线进行排序的,回退后指针向前移动,并不会创造出新的时间线
所以连续回退不会出现版本循环

如果想要回到未来的版本,就用版本号的定位指针就可以了
git reflog 查看指令的日志,这样即便退回以前的版本,也可以看到因回退而消失的未来版本

还原修改 checkout

使用 checkout -- 文件名 可以将该文件替换成版本库或者暂存区里的状态

git checkout -- 文件名
  1. 文件未add到暂存区,则撤回到之前版本库的状态
  2. 文件之前add过,则撤回到暂存区的状态
  3. 即在add和commit中撤回到离现在最近的一个状态

6 空间魔法 - 分支管理

Git的每次版本提交将会串成一条时间线,初始的分支被称作 master主分支
当我们进行多人协作或者草稿等等时,就会创建出别的与主分支不同的时间线,这是分支

你需要在头脑里想象出一个树

创建分支

branch 文件名 创建分支,不加分支名的时候是查看分支情况
使用 switch 分支名 可以切换分支

git branch 分支名 # 创建分支
git switch 分支名 # 切换分支
git switch -c 分支名 # 等于上述两行指令合并

git branch  # 查看分支,当前分支用 *标识
# * 分支名
# master

合并分支

使用 merge 分支名 可以将分支名分支合并到当前checkout的分支当中

git switch master # 切换到主分支
git merge 分支名     # 将分支名分支合并到主分支(当前分支)当中

合并冲突

当分支与master同时出现修改的时候会产生合并冲突,此时需要我们手动修改解决冲突的文件,再进行合并

默认合并的时候会使用 Fast forward 模式,该模式速度超快,但是在删除分支的时候会丢失分支信息
使用

git merge --no-ff -m "说明" 分支名 # --no-ff关闭ff模式

此时的合并会备注有说明

删除分支

branch -d 命令删除指定分支

git branch -d 分支名 # 删除分支名分支

分支策略

一般来说,主分支被命名为 master
主分支用来发布新版本,非常稳定,并不在其中干活

干活分支被命名为 dev
dev分支相对来说不会那么稳定,且每个成员的分支将会合并到dev分支上,最终确认版本再由dev分支合并至主分支

成员分支
每个成员都会有属于自己的分支,提交的更改会被合并到dev分支上

7 忽略文件

在工作区中总有一些文件需要被忽略,像是MacOS的 .DS_Store 存储索引文件,Python的编译文件等等

编写 .gitignore 文件,里面每一行存储这些文件名即可

*.后缀名 # 排除所有改后缀名的文件
.*      # 排除所有隐藏文件
/文件夹  # 排除某文件夹
/文件1/* # 排除根目录下文件1中的所有内容
文件1/*  # 排除所有目录下文件1中的所有内容 


!.gitignore # 不排除 .gitignore

搜索查找删除项目中的某个文件,以 .DS_Store 举例

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

8 Git 标签

查找commit版本号过于复杂,而且无法根据说明注释进行查找(说明注释可以完全相同甚至不写)
此时用标签给commit叫一个便于管理的有意义的版本号是十分有用的

在需要创建的分支上,直接用 tag 标签 就可以给最新提交的commit打上标签
需要给以前版本打标签的话,用 tag 标签 commit的id 即可

比如我们在master分支上给最新提交的commit打上v1.0.0的标签

git switch master # 切换到主分支
git tag v1.0.0    # 打上v1.0.0标签

git tag -a v1.0.0 -m "miao" # 打上标签的同时增加标签说明

查看标签信息使用以下几个操作

git show 标签名  # 查看该标签的详细信息
git tag         # 查看所有标签

删除标签的操作为 tag -d

git tag -d 标签

9 别名

用别名来称呼远程库,可以在后面比较方便地进行调用

git remote -v           # 查询远程库是否有别名

git remote add 别名 远程库Http/SSH.git   # 给某个远程库别名

10 拉取

将远程库修改过的版本下载到本地的动作称为拉取。

pull = fetch+merge

git fetch 别名 分支

git merge 别名/分支

git fetch origin master # 拉取某库的某分支
# fetch拉取不会更改本地仓库的文件,只会变更工作区文件

git merge origin/master # 将该origin的master支与当前分支合并

直接用 git pull 别名 分支

git pull origin master  # 从远程库拉取并合并,工作区和本地仓库均改变

评论