Git使用场景总结

作者: 冰三尺 | 来源:发表于2016-12-08 22:46 被阅读174次
    屏幕快照 2016-12-12 上午10.26.20.png

    当我第一次使用git的时候,我的内心是拒绝的。第一次合并代码的时候,各种冲突搞的我焦头烂额,但是当熟悉使用git之后,觉得已经离不开它了,git真是是一个工作的好帮手。

    关于git的介绍,配置,使用,下面的这两份教程讲的也很详细,git其实内容很多,很强大,而我们平时工作中用于管理代码只是使用了很少的一部分功能。

    如果你对git还不熟悉,看完这两份教程,对git会有一个全面的了解,但是如何在具体的工作场景中使用可能还不知如何下手,我自己总结了平时工作中常用的命令,以及使用场景,分享一下。
    <a href= "http://git.oschina.net/progit/" title="Yahoo Search"> Pro Git(中文版) </a>
    <a href= "http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000" title="Yahoo Search"> Git 入门教程 </a>

    场景一:当新建一个仓库,如何把仓库和本地建立起链接。

    这里我以码云为例,当你在码云新建一个仓库之后。码云上会给你提供仓库的地址,会有两个地址HTTPS和SSH,github也是一样的。
    关于密钥的配置这里就不说了,我只记录一些命令行的使用。

    第一步:添加远程仓库地址

    git remote add origin git@github.com:JasonSparrow/BeautyImage.git
    

    当你执行完这个命令可能会报错remote origin already exists,意思就是你添加的这个origin已经存在,此时需要执行git remote remove origin,移除origin,然后再次执行git remote add origin git@github.com:JasonSparrow/BeautyImage.git,这样就成功了。

    第二步:把本地的工程push到远程的仓库。
    先执行

    git push -u origin master
    

    如果报错,则使用 git pull origin master, 把远程的先同步到本地,再次使用git push -u origin master即可

    屏幕快照 2016-12-08 下午11.19.52.png

    如果看到这个内容,那你就成功的把本地的内容push到远端了。

    场景二:分支创建与合并

    git branch 分支名 //创建一个新的分支
    git checkout 分支名   //切换分支
    

    以上两步等同于

    git checkout -b 分支名  //新建分支,并切换过去
    

    把新建的分支push到远端

    git push origin 分支名
    

    这样你的同事就可以看到你新建的分支了,此时你的同事就可以把这个远端的分支拉取到本地。对于你和同事来说,你们两个人此时都有一个名称相同的本地分支,假设分支名称为1.0.0。

    对于git的分布式版本管理来说,它是鼓励你多建分支。因为1.0.0是大家共有的一个分支,它所负责的功能就是我们把1.0.0分支的修改拉取到本地与本地的合并,然后,再把合并好的1.0.0在推到远端。每次在1.0.0上执行pull,merge ,push操作时,我们每一个开发者都必须保证1.0.0是完全正确的,因为你的修改会影响到你的同事,如果你这边合并代码之后,把他推到了远端,你的同事又把代码拉取到本地,此时发现代码不能运行了,而别人还要等待你把错误的代码修改好,再次拉取正确的代码才能工作。这样就会影响其他人工作。

    所以,不建议直接在大家共有的1.0.0上直接进行代码修改,而是大家都基于1.0.0分支各自再新建一个属于自己的本地分支,假设同事A可以新建一个a_1.0.0,同事B可以新建一个b_1.0.0,我们每次只在自己的本地分支上修改,而不去修改大家共有的1.0.0,当我们把在本地分支上完成了本次修改,此时与1.0.0合并。然后push到远端的仓库。这样做并不能避免出错,只不过是减少了出错的概率。

    分支修改与合并

    1、分支提交
    对于我们开发某一个比较复杂的功能,也许不能一次把所有的功能都开发完,此时可以把一个功能拆分为不同的几个小的功能。每完成一个小的功能我们就执行一次提交,同多建分支一样,我们也应该多次提交,这样做方便与日后查看每次的提交内容与某次提交出错恢复在某次正确的提交。后面会讲到。千万不要一下子修改了几百个文件一下提交。这样做如果出错,对于自己和其他同事来说都是灾难。
    提交文件

    git  add  文件名//把修改的文件提交到暂存区
    git commit  -m  "填写你提交的日志"//把暂存区的内容提交到仓库
    

    git add是提交单个文件,如果想一次提交所有文件可使用git add .,这样就一次提交了所有的修改文件。如果想撤销本次的add 文件可使用git reset HEAD 文件名, 撤销添加到暂存区的文件

    另外再次说一个概念,对于刚接触git的同学来说,可能对于添加这个概念会有所误解。因为git每次保存的是你添加的内容的一个指针,或者说你修改的一个指针。如果你新建文件,这个叫做添加了文件或者修改了文件,你删除了了文件这也叫添加了文件,删除也是一种添加。

    2、分支合并

    工作中分支合并分为两种情况

    1、把另外一个分支合并到当前分支
    2、把当前分支合并到另外一个分支
    

    两者的区别在于是否把当前的分支当做最终的合并后的版本。

    假如现在本地有两个分支1.0.0和a_1.0.0两个分支。我们在a_1.0.0分支上开发新的功能,提交修改到仓库。此时需要把a_1.0.0分支合并到1.0.0分支。首先先使用git checkout branch切换到1.0.0分支,然后执行git merge a_1.0.0命令,就把a_1.0.0分支合并到1.0.0分支了。如果没有冲突的,此时你就完成了本次合并。这种方式就是第一种合并方式,把另外一个分支合并到当前分支。

    关于第二种合并方式,把当前分支合并到另外一个分支,我没有用过终端命令,只在xcode自带的版本管理操作过。xcode里面执行merge from就是把一个分支合并到当前分支,执行merge into就是把当前分支合并到另外一个分支。

    场景三:回退到某次提交

    1.穿越,回到过去

    比如说你修改了某些文件,但是中途发现这样修改不好,想要重新设计,对于此时来说,我们需要回到我们想要回到的那次修改的地方。也许有的人会觉得,我记住每次修改的内容,把修改的删除不就可以了吗,如果你记忆力非常好,那没问题。但是如果修改的还有storyboard文件,如果修改的东西比较多,你能确保完全记得住,好记性不如一个烂笔头。git 就是一个烂笔头。
    首先在终端里面输入git log, 会打印出最近的一些提交记录,这也是为甚说要多次提交,这也便于我们进行回退。

    wangtengfeideMacBook-Pro:EasyMother Jason$ git log
    commit 415f5d328fc73cf86dfad61fb423fdf61ff6541a
    Author: 小飞hub <2678199009@qq.com>
    Date:   Thu Dec 8 18:09:22 2016 +0800
    
        修改背景颜色
    
    commit 1e44117e056517d14a1f5aceaf2e78269179e6ea
    Author: 小飞hub <2678199009@qq.com>
    Date:   Thu Dec 8 17:27:21 2016 +0800
    
        修改找月嫂背景颜色
    
    commit 2292b7cfe68311ff3230d66eb9ada86b2f23e472
    Author: 小飞hub <2678199009@qq.com>
    Date:   Thu Dec 8 17:23:19 2016 +0800
    
        去除月嫂说
    
    commit 039be98fe4e26f4c0ce603abf97ea64a4d8a6932
    Author: 小飞hub <2678199009@qq.com>
    Date:   Thu Dec 8 17:18:40 2016 +0800
    
        修改版本号
    
    commit 4d30dd1f7a7bb7074822fd1f4c534f5ef86abfb6
    Author: 小飞hub <2678199009@qq.com>
    Date:   Thu Dec 8 10:42:21 2016 +0800
    
        提问专区:标题改为选择性填写(不强制填写)
    
    commit 11a3adb47133959bce7ac6c7d612aa19046611be
    

    假如此时我们想回退到修改版本号的地方git reset --hard 提交标记

    回到修改版本号,如下所示

    wangtengfeideMacBook-Pro:EasyMother Jason$ git reset --hard 039be98fe4e26f4c0ce603abf97ea64a4d8a6932 //修改版本号
    

    然后就可以回退到修改版本号的地方,但此时在修改版本号以后的所有提交内容也同样会被清除掉。使用此命令需小心。

    2.重返未来

    重返未来和回到过去正好相反,前者回到以前的某次提交,后者是回到未来的某次提交。
    刚才说到,执行git reset --hard 提交标记命令,会把这次提交之后的所有提交都会清除掉。假如你不消息误操作执行了这个命令,发现自己辛辛苦苦的工作一下都白费了,要回到你当前提交版本的未来的某次提交(前提条件是你执行了git reset --hard 提交标记,要不然,也不会有未来的提交)
    首先在终端输入git reflog
    会打印出你最近操作的所欲的提交,合并等的记录,如下(我只粘贴了一部分)

    wangtengfeideMacBook-Pro:EasyMother Jason$ git reflog
    c23f857 HEAD@{0}: reset: moving to c23f857
    072c19b HEAD@{1}: reset: moving to 072c19bd6612ac680d7238ea3b593f279d54053f
    c23f857 HEAD@{2}: commit: 添加注释
    072c19b HEAD@{3}: merge J_3.3.0: Fast-forward
    a92613e HEAD@{4}: checkout: moving from J_3.3.0 to 3.3.0
    072c19b HEAD@{5}: commit: 改为http请求
    415f5d3 HEAD@{6}: commit: 修改背景颜色
    1e44117 HEAD@{7}: commit: 修改找月嫂背景颜色
    2292b7c HEAD@{8}: commit: 去除月嫂说
    039be98 HEAD@{9}: commit: 修改版本号
    f551e33 HEAD@{10}: commit: 紧急修复下单不能选择地址的问题
    2657843 HEAD@{11}: reset: moving to 26578435c6580b11472b4188e6027f3a695bf6df
    23f84ea HEAD@{12}: commit: 添加联系人地址
    2657843 HEAD@{13}: commit: 用户点击自己头像自动转跳至时光中心
    14f54dc HEAD@{14}: commit: 莫名其妙的会出现一根线
    4d30dd1 HEAD@{15}: commit: 提问专区:标题改为选择性填写(不强制填写)
    11a3adb HEAD@{16}: commit: 处理键盘通知
    d12a83f HEAD@{17}: commit: 提问专区筛选箭头图标往右移,选中后显示#FC7B99,选了什么对应什么,
    ee52989 HEAD@{18}: commit: 社区
    6ef1f76 HEAD@{19}: commit: 社区搜搜
    fc8457b HEAD@{20}: commit: 妈妈说点击事件
    ca39108 HEAD@{21}: commit: 月嫂说模块
    d4450b3 HEAD@{22}: commit: 妈妈说
    4de8acf HEAD@{23}: commit: 查看大图,添加中间的间隙
    :
    

    如刚才所说,我们进行回退,回到了修改版本号的地方,此时我们不想回到修改版本号的地方了,我们想回到添加注释的地方,如下

    git reset --hard c23f857    //c23f857 HEAD@{2}: commit: 添加注释
    

    这样就可以回到添加注释的那次提交,在修改版本号和添加注释直接的所有提交也会被恢复。

    场景四:文件暂存

    假如我们本地有两个分支,a和b,此时我们在b分支上正在开发功能,每次开发一部分就合并到a分支上,但是此时你的同事发现你合并的a分支有一个问题,很严重,已经影响了同事工作了,此时需要你紧急修复下。但是你在b分支上开发的功能才完成了一部分,还有很多错误,此时又不想提交。这个时候就可以先使用暂存,先把当前分支的修改暂存,切换到其他分支工作,然后在切换到暂存的分支,把暂存区的内容恢复,继续开发。

    首先在b分支上执行

    git stash  //把工作现场暂存
    

    此时你就可以切换到a分支进行bug修复了
    当bug修复完成,然后切换到b分支,执行

    git stash pop  //回到工作现场
    

    场景五:恢复已经删除的本地分支步

    这里说下我曾经遇到的一个比较大的坑。由于修改的文件比较多,在合并之前猜测就会产生很麻烦的冲突,所以,我又建了一个分支,用于合并测试。由于同事之间修改的Project文件内容太多,导致Project文件冲突,在解决冲突时出了问题,当时猜测是把文件的引用给删掉了。导致合并失败,一气之下,直接把用于测试的分支给强制删除了。本想着,再建一个分支,再次合并。但是,git却告诉我,有一个未完成合并的分支,让我必须完成合并才能继续其他的操作,一下我就懵逼了。

    搞了一个上午才修复。其实也很简单,只需要两步就可以了。

    1.使用git log -g 找回之前提交的commit
    git log -g
    

    这个命令是让你找到你删除的分支的某一次提交记录,我在删除的分支上进行了一次提交

      develop
    wangtengfeideMacBook-Pro:EasyMother Jason$ git log -g
    commit c23f857a1a08f338fe9b28e7bdbeb7da05586477
    Reflog: HEAD@{0} (小飞hub <2678199009@qq.com>)
    Reflog message: checkout: moving from JJ_3.3.0 to 3.3.0
    Author: 小飞hub <2678199009@qq.com>
    Date:   Mon Dec 12 09:16:38 2016 +0800
    
        添加注释
    
    commit 16201fcd6f2e5644f6df0815ad233f995d8f0f6e
    Reflog: HEAD@{1} (小飞hub <2678199009@qq.com>)
    Reflog message: commit: 添加文件
    Author: 小飞hub <2678199009@qq.com>
    Date:   Mon Dec 12 10:04:59 2016 +0800
    
        添加文件
    
    commit c23f857a1a08f338fe9b28e7bdbeb7da05586477
    Reflog: HEAD@{2} (小飞hub <2678199009@qq.com>)
    Reflog message: checkout: moving from 3.3.0 to JJ_3.3.0
    Author: 小飞hub <2678199009@qq.com>
    Date:   Mon Dec 12 09:16:38 2016 +0800
    
        添加注释
    wangtengfeideMacBook-Pro:EasyMother Jason$ 
    

    我在删除的JJ_3.3.0分支上进行了一次提交,添加文件

    git branch recover_branch_abc 16201fcd6f2e5644f6df0815ad233f995d8f0f6e
    
    2.使用git branch recover_branch_新分支 commit_id命令用这个commit创建一个分支
    git branch recover_branch_abc 16201fcd6f2e5644f6df0815ad233f995d8f0f6e //添加文件的commit_id
    

    然后使用git branch查看分支分支是否存在,如果成功将会出现一个新的分支recover_branch_abc,然后切换到recover_branch_abc分支,查看文件是否存在。
    这样就可以恢复被误删的分支了

    场景六:删除远程分支

     //分支名, 这样做只是删除了本地的远程分支的索引
    git branch -r -d origin/hotfix/2.2.3  
    //在执行这句就完全删除了(注意冒号,要与origin留一个空格)
    git push origin :hotfix/2.2.3          
    

    关于git合并代码产生冲突的问题我要发发牢骚,以前找工作的时候,总是有一些人说,你们为什么使用storyboard,而不是用纯代码,使用storyboard会影响程序编译速度,不利于团队开发之类的。我从第一天开始工作就开始使用storyboard开发,合并代码,当然会产生冲突,但是产生冲突最后都可以解决,你解决不了的冲突不代表别人不能解决,storyboard本质上就是一个xml文件,我只能说,不拥抱新技术的人始终会被淘汰,整天代码写那些布局有意思吗?storyboard来画界面,真心速度比纯代码快很多。
    文章内容为自己平时使用git遇到的一些情况,如果您有更好的方式处理这些问题,请留言斧正。

    git 配置RSA
    https://www.cnblogs.com/superGG1990/p/6844952.html
    首先 cd 切换到用户的目录 我的用户名是hr, 那我就切换到hr下
    然后执行ssh-keygen -t rsa -C "your_email@youremail.com"

    然后 cd ~/.ssh,
    打印 cat id_rsa.pub

    相关文章

      网友评论

        本文标题:Git使用场景总结

        本文链接:https://www.haomeiwen.com/subject/rnrdmttx.html