Git
前言
在项目开发的过程中,可能有的项目开发的时间周期很长,因此我们需要有一个工具对项目进行管理, 管理它的各个版本,以及保存每个版本的代码,也就是所谓的版本控制. 并且我们也需要一个工具来帮助我们进行团队协作,使我们更加高效的去开发项目.
试想一下,你如果想开发一个游戏,起初你搭好了一个框架,然后你又开发了两个模块,过了一段时间,你发现第二个模块不需要了,如果能够直接回滚到第一个模块然后再继续开发,那将非常方便,但是你如果想要在第二个版本的基础之上,一步步的把第二个模块给删干净,那又是非常痛苦的事情,如果每个版本都存到本地,注上标号,标明是哪一个版本,貌似也行,但是时间久了也过于麻烦,而且管理起来很不容易.
在试想一下,在开发的时候,如何能够让很多个小伙伴们分工合作,然后把成果再随时合并到一起,然后其他人又能快速的在最新的版本上继续进行工作?
无疑我们需要一个工具,这个工具接就是Git
. 开发它的人是Linux之父. Git
有很多命令,需要我们一一掌握,下面,就让我们看看每个命令是什么,以及它们存在的意义.
在熟悉命令之前,我们要对Git
建立一个宏观的意识,也就是说,我们要对Git
运作的框架有个大致的了解,Git
把每个需要管理的版本看成是一个节点,并且有一个HEAD指针指向最新的节点,当然也有命令可以让它指向其它的节点,因此,所有的版本整体看起来就像是一个树的结构.
还有三个概念就是工作区,暂存区,还有版本库的概念. 工作区可以理解为开发代码的一个车间,我么可以边开发,边保存,此时保存只是把暂时开发好的模块放到一边(也就是暂存区),当我们终于开发好了一个版本的时候,再把暂存区里面的所有东西运到版本库,也就是建立了一个新的节点. 其实这种做法也是可以想明白的,我们总不能只有工作区和版本库,因为这样的话,我们必须要把所有的东西全部做完才能进行保存,时间太长了,但我们又不能在进行一些很微小的操作之后就保存,因为微小的操作还不足以构成一个版本. 因此我们就需要一个暂存区,开发一部份,放到暂存区一部分,即使此时有失误,还可以从暂存区拉回来重新开发,不至于在版本库里增加一些不必要的版本.
Git基本命令
下面,就一起感受一下Git
的每个命令,以及它们的意义所在.
首先,我们需要创建一个Git
的名字,以及对应的邮箱.
git config --global user.name xxx
git config --global user.email xxx
然后,我们会发现,在家目录里面,会生成一个.gitconfig
文件,名字和邮箱就存在里面.
然后,我们就可以去开发项目,我们在一个文件夹里面存放我们的项目,因此,就需要先创建一个文件夹:
mkdir project
然后我们进入project
里面去. 使用命令:
git init
这样,一个普通的project
文件夹,就变成了一个Git
仓库了. 并且在project
里面会生成一个隐藏的.git
文件,里面包含了关于该仓库的所有信息.
此时我们就可以在project
里面干我们想干的事情了. 我们可以用以下命令来实时的查看状态:
git status
当我们写了些东西,想往暂存区里面放的时候,可以用如下命令:
git add <文件>
如果想把所有更改的文件全部放入暂存区,命令如下:
git add .
这个时候,就已经把更改放到了暂存区,如果我们已经做完了一个版本的工作,想把该版本放到版本库里面,那么可以用以下命令:
git commit -m "对此版本所做的说明"
这样的话,我们就提交了一个新的版本,版本库里也建立了一个新的节点,加上说明方便我们以后回忆.
当我们 git add
之后,如何撤回呢?操纵如下:
git restore --stage <提交到暂存区的文件>
并且,我们在更改了文件之后,可以查看更改的文件相对于暂存区的文件有哪些变化,代码如下:
git diff <更改的文件>
当我们想查看所处分支的所有历史版本的话,代码如下:
git log
此命令可以显示每个版本的时间,备注,以及作者,还有唯一的commit号. 当然也可以简洁的显示,命令如下:
git log --pretty=oneline
那么,在进行了若干个版本之后,我们该如何回溯呢?相关命令如下:
git reset --hard HEAD^ 或 git reset --hard HEAD~ // 回溯到上一个版本
git reset --hard HEAD^^ // 回滚两个版本
git reset --hard HEAD~100 // 回滚100个版本
git reset --hard 版本号 // 回滚到某一指定版本
我们还可以找到HEAD指针的所有历史记录,指令如下:
git reflog
如果我们想删掉工作区相对于暂存区的修改的话,命令如下:
git restore <修改的文件名>
仓库云端互联
以上操作,全部都是在本地完成,换句话说,暂时和”云“没有关系,但是我们只在本地开发的话,难免会出现一些问题,比如硬盘挂掉,服务器挂掉. 如果我们有一个云平台,使得该平台和本地之间能够产生联系,本地的代码可以传到云平台上,云平台的代码可以传回本地,那将再好不过!!
最火的平台就是Github
平台,国内的有码云等平台,
在代码托管平台里面,当我们注册玩账号,建立完项目之后,需要ssh密钥才能往git传文件.
我们在云端创建一个项目之后,需要把本地和云端关联起来,命令如下:
git remote add origin git@github.com: XXX/project.git
这样就把远程和本地联系起来了. 然后以下命令,就可以完成从本地复制到云端的完美操作. (-u 只是在初始关联仓库的时候加上, 后面直接就是 git push origin <某一分支名字>
把本地某一分支加到云端)
git push -u origin master
git push origin <某一分支名字> // 加某一分支
git push // 加当前分支
当然,我们也可以把云端的任何一个项目复制到本地,命令如下:
git clone git@github.com:xxx/project.git
分支操作
本地分支操作
下一步,我们就要考虑如何创建多分支以及进行相应操作了,创建一个新的分支命令如下:
git checkout -b dev
然后可以用如下命令查看我们正处于哪一个分支:
git branch
我们可以在任意分支之间来回切换,命令如下:
git checkout <某一分支名字>
也可以将某一分支合并到主分支,命令如下:
git merge <某一分支名字>
也可以删除某一分支,命令如下:
git branch -d <某一分支名字>
但是,当我们在某一个分支修改过某一个文件内容的时候,主分支也修改了该文件的内容,这时候合并的话就会有冲突,会提示以下代码,意味着我们需要手动解决冲突.
CONFLICT (content) : Merge conflict in <某文件>
Automatic merge failed; fix conflicts and then commit the result.
上传到云端
当我们在本地进行了一波开发之后,就可以把新的内容再一次的提交到云端,命令如下:
git push
我们也可以把本地的分支传到云端,第一次的时候要先输入如下命令:
git push --set-upstream origin <某一分支名字>
然后,后面只需要git push
就行了.
如果我们想要删除云端的某一分支的话,命令如下:
git push -d origin <某一分支名字>
我们当然也可以把云端的分支拉到本地来,命令如下
git checkout -b dev // 先创建一个分支
git branch --set-upstream-to=origin/dev(云端分支名) dev(本地分支名) // 最好名字一样
git pull // 把云端分支拉下来
我们可以在本地的任何一个分支合并云端的任何一个分支,当我们在本地某一分支的时候,用如下命令:
git pull origin <某一云端分支名字>
组合操作
组合操作一
下面的操作应该是用的比较多的一套操作,建一个分支,查看一下分支,切换到某分支,把该分支上传到云,然后再从云删除,然后切换到master主分支,然后删除刚刚创建的分支. (我们删除A分支,不能处在A分支中,要换到其它分支才行)
git checkout -b <某一分支名字> // 创建某一分支
git branch // 查看一下有哪些分支
git checkout <某一分支名字> // 切换到某一分支
git push -u origin <某一分支名字> // 把该分支上传到云端
git push -d origin <某一分支名字> // 把该分支从云端删除
git checkout master
git branch -d <某一分支名字> // 把该分支从本地删除
组合操作二
下面的操作算是一个重置操作,开发了一波之后,回复到最初接触到的版本.
也就是把所有暂存区的东西回复,此时暂存区啥也没有,第二个语句是恢复所有相对于暂存区的改变. 两个语句下来就相当于啥也没做.
git restore --stage .
git restore .
Stash
我们还可用如下命令把暂存区和工作区里面的命令放入一个栈中,命令如下:
git stash
git stash list // 查看栈中所有记录
git stash pop // 弹出