本文先结合版本控制系统对git进行了简要介绍,再详细讲述了github注册使用教程和git安装使用教程,希望对和楼主一样的小白有所帮助。
现代软件开发过程中离不开版本控制系统,版本控制系统可以存储、追踪目录(文件夹)和文件的修改历史,是提高开发效率的利器。目前常见的版本控制系统有git和svn,git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制系统。它和svn的最主要区别为git是分布式版本控制系统,所以 git 支持离线工作,在本地可以进行很多操作。而 SVN是集中式的版本控制系统, 必须联网才能正常提交和更新代码。
github是用于版本控制和协作的代码托管平台,它可以让您和其他人在任何地方协同工作。github可以作为git版本库的托管平台,开发时使用git和github双剑合璧,效率最佳。
a.访问github官网 https://github.com/ 点击sign up 进行账户注册
b.输入用户名、邮箱、密码、验证身份最后创建账户。
c.跳过欢迎截面以后提示需要进行邮箱验证,使用注册邮箱进行验证即可,验证结束以后就可以愉快的使用github啦,如果是新人建议先学习一下使用教程。
d.学习教程中有教大家怎么创建仓库,一般每一个项目都有一个仓库。如果觉得看教程麻烦,也可以按照下面流程自己试着建一个仓库练习。首先在个人中心你的仓库中可以看到用户的所有仓库。
可以看到我这里还没有任何仓库,点击new新建仓库。
输入仓库名称、描述、选择公开或者私有、可以选择是否添加README等文件,README是对仓库(项目)的描述文件,其他人可以通过它了解项目。
在code区域可以看到仓库包含的所有文件,在设置区域可以给仓库重命名或者删除仓库等
a.进入官网 https://git-scm.com/downloads,下载git ,下载时选择windows中的安装包。并根据电脑windows版本选择32位或者64位的安装包,我这里下载的是64位的。
b.打开下载好的安装包,进行git安装,安装时按照图片勾选对应项即可。
c.安装完成以后可以在已安装程序中查看到git bash等软件,点击可以进入bash界面进行操作,输入 git --version命令即可查看git版本。
linux系统安装git更为方便,以常见的ubuntu系统和centos系统为例,只要打开linux终端,在命令行输入以下命令即可:
ubuntu系统:sudo apt install git
centos系统:yum install git
安装完成以后同样输入git --version命令即可查看安装版本
使用git之前首先要了解git的工作流,git工作流包括本地文件、暂存区、本地仓库和远程仓库四个节点。用户可以在工作区进行文件新建、删除和修改等操作,操作完毕以后可以将变动文件add到暂存区,然后commit到本地仓库,截止目前的操作都可以没有网络的情况下进行。最后可以将本地仓库版本push到远程仓库,远程仓库使用github进行管理,这一步需要网络。
注:所有命令在windows的git bash程序或者linux命令行中都适用。
git config --global user.name "username"
git config --global user.email "email"
设置完成以后可以通过以下命令查看设置是否成功,可以看到自己的用户名和邮箱
git config -l
初始化本地仓库的方法有两种,下面一一介绍。
方法一:首先将工作目录切换至要通过git管理的文件夹中,输入以下命令进行仓库初始化,初始化后可以看到文件夹中多出了.git文件夹,该目录包含了资源的所有元数据。
git init
接着将文件夹中需要版本控制的文件添加到暂存区,常见命令如下:
git add . //添加所有文件
git add *.cpp //添加所有cpp文件
git add filename //添加指定文件
最后将暂存区的文件提交到本地仓库,常见命令如下,commit message为本次提交内容的说明,至此完成了仓库的初始化工作。
git commit -m "commit message"
方法二:从现有仓库克隆:我们可以直接克隆现有的仓库,在第二部分github中我们已经学习了怎么样创建仓库,接下来可以练习克隆该仓库到本地。
首先登录github,找到我们创建的仓库,点击code,可以发现仓库有https和ssh两种地址。
若使用https地址,则以后每次从本地仓库向远程仓库提交代码时,都要输入github用户名和密码。使用ssh方式登录时,则只需通过配置公私密钥,便可以在向远程仓库提交时不输入用户名和密码。推荐ssh地址,克隆命令如下,后半部分是ssh地址。
git clone git@github.com:wyl-sjx/hello-word.git
创建好本地仓库以后,便可以设置对应的远程仓库地址。使用上一步方法二克隆创建的本地仓库路径已经自动设置,方法一创建的还需要设置。
首先通过以下命令添加远程仓库路径,仍然使用ssh路径:
git remote add origin git@github.com:wyl-sjx/hello-word.git
添加成功后可以通过 git remote -v 查看到设置的路径:
如果后面要修改远程仓库地址,则只需要通过以下命令删除现有地址,然后重新设置即可
git remote rm origin
设置好远程仓库地址后,在正式使用之前,需要针对ssh地址设置密钥,这样以后每次向远程仓库提交代码就像https方式那样输入账号密码了。首先切换到用户目录的.ssh文件夹下,查看是否存在公钥文件id_rsa.pub和私钥文件id_rsa。
cd ~/.ssh //切换目录
ls //查看所有文件
若不存在则创建公私钥,命令如下,email输入自己的邮箱地址就行,这儿的email地址没有什么实际用处。从命令本身来说,-C只是给产生的秘钥对加了一个注释。执行命令时需要用户交互,只用一直回车采用默认项即可。
ssh-keygen -t rsa -C "email"
此时在~/.ssh目录下可以看到生成的两个文件,通过以下命令打开公钥文件并复制所有内容。
cat ~/.ssh/id_rsa.pub
登录github,在个人中心点击设置,找到ssh and gpg keys,新建一个sshkey
输入名称,将前面复制的所有公钥内容都粘贴到key中,最后add ssh key,完成添加。
万事具备,正式开工。接下来用户就可以在本地工作区进行文件的增加、删除和修改等操作了。在工作区进行文件修改以后,可以通过以下命令查看工作区和暂存区的不同:
git diff
找到不同(新增、删除或者修改)的文件以后可以通过git add将该文件添加到暂存区
git add -A 提交所有变化
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
在本地修改文件的过程中,我们可能发现修改错误想要撤销,这是git restore命令可以帮助我们。git restore --stage 命令不会撤销文件修改,并且如果文件已经add到暂存区,则会从暂存区移除,不进行版本控制。git restore 不会移动文件位置,但是会撤销修改。
git restore --stage <file>
git restore <file>
然后通过git commit将暂存区文件提交到本地仓库
git commit -m "commit message"
在文件从工作区到暂存区到本地仓库的过程中还可以通过git status查看文件状态
git status
//文件状态有以下几种
Untracked files //表示只在工作区有的file(文件或文件夹),也就是在暂时区没有该file。
Changes to be committed //表示文件已经从工作区add到暂存区
Changes not staged for commit //表示工作区,暂时区都存在的file(文件或文件夹),在工作区进行修改或删除,但是没有add到暂存区
可以通过git log命令查看过去commit的历史
git log //所有提交信息,包括提交id
git log --author 'wupx' //指定作者的提交
如果commit以后发现代码出错,可以通过git reset回退到某个版本。
// 切换到最新提交的代码版本
git reset HEAD
git reset HEAD -- filename # for a specific file
// 切换到最新提交之前的代码版本
git reset HEAD^ -- filename
git reset HEAD^ -- filename # for a specific file
// 切换回3或5次提交
git reset HEAD~3 -- filename
git reset HEAD~3 -- filename # for a specific file
git reset HEAD~5 -- filename
git reset HEAD~5 -- filename # for a specific file
// 切换回特定的提交,其中 0766c053 为提交 ID
git reset 0766c053 -- filename
git reset 0766c053 -- filename # for a specific file
// 强制回退,会让你本地的修改都消失
git reset --hard 0766c053
需要注意的是git reset有三种模式。默认是mix模式,还有soft模式和hard模式。区别如下:
–hard:重置版本位置的同时,直接将工作区、 暂存区及 本地仓库 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
–soft:重置位置的同时,保留工作区、 暂存区及的内容,只让本地仓库中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入暂存区中(Staged files)。所以效果看起来就是工作区的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
–mixed(默认):重置位置的同时,只保留工作区的內容,但会将暂存区 和 本地仓库中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入工作区中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
更多详细区别可以看看这篇文章:https://www.jianshu.com/p/c2ec5f06cf1a 写得很不错。
最后提交到本地仓库的代码可以通过 git push <远程主机名> <本地分支名> <远程分支名> 命令推送到远程仓库,关于分支见后面描述,一般命令格式如下:
git push origin master
git有分支的概念,一般我们初始化一个仓库时,会创建一个master分支。我们也可以自己创建分支创建命令如下:
git branch name
上一节在git中讲到的commit提交命令。每一次commit以后都会有一个对象和提交对应,提交对象按照时间顺序组成链表,分支指向某一个提交对象,示意图如下所示。刚刚创建testing分支时,两个分支master和testing都指向了同一个提交对象:
那么如何知道当前工作分支是那一个呢?git定义了一个HEAD指针,它指向那个分支,说明工作分支是那一个,如下图所示:
可以通过git checkout 命令切换到testing分支,命令如下,切换后示意图如下。
git checkout testing
那么分支有什么作用呢?实际项目中的分支使用情景如下:
1.master分支一般是不能直接修改的。
2.用户针对具体业务需求要撰写或者修改代码时需要新建分支,并在该分支工作。
3.完成修改以后可以切换回到主分支,将修改分支和主分支合并即可。
比如下图中有三个分支,master 分支、hotfix分支和iss53分支。用户在hofix分支和iss53分支新建后进行了代码修改并且commit所以,现在他们都指向了不同的提交对象。
hotfix分支修改完成可以切换到master分支并进行合并了,命令如下,注意进行分支切换之前一定要保证本分支所有修改已经提交了,因为切换分支以后工作区也会随之变动:
git checkout master
git merge hotfix
若之后iss53分支又进行了改动提交,然后切换到主分支进行合并,最后结果示意图如下。
合并后的hootfix 分支和iss53分支已经不需要了可以进行删除。
git branch -d hotfix
git branch -d iss53
此外可以通过git branch命令查看到所有分支
// 查看所有本地分支
git branch
若在合并过程中,两个分支都对同一个文件进行了修改,此时就会发生冲突。可以通过git status命令查看冲突的文件,此时它们处于(unmerged)状态。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动修改解决冲突,最后add、commit后切换分支重新merge。