这里是超好用的现代简明时空魔法 Git
的简要实用手册。
本地初始化仓库
git init # 初始化
git remote add origin SHH码 # 连接远程仓库
git push -u origin master # 首次推送,将推送目的默认为 origin 远端的 master 分支
git push # 默认推送
远端初始化本地仓库
在工作目录中
git clone 远端仓库的SSH
git push -u origin master # 首次推送,将推送目的默认为 origin 远端的 master 分支
git push # 默认推送
本地通用工作流
加入暂存 git add
提交入库 git commit -m "注释"
提交至远程仓库 git push
1 初始化仓库 init
进行 Git 的必要调节键是一个仓库(repository)。使用 本地创建/远端克隆 的方式初始化新的本地仓库。
git init # 在当前目录创建一个新的仓库
此时文件夹中新增 .git
文件,它是 Git 的仓库目录。
以下的其他命令来完成更复杂的操作:
git init 文件夹名 # 在当前目录下新建文件夹,并将新建文件夹目录作为空仓库
git init --bare 文件夹名 # 初始化裸仓库
git clone 远端SSH # 将远端仓库克隆到当前目录下
2 入缓存区 add
在仓库文件夹中的所有文件都可以进入缓存区,进入缓存区的文件被追踪(tracked),享受Git服务。
工作目录 → add
存入缓存区
git add . # 所有跟踪文件入缓存区,不删除文件
git add --all # 所有文件入缓存区,完全同步
git add -A # 上述代码缩写
git add * # 所有文件入缓存区,不过滤
git add *.后缀名 # 该后缀所有文件存入暂存区,不过滤
git add 文件名 # 该文件存入暂存区,多个文件用空格隔开
# 这个操作是没有反馈输出的
3 提交入库 commit
入库即进入提交历史区,成为某个分支的一部分。这部分的提交成为固定的历史版本。
缓存区 → commit
提交提交历史区
git commit -m "注释" # 缓存区快照成为新提交
git commit --amend -m "注释" # 缓存区快照覆盖上一个提交
可以在很多行 add
后形成一个快照,再进行一次 commit
全部提交。
每一次的修改想要提交的时候都需要 add
到暂存区,commit
只会提交存储在缓存区的快照。
分布式管理的优势就在于每一个不同的设备终端都能提交不同的分支项目版本,为实现这个功能,就需要引入远程仓库的概念。
一般我开发使用的远程仓库是 Github 或者 Gitee,这里用 Github 举例。
4 远端仓库
连接远端 remote add
连接远程仓库将自己的本地终端与远程仓库连接在一起,此时需要一个“钥匙”来进行确认,让远程仓库知道提交这个推送信息的是被允许的自己的本地终端,这个钥匙是 SSH key
。
关于远程仓库的创建与连接可以参考这一篇的中 环境配置-github建立仓库 的章节,不过对仓库的命名就没有那么严格的限制了。
仓库创建完成后,在 【Quick setup】 当中找到 【HTTP/SSH】 的选项,选择一项复制。
之后在本地仓库路径下打开终端:
git remote add origin 复制的SSH/HTTP # 连接本地仓库与远程仓库
# git remote add 别名 <server>
关于标识名称 origin
origin
是命名给仓库的别名,取任何名字都是可以的。
在 GitHub 中,默认的标识名是 origin,所以一般不做修改。
推送远端仓库 push
将本地仓库推送到远远仓库里 git 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是相同的。
cd 本地仓库路径 # 设定本地库工作区
git clone 复制的SSH/HTTP # 克隆远程库
此后,将会出现一个和远程库完全一致的本地仓库,再之后的修改与推送就和之前的没有什么区别了。
5 时间魔法 - 版本管理
git可以进行版本回溯的功能,这就是现代简明时间魔法
版本回溯也分为两个步骤: log
查找版本号 → reset
到之前版本
仓库状态 status/diff
在施放时间魔法之前,首先最好用 status
确认一下自己所在的时间坐标和状态,查看一下仓库中那些文件出现了变动,即缓存区和工作目录的区别。
使用 diff
确认文件中具体哪些细节出现了改动。
git status # 查看缓存区与工作目录的区别
git diff 文件名 # 查看文件的具体改动
其实也不是非要确认
提交日志 log/reflog
在回退之前,首先需要获取当时的坐标,即版本号。
直接调出提交日志,用 log
指令确认提交的具体信息。
调出分支日志,用 reflog
指令查看分支的信息。
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 ...
...
# 会出现所有的日志
git log 标记
git log -n 3 # 只显示最近的 3 个提交
git log --oneline # 每个提交显示压缩到一行
git log --stat # 被更改的文件及增删行数
git log -p # 显示全部差异,最详细视图
git log --author="作者" # 搜索指定作者的提交
git log --grep="信息" # 搜索匹配信息的提交
git log 始..末 # 搜索始末之间的提交,可以为提交 ID、分支、HEAD或任何一种引用
git log 文件 # 搜索包含特定文件的提交
git log --graph # 绘制辅助线
git reflog # 查看分支日志
git reflog --relative-date # 分支日志显示相对日期
输出
af9491b (HEAD -> master, origin/master) HEAD@{0}: commit: 修复bug
b9f49ac HEAD@{1}: commit: v1.0版本发布
3dc2f8f HEAD@{2}: commit: 补全cur格式
退回版本 reset
我们需要关注版本号的前几位,这个是我们使用的坐标。
使用 reset --hard 版本号
指令就可以将工作区重设到指定版本。
不加 --hard
时只重设缓存区,加上后重设工作目录,显示在文件夹中。
也可以用 HEAD 指针作为相对坐标,HEAD^
是倒数第二个,HEAD~3
是倒数第4个。
回退上一个版本的话,使用 reset --hard HEAD^
git reset --hard HEAD^ # 回退上个版本
git reset --hard HEAD~100 # 回退前100个版本
git reset --hard 687e # 退回特定版本 “优化存储结构”,写几位就可以了,不要太少就行
版本列表时按照时间线进行排序的,回退后指针向前移动,并不会创造出新的时间线
所以连续回退不会出现版本循环。
如果想要回到未来的版本,就用版本号的定位指针就可以了git reflog
查看指令的日志,这样即便退回以前的版本,也可以看到因回退而消失的未来版本
检出/切换 checkout
git checkout
用来在工作区中查看以前的版本,也用来切换分支。其更改 HEAD 指针的位置。
git checkout 版本号 # 工作区同步该版本号内容
git checkout 版本号 文件 # 文件同步至指定版本
git checkout 分支 # 切换工作分支
6 空间魔法 - 分支管理
Git的每次版本提交将会串成一条时间线,初始的分支被称作 master
主分支。在早期的版本中也会叫做 main
分支。
想进行更改尝试但是不想影响当前的开发进度时,就另开一条路,即分支。
分支创销 branch
用 branch 文件名
创建分支,不加分支名的时候是查看分支情况
使用 switch 分支名
可以切换分支
git branch # 查看分支,当前分支用 *标识
git branch 分支名 # 创建分支
git branch -d 分支名 # 删除分支名分支
切换分支 switch/checkout
git switch 分支名 # 切换分支
git switch -c 分支名 # 创建分支并切换到该分支
git checkout 分支名 # 切换分支
git checkout -b 分支名 # 创建分支并切换到该分支
合并分支 merge
使用 git merge 分支名
可以将分支名分支合并到当前的工作分支。
git switch master # 切换到主分支
git merge 分支名 # 将分支名分支合并到主分支(当前分支)当中
当分支成线性关系时,自动采用**快速向前合并(Fast-forward merge)**,这种合并方式不会产生冲突和新提交,直接移动指定分支的顶端。
非线性关系时只能采用**三路合并(3-way merge)**,这种合并方式使用两个分支的顶端提交和公共祖先提交这 3 个提交合并成一个新提交。这种情况需要手动解决冲突才能合并成功。
--no--ff 标记关闭快速向前合并,强制产生新提交
git merge --no-ff -m "说明" 分支名 # --no-ff关闭快速向前模式
该标记强制关闭快速向前提交模式,一定产生一个新提交,能保留被合并分支的信息。
分支策略
主分支被命名为 master
(旧版中为 main
)。主分支通常用来发布新版本,非常。
干活分支被命名为 dev
、feature
等。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-id 版本号很长且过于复杂,无法根据说明注释进行查找(说明注释可以完全相同甚至不写)。标签的存在就是给予提交一个便于管理的简单版本号。
直接用 git tag 标签
就可以给当前工作分支的最新提交打上标签。
用 git tag 标签 版本号
给指定提交打上标签。
比如在 master 分支上给最新提交打上 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 拉取 fetch
将远程库修改过的版本下载到本地的动作称为拉取。
pull = fetch + merge
git fetch 别名 分支
git merge 别名/分支
git fetch origin master # 拉取某库的某分支
# fetch拉取不会更改工作目录,只会变更本地提交历史区
git merge origin/master # 将该origin的master支与当前分支合并
直接用 git pull 别名 分支
git pull origin master # 从远程库拉取并合并
评论