Git工作流和常用命令以及部分高级特性

git 专栏收录该内容
0 篇文章 0 订阅

分享一下使用git两年的经验和心得,纯手打原创,命令千篇一律,经验和心得还是可以交流分享的,希望有所得,如有错误欢迎指出探讨,谢谢

设置全局用户名和邮箱


git config --global user.name "这里面填你的名字如 lanch"       
git config --global user.email "注册git的邮箱如 12157084@qq.com"

给GitHub/gitLab生成ssh key
如果曾经生成过密钥,可以使用同一个,需要注意的是登录邮箱需要一样。
(比如你的gitlab和github都是用一个邮箱注册并登录的,生成一次就行)
如果没有生成过或想重新生成,命令如下:

1.ssh-keygen -t rsa -C "填注册git时的邮箱如12157084@qq.com"
2.cat ~/.ssh/id_rsa.pub(打印出公钥)
3.登录github账号,新增ssh key


常用命令:

分支相关:

  1. git branch abc (新建分支)
  2. git checkout abc (切换到abc分支)
  3. git checkout -b abc(新建abc分支并切换到abc分支)
  4. git branch (查看当前分支)
  5. git branch -a(查看所有分支)

add相关

  1. git add "XXXX.java" (添加某一文件到缓冲区)
  2. git add . 和 git add -A (添加所有的修改到缓冲区,注意修改包括增删改操作)
  3. git reset HEAD (撤销HEAD前add的所有内容)
  4. git reset HEAD XXXX.java(把某一文件撤销add操作)

commit相关

  1. git commit(把当前已经执行过add操作的文件提交,弹出填写commit message的区域)
  2. git commit -m"Modify some code"(提交操作同上,区别是不弹出commit message的区域,直接在-m后面写就行)
  3. git commit --amend(追加提交,比如在某个场景中,一个pr只允许有一个commit,这时如果pr没又merge并且有了新的改动,就可以用这个命令追加提交到上个commit上)
  4. git reset --soft commitId(当前分支回退到此commit,文件状态是已add未commit,如果需要将某些文件变成未add,参考上面回退add)
  5. git reset --hard commitId(当前分支回退到此commit,所有这个commit之后的文件都会被删除,用此命令确保需要回退的commit已经保存到其他分支或者需要回退的内容确定没有用)

remote相关

  1. git remote add XXX 项目的git地址(新增远程仓库地址)
  2. git remote remove XXX(删除远程仓库)
  3. git remote -v(查看远程仓库)


查看文件

  1. git status 查看当前分支的变化,
  2. git diff XXX.java 查看此文件修改了什么(注意此时的文件状态应该是未add)
  3. git log(查看当前分支提交记录,可以看到commitid)
  4. git show commitId(查看此commit提交了什么内容)

高级命令

  1. git stash(将当前修改保存在暂存区,场景:你当前在A分支在写代码并且已经有了修改,此时需要切换分支,但是不想把这些修改提交,就可以用这个命令,暂时保存当前分支的修改后,直接切换分支)
  2. git stash list(查看暂存区所有的暂存,每执行一次stash算一次)
  3. git stash pop(把暂存区栈顶的那次暂存弹出来,也就是最晚执行stash操作的。暂存区是栈结构,FILO先进后出)
  4. git cherry-pick commitId (把此commit追加到当前分支,举例:把A分支的XXXcommit追加到B分支上,此时B分支执行git log可以看出来来自A分支的commit)
  5. git fetch XXX(从某远程地址拉取最新代码,此远程地址一般是项目远程主分支,远程地址至少包括两个,区别在于其中一个是自己的远程项目地址,别的都是项目远程主分支,主要区别下面说)
  6. git rebase XXX(分支合并,正确的拉去代码应该使用fetch+rebase,而不是直接pull,下面介绍基本工作流)
  7. git rebase --abort/--continue(放弃合并/继续合并,在合并出现冲突的时候,看情况需要先解决冲突,再add共同修改的文件,再执行git rebase --continue,放弃合并用 git rebase --abort)


git使用规范:
git是分布式版本控制工具不同于svn,当你深入使用了git之后你才会体会到git的强大,既然是分布式版本控制,就不要只局限于push/pull/commit,要发挥git的优势就要遵守规则。
分布式版本控制你要搞清楚两个主要概念,远程分支和本地分支,远程分支又包含项目远程分支(暂且标记为upstream),你自己的远程分支(origin)。本地分支可以有很多,
没有硬性规定说本地分支的数量和哪个分支的职责,但是有几条不成文的规则可以提高工作效率:

  1. 分支可以按照项目整体功能模块纵向划分,也可以按照项目结构横向划分,切忌一个分支撸到底!!!

  2. 什么是项目功能纵向划分呢?
  3. 比如你一个电商的项目,肯定有很多功能,具体细化到什么程度你自己把控,举例你可以新建支付分支/下单分支/购物车分支/等等。
  4. 什么是按照项目结构横向划分呢?
  5. 比如你一个MVC结构的项目,可以划分为datamodel分支/service分支/api分支/ui分支/等等。我个人在工作中还是比较倾向于这样划分,可能会更细粒度。
  6. 分支建好了,最好能见名知意。在每个分支上干相应的活,分别提交。
  7. 每次提交的pr内容不易过多,及每个commit的内容尽量简单以每个commit三个文件左右不超过五个文件为好,总之一句话,勤提少量(不要抬杠啊,如果有人想说修改一个字符提交一次那出门右拐,工地少人)
  8. 所有的操作一定要在自己本地分支操作,并且提交应该提交到自己的远程分支(origin)上,理论上项目的远程分支是只可读的写的权限只限于项目的owner,需要从自己的远程分支提交pull request,
  9. 审核通过merge之后,才能将本地的修改同步到项目远程分支(upstream)上,切忌所有人都直接操作项目的远程分支(upstream)

说一下我使用git的工作流程


以我的项目举例:

  1. 当你要开发某个项目或者要对某个开源项目做贡献比如FlowGate的时候,需要先访问此项目的git地址(https://github.com/vmware/flowgate)
  2. 点击Fork,把项目fork到你自己的远程分支。(注意这里可以关联到上文提到的项目远程分支和自己的远程分支,这个操作就是把项目从项目远程分支fork到你自己的远程分支)
  3. 找到你自己的仓库比如我fork完Flowgate之后我的就是(https://github.com/Pengpengwanga/flowgate),点击clone,或者git clone git@github.com:Pengpengwanga/flowgate.git(ssh)    
  4. git clone之后,打开git bash,切换到flowgate项目(我的是cd /d/develop/project/flowgate),此时是你看到的是你自己远程分支的master分支。
  5. 添加项目远程分支 git remote add upstream git@github.com:vmware/flowgate.git
  6. 查看远程分支你会看到两个一个是刚刚添加的upstream,另一个就是你自己的远程分支比如我的(git@github.com:Pengpengwanga/flowgate.git)
  7. 此时完成了用git管理项目的基本工作,当前分支仍是自己远程分支的master,可以按照相应的规则,新建分支比如我,git branch api,再建一个 git branch datamodel
  8. 此时我们已经新建了两个本地分支分别是api和datamodel,之后就可以分别在相应的分支工作了,例如
  9. 切换到datamodel分支,新建一个user.java,想把这个文件提交到远程分支怎么做呢?如下
  10. 依次执行
  • git add user.java
  • git commit -s(这里有个小插曲,因为是开源项目,要求每次提交都有签名,使用-s可以直接拉取你之前设置的邮箱)弹出填写commit message的区域,填写完之后关闭。
  • git push(在一个新的分支首次提交需要指明upstream,具体看git bash提示,直接复制就行。当前分支非首次提交不需要)到项目git地址或者自己的仓库地址,新建pull request(注意两个对比的分支名字,以远程分支upstream为base对比提交的内容)
  • 审核流程,提交了pr需要有review人员进行审核,当然如果有项目集成了CI例如jenkins,代码先在jenkins跑。不了解这块的有兴趣的自己搜一下,没兴趣的可以忽略。
  •  review通过,审核人员会点approve/merge(分权限),最终都审核没问题会merge到项目远程分支(upstream)上,此时一整个提交流程结束
  • 当然我们需要继续开发啊,需要怎么办呢?

        a>我们用git checkout master 切换到自己远程分支的master
        b>使用git fetch upstream(从项目远程分支拉取最新代码,刚刚我们merge到upstream的代码,实际生产中可能会有n多个修改,所以master需要经常fetch upstream)
        c>使用git rebase upstream/master (合并分支,把upstream的修改合并到自己的master上)
        d>git push(提交对自己远程分支的修改,把刚刚rebase的东西,同步到自己的origin上)
        e>这时需要到某个分支工作的时候,需要先rebase master,再push,之后再进行开发,比如我们想再api分支写接口了,流程如下
            i>git checkout api
            ii>git rebase master
            iii>git push(此时自己的api分支,自己的远程分支,项目的远程分支代码都是一样的。这是再在自己的分支上进行开发,并走提交流程就行了)
            
11.理想是美好的,现实是多人协同工作,肯定会有冲突,有时候自己跟自己冲突都会存在。这时候就需要经常fetch/rebase代码了,切记落后多个版本,勤沟通。
    也会经常出现这个情况,你自己正在开发的时候和主分支代码都一样,当你开发完项目远程主分支已经有了别人最新的提交,这时候你需要先把自己的master和upstream同步一下,
    再到你这个分支上,用rebase master,到想提交的时候再push
12.善用git高级命令很舒服的,写出来的都是我常用的,可能不全。

最后当次王婆卖波瓜,新项目FlowGate求star,欢迎交流和贡献,正在和linux 基金会谈,不久就会贡献到linux 基金会,目前是在公司下面开源
项目地址:https://github.com/vmware/flowgate
项目中文简介:https://mp.weixin.qq.com/s/8w7QImwns-WTI0_Hf6sblg

 

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值