前言
这是一个关于Git的小文章。
Git是什么?Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。参照:关于GIT开发的背景故事
GIT的概念
代码存放的3个地方:
- Workspace: 工作区,就是你平时存放项目代码的地方
- Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
一般的代码的标识:
- Branch:代码分支,代码的一个历史的路径。
- Tag:代码标签,记录一个特点版本的代码。
- commitId:每个版本的代码都有唯一的40位的哈希值
- HEAD:指向当前代码的版本的指针。
无脑日常操作:
git add
:将文件注册到git仓库中,对每个文件都会得到一个objectId,使其被git监控git commit
:将当前所有的文件版本进行提交,生成一个代码版本commitIdgit push
:将当前的版本提交至Remote中,这样就可以和其他人共享代码
远程GIT的设置
Git仓库,一般来说都是维护在github或gitlab上面。当然,由于本身git属于分布式的版本管理,那这含义就是每个人都会拥有全部的一个仓库,所以本地的一些文件也是可以用git来进行版本控制,只不过对于大文件的版本控制,git会相对比较吃力,这主要和git本地的版本控制原理有关。
初始化github仓库时,会有下面的2个文本:
…or create a new repository on the command line
echo "# demo" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:artikell/demo.git
git push -u origin main
…or push an existing repository from the command line
git remote add origin git@github.com:artikell/demo.git
git branch -M main
git push -u origin main
这2个操作的区别就是在于:当前本地是否已经存在仓库?
那么可见,新建仓库的操作就是:
git init
git add README.md
git commit -m "first commit"
当然,这2个操作的共性代码可见就是:
git remote add origin git@github.com:artikell/demo.git
git push -u origin main
这个操作的含义就是注册远程地址:把仓库注册一个叫origin
远程链接,然后再push到origin中。
原有的master由于政治正确被改成了main了。
而,其中github中的注册远程本身也有讲究:HTTPS or SSH?
无脑的判断就是:懒否?不想每次push输入密码(当然https也可以存储密码),那就使用SSH吧。但SSH密钥对的公钥上传至服务器。
而https则可以用在公用服务器上面,这样2个人可以互相使用自己的账号进行提交。
简单GIT的设置
每次提交都是自己的劳动,必须带上自己的名字,所以,我们需要告诉git我们叫什么!
$ git config --global user.name "iamstarlee"
$ git config --global user.email "iamstarlee@yeah.net"
其中,--global
的含义就是是否对当前用户生效,如果对系统生效是--system
,对仓库生效则是--local
,这样就可以对仓库的提交人进行不同的设置。
然后,为了偷懒,我们肯定还需要设置SSH秘钥。那么,我们就需要看看,现在有没有秘钥?正常的linux系统,大部分的配置都是在用户目录(~/
)下面,所以,我们只需要cat命令查看一下即可。
cat ~/.ssh/id_rsa.pub
如果报了No such file or directory
错误,那就说明不存在,那就需要生成一个秘钥。简简单单一个命令:
ssh-keygen -t rsa -C "iamstarlee@yeah.net"
然后一路回车。最后再使用cat
命令查询。
而后,把文件的内容复制到https://github.com/settings/ssh/new的KEY文本框中。
最终,优秀的你,就可以使用ssh进行提交代码啦。
当然如果秘钥已经被其他用户使用,也是会出现异常的。
GIT工作流
如何使用git会更标准呢?这就要说道git本身的分支控制。
git branch <feature_name>
git checkout <feature_name>
git merge <feater_name>
以上操作分别是:创建分支、切换分支、合并分支。
而在正常的仓库版本里面,可以分为3类分支:
- master主分支,维护正常可用的分支
- feature功能分支,对每个功能进行开发的分支
- hotfix修复分支,对功能进行修复的分支。
一般的开发流程是由开发人员在feature分支中进行开发,最终merge到主分支中。而在出现线上异常时,则从master中新建hotfix分支,修复后直接合并master分支。
而,对于特殊的master主分支版本,则会通过git tag
来进行标记,这样就可以快速定位到相关版本的代码,这也是很多开源项目版本发布的基础。
这里面,就会涉及到分支的差异查看,就是git diff
命令。这有空可以再讲。
日常GIT的问题
- 有些文件不想提交怎么办?
答:根目录下面新增一个.gitignore
文件,然后写上你不喜欢的文件或文件夹即可。类似画个圈圈诅咒它。 git add
了,但是又不想提交了怎么办?
答:git reset HEAD <file>
,使用git reset
命令来将文件从暂存区移除。git commit
了,但是提交错了,怎么办?
答:还是git reset
命令。git reset --soft HEAD^
,其中的--soft
表示不撤销add
操作,而如果想一路撤回完,那就使用git reset --hard HEAD^
。HEAD^
表示当前版本的前一个版本,有多少个^
表示前多少个版本。- 如果都push到远程仓库了。那可怎么办?
答一:最好用但是最不能用的方法就是git push -f
,先git reset
回滚至对应的版本,然后强制把当前的master提交给远程。(但是,这个操作会引发版本的丢失,故一般不用)
答二:只能再将代码手动回滚,然后提交新的版本。