今天学习的笔记内容是:
在实际开发中,随着新的需求以及新的Bug不断涌现,版本控制的概念是非常重要的,而版本控制工具使得我们可以追踪多个版本的开发和维护活动,其提供了版本管理的功能,可以存储、追踪文件的修改历史,我们可以浏览文件的变动历史,因此版本控制工具是开发中的必备工具之一。
版本控制工具一般可以分为两种:
CVS
和SVN
;Git
。分布式与集中式的最大区别在于开发者可以提交到本地,用户通过克隆就可以在本地机器上拷贝一个完整的仓库,而不必不必服务器端的软件支持。
而Git
就是一个开源的,分布式的,版本控制工具。
最初Git
是由Linus Torvalds为了帮助管理Linux内核开发而开发的版本控制工具。
Git的特点在于:
备注:
安装Git后,首先要做的就是设置用户名以及邮件地址,这是因为每次Git提交都会使用该用户的信息。
步骤如下:
git config --global user.name "名字"
git config --global user.email "邮箱"
git config --global user.name
和git config --global user.email
我们可以为一些指令设置别名,这样就不用每次使用时都得输入若干参数。
设置别名的步骤:
(1)、打开Git Bash
,执行语句:touch ~/.bashrc
,可创建.bashrc
文件。
(2)、在.bashrc
文件中,输入一下内容:
# 用于输入git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 用于输出当前目录所有文件以及基本信息
alias ll='ls -al'
(3)、最后一步,打开Git Bash,执行source ~/.bashrc
这样,当我们每次查看提交日志时,就不用在git log
后面添加一堆参数,直接输入快捷语句git-log
即可。
要使用Git对我们的代码进行版本控制,则必须获取本地仓库。
步骤如下:
git init
举个例子:
git-test
git init
备注:如果本地仓库创建成功,则可以在文件夹下看见隐藏的.git
目录
在Git工作目录下,文件一般会有四种状态:未跟踪,未暂存,已暂存还有已提交。这些状态随着我们执行Git命令而发生变化。
具体看下面示意图:
就是你在电脑里能看到的目录,也就是某个文件夹。
也就是存放在.git
目录下的index
文件中,即.git/index
。有时我们将暂存区称作索引。
在工作区下的隐藏目录.git
就是当前的版本库。
git status
git add 文件名
git add .
git commit -m "注释内容"
备注:
commit
需要信息使用单引号'
括起来commit
信息使用双引号"
括起来。git log
需要注意,该语句可以带有可选参数:
git log [--all] [--pretty=oneline] [abbrev-commit] [--graph]
各参数的作用如下:
--all
:显示所有分支;--pretty=oneline
:将提交信息显示为一行;abbrev-commit
:使输出的内容更加简短;--graph
:以图的形式显示。git reset --hard commitID
备注:使用git log
指令可以查看到commitID
git reflog
几乎所有版本控制系统都以某种形式支持分支。
使用意味着你可以从开发主线上分离开来进行重大Bug的修改,开发新功能等。一个分支代表一条独立的开发线,并不会影响主线的开发。
需要注意:在执行git init
时,默认情况下Git
就会为你创建master
分支。
git branch
git branch 分支名
git checkout 分支名
git checkout -b 分支名
git merge 分支名
git branch -d 分支名
git branch -D 分支名
为什么需要解决冲突?
当两个分支上对文件的修改存在冲突时,比如两个分支同时修改了同一文件中的同一行代码,此时Git无法判断应该怎么合并,这时候就需要手动解决该冲突问题。
步骤如下:
在开发中,一般可以有以下原则:
master
分支:属于生产分支,也就是主分支,可作为线上运行的应用对应分支。develop
分支:作为开发分支,一般用于开发部的主要开发分支,该分支会不断有新的feature
分支合并进来。当阶段开发完成后develop
分支将合并到master
分支上去,准备上线;feature/xxx
分支:该分支是从develop
分支上创建而来,用于并行开发,当任务完成后可合并到develop
分支上去;hotfix/xxx
分支:一般用于线上bug修复,修复完成后需要合并到 master
分支和develop
分支,合并完成后hotfix
分支可以删除;test
,预上线分支pre
等,具体应看公司规定。记录:
".git/objects"
目录下,包含了创建的各种对象及内容。git add
命令时,暂存区的目录树被更新,同时该文件的内容会被写入到对象库中的一个新的对象中,而该对象的ID
被记录在暂存区的文件索引中。git commit
时,暂存区的目录树将写入到版本库中的对象库object
,此时master
分支也会做相应的更新。git reset master
命令时,暂存区的目录树会被重写,被master
分支指向的目录树所替换,但是工作区不受影响。git checkout --
命令时,暂存区中指定的文件将替换工作区的文件。此时工作区未添加到暂存区中的改动将被清除。git checkout HEAD
命令,此时HEAD
指向的master
分支中的指定文件将替换暂存区和以及工作区中的文件。需要注意,这个操作将会清除工作区中未提交的改动,同时还会清除暂存区中未提交的改动,因此得慎用。对于Git来讲,仓库分为两种,一种是本地仓库,另一种是远程仓库。
之前讲过,Git不像SVN那样有个中央服务器,如果想通过Git来分享代码或者多人协同开发,则需要将开发文件放在一台公共服务器上,每个开发人员都能够连接得到。这也就是远程仓库。
从概念上讲,远程仓库是就是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。
一般我们都是借助互联网上的一些代码托管平台来搭建Git远程仓库。其中常用的有GitHub、Gitee以及GitLab等
下面简单介绍前两个网站:
由于本地Git仓库和远程仓库一般是通过SSH加密的。
因此我们需要配置SSH公钥,将个人公钥添加到远程服务端的配置文件中去。这样远程服务端就能辨别是否为本人操作。
首先我们需要查看C盘用户主目录中的.ssh
目录下是否有id_rsa
和id_rsa.pub
文件。如果有,则证明已经有了公钥,直接打开后复制获取就行。这两个文件就是SSH Key
的秘钥对,其中id_rsa
文件存储的是私钥,不能泄露,id_rsa.pub
文件存储的是公钥,可以放心地告诉任何人。
如果没有上述两个文件,则需要创建SSH Key公钥。步骤如下:
git bash
窗口ssh-keygen -t rsa
命令(用于生成公钥)可以注意到,如果公钥已经存在,此时执行上述语句后,新的公钥会进行自动覆盖。
创建公钥成功后,我们可以打开id_rsa.pub
文件来获取公钥,当然也可以在git bash
窗口下输入命令cat ~/.ssh/id_rsa.pub
用于打开id_rsa.pub
文件。
最后,在远程仓库里配置生成的公钥即可。
我们需要输入以下命令,用于告诉Git本地仓库,你所对应的远程仓库是哪一个?
git remote add origin 远程仓库地址
可以看到,在上述命令中,origin就是远程仓库的名字,一般默认下我们都会起这个名字用于代表远程库,这是一种习惯命名,当然你也可以起其他的名字。
而远程仓库地址可从远端服务器上获取。
在本地Git仓库中,我们可以查看添加的远程仓库有哪些。
git remote
如果想看到每个远程仓库的实际链接地址,我们可以加上-v
参数。
git remote -v
当我们将本地仓库和远程仓库关联后,就可以将本地仓库的内容推送(push)到远程仓库中去。
git push origin master
上述命令用于将本地仓库中的master
分支推送到远程仓库中的master
分支。
另外,为了可以简化推送命令,我们有时会加入--set-upstream
参数用于建立本地分支和远端分支的关联关系。
git push --set-upstream origin master
当关联关系建立好后,我们再次推送本地仓库到远程仓库的命令就可以简化许多,可以省略远端名和分支名。如下所示:
git push
即可。我们可以输入以下命令来查看本地分支与远程分支的关联关系。
git branch -vv
我们可以将远程仓库中的内容克隆到本地电脑中。
git clone <远程仓库地址> [本地目录]
可以注意到,上述命令中的[本地目录]
是可以省略的。
一般来说,对于克隆我们都是操作一遍即可。后续本地仓库需要获取远端仓库的更新,可以使用以下命令。
git fetch
执行完上述命令后,将抓取远程仓库中的所有更新分支。当然,我们也可以指定远程仓库的名字以及分支名进行抓取更新。如下所示:
git fetch origin [分支名]
需要注意到,当我们执行完抓取命令后,只是将远程仓库里的更新抓取到本地而已,不会进行合并。我们需要进行merge
操作来将分支合并到当前分支中。
git merge origin/master
git pull origin [分支名]
上述拉取命令用于将远程仓库中的更新拉取到本地仓库中并进行自动合并。
效果等同于fetch + merge
。
当然,如果你直接输入命令git pull
而没有指定远程仓库名和分支名,那么默认会抓取所有的更新并且合并。
好了,本篇笔记就到写这,欢迎大家到评论区一起讨论!