git版本管理工具、github平台学习记录

    前言;从事码农工作有一段时间了,与同事合作写代码,经常饱受修改合并等处理的麻烦,一直听说有git版本管理工具和github平台,不会使用这个就不是合格的码农,所以开始仔细的学一遍,以下是学习过程的笔记。

一.git能做什么

        编辑程序一个版本,每次修改的记录、修改的时间、修改人、历史修改、版本的回退等在多人合作的团队中处理不好会极大的降低工作效率,对此我是深有体会的,而git可以很大程度解决以上问题。

二、git的起源(好奇的可以看看)

        linux系统的发展过程中本来是使用商用的BitMover版本管理软件,但是由于版本等一些因素,该公司要收回免费授权,受到威胁的linus花了两周时间用C语言写了一个分布式版本管理控制系统,这既是git,随后git大火!

三、git分布式原理

        一个项目,再git上每一个人的电脑都保存有一份项目的镜像,每个人修改后,只有联网时候才会将修改部分推送给别人,即使你的电脑坏了也可以从别人那里拷贝过来。

四、git的安装使用

        git最早是Linux上面的开发的,后面陆陆续续移植到windows、unix、mac等上。

        不同的版本有不同的安装方法。

        首先是在Linux上面安装Git:

                1、查看是否已经安装git,在终端上输入git,

                        在Debian或者Ubantu系统中,可以通过sudo apt-get install git命令进行安装

                    如果是其他的Linux版本,通过源码安装,在官网GIt下载源码,解压,依次输入:

                        ./config        make         sudu make install 三个命令就可以了

        然后是Mac OS X上安装GIt(因为本人不在这上面开发,所以没去了解)

        最后是windows环境下的安装:

                   1、在Git官网下载安装程序,直接安装即可。

                    2、使用前的设置,开始菜单中找到"Git"->"Git Bash"

                            再命令窗口输入:git config --global user.name "Your Name"

                                                       git config --global user.email "[email protected]"

五、创建版本库(repository)

        作用:相当于一个目录,记录每个文件的修改删除,便于任何时刻追踪历史等。

        选一个合适的地方(随便你选哪个位置),创建空目录:

        mkdir learngit    //创建空文件夹

        cd lerngit           //进入文件夹

        pwd                    //显示当前目录路径

        *注意,如果是再window系统下,为了避免莫名其妙的错误,路径上不要有中文

        git init      //将该目录变成Git可以管理的仓库,此时文件下会多一个隐藏的.git文件

        *建议,文本编辑使用UTF-8编码,支持平台广泛。

        *警告,window环境下,禁止使用记事本便捷任何文本文件,会有一些奇怪问题,建议使用Notepad++(格式设置成UTF-8 without BOM)代替记事本。

            然后,在目录下写一个readme.txt 文件。

             用命令git add readme.txt 可以添加到仓库(要添加的文件必须放在learngit目录下或者子目录下,否则找不到)

            第二步,使用git commit告诉git,把文件提交到仓库

              git commit -m  "wrote a readme file"  // -m 后面是本次提交说明,可以输入任意内容

           git add是添加文件,git commit 可以一次提交多个文件。


六、状态查询

        当你一段时间没工作了,回来工作如何知道上一次做了什么修改,有什么提交呢?

        这需要使用命令git status与git diff两个。

        git status 可以查询仓库当前状态,是否有修改,是否有提交

        git diff可以查询我们修改的具体情况。

        提交后,git status,会显示无任何修改。

        修改add未提交commit,会显示有修改,使用diff会有具体修改显示


七、版本回退

    命令git log,查询由近到远的历史提交记录

    git log --pretty=oneline可以去除一些多余信息,页面看起来简单点

    当前版本HEAD,上一个HEAD^,上上个HEAD^^,往上100个HEAD~100

    git reset --hard HEAD^

    如果后悔了,想要再返回未来版本需要指定版本号返回:

    git reset --hard commit_id

    版本号可以使用git reflog命令查询


八、工作区和暂存区

        电脑中能看到的目录,比如learngit就是一个工作区

        版本库repository,隐藏目录.git,存有很多中西,最终啊哟的是stage(又被称为index)暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。

    我们使用git add命令时候,是把文件修改添加到暂存区stage中,第二步commit是把暂存区的所有内容提交到当前的分支。

    我们创建Git版本库的时候,就自动创建唯一一个master分支,所以commit就是在master上提交更改。

九、管理修改

       git比其它版本管理工具相对优秀的地方在于,它记录的是修改,管理的是修改,不是整个文件。

        查看工作区与版本库里面最新版本的区别:

        git diff HEAD -- readme.txt

十、撤销修改

        人总是会犯错误,晚一些了什么不好的东西,想回退一下。

        使用命令git checkout -- readme.txt

        一种情况,修改了,还没add,使用命令后会返回到和版本库一样的状态

        第二种,修改了,add了,又修改了,会退到暂存区的状态。

        总之,是回到最近一次git commit 或者 git add的状态。


        如果,你写了奇怪的东西并且add了,你可能需要撤销暂存区到工作区,

        使用git reset HEAD file,把修改退回工作区,此时状态是工作区有修改,暂存区是干净的。

        然后再使用上上个命令去掉工作区的修改即可。


        如果你把写了奇怪的话add到暂存区了,然后commit提交到版本库了,可以使用前面所说的版本回退,当然这是在推送到到远程前有效果,如果你的版本库推送出去了,那就惨了,删不掉了。

        

十一、删除文件

           删除 也是修改,按上述操作即可。

十二、git 杀手级功能:远程仓库

        在github上可以创建远程仓库。

        第一步,创建ssh key,在用户主目录下如果有id_rsa和id_rsa.pub两个文件,说明有了,如果没有那么打开Shell(Windows下打开Git Bash),创建ssh key:

            ssh-keygen -t rsa -C "[email protected]"

            然后一路回车默认值。这两个文件一个是私钥一个是公钥,在github自己的中账户里面,添加上自己的公钥即可。

        在本地运行命令,把本地仓库与远程仓库关联起来:

        git remote add origin [email protected]:michaelliao/learngit.git

           origin 是远程库默认名字,后面的michaelliao就是你们自己github的名字。

        下一步是把本地库推送上去:

        git push -u origin master

        远程库是空的,第一次推送master分支时,加上-u参数,git不但把本地master分支推送到远程新的master分支,还把本地的master分支和远程的master的分支关联起来,以后的推送就可以简化命令。

        然后就一样了。

        之后,只要本地做了提交就可以通过命令git push origin master进行推送。

十三、分支功能

        分支功能。。。这么说的吧啊,让你更好工作,工作完后就可以合并上去了。

注意概念:分支,当前分支,指针,再git中,HEAD指针指向的分支为当前分支,所有提交都是提交到当前分支。

一般来讲,git中存在一个主分支,命名为master指针,它指向的为主分支,而HEAD一般指向master指针

创建分支可以使用git branch dev,即创建一个指针dev指向当前分支,但是如果再提交,还是添加新节点,但是master指针会移动指向,dev不会动,因为它不是当前分支,所以,一般创建分支时候使用-b参数,创建的同时将当前分支HEAD指向新的分支。

        创建分支 git branch <name>

创建分支并切换当前分支 git check -b dev  //创建一个指针dev(分支),-b表示把HEAD指针指向dev,表示当前分支切换到dev

查看分支 git branch     //罗列所有分支,当前分支有*标记

切换分支 git checkout master //切换当前分支到主分支

合并某分支到当前分支git merge <name> ,一般是当前分支指向指定分支

删除分支 git branch -d <name>

十四、关于分支合并冲突

现在这么一种情况,我新建一个分支在0号位,并且做了修改并且提交了,新的分支移动到了1号位,

然后我将当前分支切换到主分支(0号位),然后做修改提交,当前分支和主分支将移动到2号位置,

现在1号位的分支和2号位的主分支有不同的修改,这个时候他们的合并处理就要复杂点。

使用命令git merge 1分支,时候会提示修改冲突,需要处理。

使用git status 也会有提示有冲突

需要手动修改文件,可以将两个分支不同之处进行修改为相同,再提交就合并了。


十五、分支管理策略

    经过前面的学习我们都知道,在分支上进行修改的时候,到合并的主分支的过程中,是master指针直接移动到修改分支dev,并将当前分支指针HEAD挪移到master上,最后将dev指针删除,这个操作是移动指针的过程速度很快,但是会将历史分支dev指针删除,会遗漏一些信息。这种merge合并方式不是很完善,同时,我们称之为Fast forward模式。

    如果我们想保留分支存在的信息,我们可以禁止使用fast forward模式,这时会生成一个新的commit,这样分支的信息会得到保留。

    例子:

    创建并且切换到分支dev

    git branch -b dev,

    修改文件,add,commit,

    切换回master

    git checkout master

    现在合并分支,但是不适用ff模式

    git merge --no-ff -m "merger with no-ff" dev  //因为创建新的commit,所以添加注释-m “。。。”


    注意:实际开发中,master版本一般作为发布版本,稳定版,开发一般在各自的分支dev上进行,一般完成后就合并到主分支中去。

十六、bug分支

        如果临时有bug出现,需要新开一个分支进行处理,但是此时工作台和暂存区还有修改内容未add或者提交占用了工作台,盲目切换回master创建新的bug分支会受到干扰,所以可以使用git stash进行存储。

    在处理完bug分支合并后,可以切换回之前的工作分区,但是此时工作台暂存区是干净的,需要调出之前存储的内容,需要时使用git stash list查看,保存的内容,

    使用git stash apply恢复,使用git stash srop来删除保存记录,

    或者直接使用git stash pop,恢复的同事删除存储的内容。

十七、feature分支

        有一些新功能的开发用于歼星炮的设计,我们也可以使用分支,

        git checkout -b feature-fireearth

        10秒后开发完毕,add,commit

        切回dev,此时经费不足,准备取消该功能,

        git branch -d feature-fireearth

        提示删除失败,该分支没有合并,删除后会永久丢失信息,可以使用-D强行删除

        git branch -D feature-fireearth

十八、多人协作

    远程库一半多人开发,会有多个提交,自己的开发可能落后远程库当前的版本,需要先从远程版本库下载合并,再推送上去。

    相关命令:

        git remote //查看远程库信息 ,一般显示远程库名字,默认origin

        git remote -v //额外显示抓取与推送的origin地址

        现在,在本地库上开发一个分支,想要把它推送到远程,

                一般来说,分支分为master、dev、bug分支三种,

                master分支需要时刻与远程同步

                dev是开发分支,团队成员都需要在上面工作,所以也需要同步

                bug分支用于在本地修复bug没必要推送到远程了

                feature分支是否推送,取决于你是否是与小伙伴合作开发,不然这个就自己藏起来玩。

                

                假设其它人协作开发,先是clone下分支,git clone “推送获取地址”,可以获得分支

                但是默认情况下本地只能看到master分支,需要将远程的dev分支关联起来,

                使用命令git checkout -b dev origin/dev  //创建远程的dev到本地,然后就可以在dev上修改,然后时不时的推送dev分支即可。

                但是有时候会出现推送失败的情况,那是因为有其他的合作开发者修改了推送了,与自己的冲突,那就只能先把其他人推送的修改抓取下来进行合并再继续推送。

                抓取命令 git pull,或者先进行本地远程分支连接,git branch --set-upstream dev origin/dev

然后再git pull,本地解决了合并冲突后再推送。


十九、打上标记快照tag

        想给当前master定义一个标签,

        git branch查看分支,如果不在主分支上则切换,git checkout master

        git tag v1.0


猜你喜欢

转载自blog.csdn.net/CWY_007/article/details/79798718