gitEnv: find ./ -type f -size +100M sudo apt-get install git git-core ssh -T git@github.com git config --global user.name "tanXianQiang" git config --global user.email "852897652@qq.com" git config --list ssh-keygen -C "852897652@qq.com" -t rsa ssh-agent bash --login -i ssh-add ~/.ssh/id_rsa cat id_rsa.pub # 创建git服务器 一:创建git账号和git用户组 $ sudo adduser git #添加git用户 $ sudo passwd git #添加git的密码 $ sudo groupadd git #添加git用户组 $ sudo usermod -G git git #添加git用户到git用户组 二、创建git仓库 $ cd /srv # srv目录下存放git的仓库 $ mkdir nginx-docs.git # 创建nginx-docs.git目录 $ cd nginx-docs.git $ git init --bare # bare选项指示该仓库为裸仓库 $ sudo chown -R git:git /srv/nginx-docs.git # 修改权限为git用户 三、禁止git用户登录shell,这样git通过sh服务登录会被拒绝 chsh git git clone git@<您的 CVM IP 地址>:git仓库路径 五、免密输入的配置 就是通过rsa认证,生成公钥和私钥,然后把客户端的公钥告诉git服务器,具体步骤如下: 在客户端机器上,比如我在windows机器上已经配置用户名和密码,见上一章的git配置说明, 然后打开git bash shell,生成rsa的秘钥对,ssh-keygen –t =rsa命令后一路按回车,此时会在c:/Users/lizhiyong/.ssh/目录下生成id_rsa.pub和id_rsa文件,id_rsa.pub是公钥文件,id_rsa是私钥文件 在git服务器上: $ su git $ ssh-keygen –t rsa $ touch authorized_keys 然后把客户端的id_rsa.pub追加到这个文件里。这样后, 我们就不需要每次都输入git密码了 #git四个区域 在git服务器上: $ su git $ ssh-keygen –t rsa $ touch authorized_keys 然后把客户端的id_rsa.pub追加到这个文件里。这样后, 我们就不需要每次都输入git密码了 #git的工作流程一般是这样的: 1、在工作目录中添加、修改文件; 2、将需要进行版本管理的文件add到暂存区域; 3、将暂存区域的文件commit到git仓库; 4、本地的修改push到远程仓库,如果失败则执行第5步 5、git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突。回到第三步 因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed) #四种状态 Untracked: 未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制, 通过git add 状态变为Staged。 Unmodify: 文件已经入库且未修改, 即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。 Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态, 这个git checkout即从库中取出文件,覆盖当前修改 Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。 #分支介绍 git branch # 查看分支 git branch develop # 创建develop分支 git checkout –b feature/FT-123456 # 创建FT-123456的一个feature分支 git checkout develop # 切换分支 git merge feature/FT-123456 # 合并分支 git branch –d feature/FT-123456 # 删除FT-123456的feature分支 git push –u origin hotfix/ISSUE-345678 # 推送分支 #标准流程 Master : 稳定压倒一切,禁止尚review和测试过的代码提交到这个分支上,Master上的代码是可以随时部署到线上生产环境的。 Develop :开发分支,我们的持续集成工作在这里,code review过的代码合入到这里,我们以下要讲的BUG fix和feature开发都可以基于develop分支拉取,修改完之后合入到develop分支。 Feature :功能开发和change request的分支,也即我们每一个feature都可以从devlop上拉取一个分支,开发、review和测试完之后合入develop分支。 Hotfix :紧急修改的分支,在master发布到线上出现某个问题的时候,算作一个紧急布丁。从master分支上拉取代码,修改完之后 合入develop和master分支。 Release :预发布分支,比如0.1、0.2、1.12版本,我们一般说的系统测试就是基于这些分支做的,如果出现bug,则可以基于该release分支拉取一个临时bug分支。 Bug : bug fix的分支,当我们定位、解决后合入develop和Release分支,然后让测试人员回归测试,回归测试后由close这个bug #github魅力 Repo:项目,绝大多数的开源项目都会放在github上,包括Linus Torvalds参与的linux内核,基于repo可以提issue,可以review code,可以有wiki,branch,tag等等都支持,还可以star和fork这样的repo。 Explore:基于兴趣显示了一些开源项目 Topics:按照主题显示的一些项目,可以选择某个主题继续观察 Trending:流行repo,可以选择语言和周期来显示 Events:显示github官方的一些活动 # 高质量的开源项目 搜索的方法: 关键字 stars:> 1000 fork:>100 语言: java html ngnix stars:>100 #搭建gitlab 第一步:安装一些依赖软件 sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates sudo apt-get install -y postfix # postfix发送邮件,其它的邮件配置见:https://docs.gitlab.com/omnibus/settings/smtp.html 第二步:添加下载源: vim /etc/apt/sources.list.d/gitlab_gitlab-ee.list 打开该文件添加: deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main 第三步:安装gitlab sudo apt-get update sudo apt-get install gitlab-ce 第四步:配置gitlab vim /etc/gitlab/gitlab.rb external_url ‘http://192.168.2.129’ # 把external_url修改成访问的IP,当然更复杂的配置信息可以参考 https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab gitlab-ctl reconfigure # 开始配置 第五步:启动重启查看状态: gitlab-ctl restart/start/status/stop # 通过gitlab-ctl help都能查看到该信息 比如gitlab-ctl status,会显示以下信息: 此时我们可以使用gitlab-ctl tail来查看gitlab的服务日志,通过日志可以看到8080端口被别的进程占用了 vim /var/opt/gitlab/gitlab-rails/etc/unicorn.rb # 然后把listen的8080端口改成8088,然后重启gitlab gitlab-ctl restart # 配置帮助 $ git help补充git命令$ git --help $ man git- 例如,要想获得config 命令的手册,执行$ git help config 当然,如果你遇到问题也可以查看git的官方文档。https://git-scm.com/book/zh/v2 # 查看commit的内容 -- $ git log # 不带任何参数 $ git log --onelie # 每条日志显示一行 $ git log –[length] # 只显示前面的length条日志 $ git log --skip=[skip] -3 # 跳过前面的skip条日志 $ git log -p # 显示一些统计信息以及文件的改动内容和行信息 $ git log --stat # 显示提交的作者 日期 message 和文件内容统计信息 $ git shortlog # 显示每个author提交commit和多少条commit 按日期 $ git log --after="2018-7-1" # 2018年7月1好之后的所有日志 $ git log –-before="2014-7-1" 按作者 $ git log --author="Dounin" 按照提交信息 $ git log --grep=“issue” # 按照提交本中是否包含issue的日志 按文件 $ git log -- ./src/http/modules/ngx_http_xslt_filter_module.c 按照内容 $ git log -S “ngx_free” # 即所有文件中包含了 ngx_free字符串的修改 按照范围 $ git log .. # 比如 git log master..feature这可以显示出自从master分支fork之后,feature分支上所有的提交 $ git show commit-id # 显示commit-id的提交内容,包括所有文件的修改信息 #版本回退 工作空间没有内容 看到git checkout命令就是从本地仓库中或暂存区检出文件,并且覆盖工作目录的内容 $ git checkout branches/stable-1.14 # 检出到branches/stable-1.14分支上,即用1.14分支的内容覆盖了工作区所有内容 $ git checkout 9bfbacdd # 检出到9bfbacdd(commit id)上,即用这个commit 内容覆盖了工作区所有内容 $ git checkout main.cpp # 从暂存区中检出内容,并且覆盖main.cpp文件内容,即尚未添加到暂存区的修改会被丢弃掉 # 工作空间 工作空间有内容 可是上面都是说从git的本地仓库和暂存区里检出内容,然后覆盖掉工作区的内容,即丢弃了本地所有的修改。 那如果是有些内容已经存在工作区了,但是尚未提交到暂存区,即是untracked的内容,那么我们可以使用 git clean命令来删除这些文件,用法如下: git clean -n :是一次clean的演习,告诉你哪些文件会被删除,记住他不会真正的删除文件,只是一个提醒。 git clean –f :删除当前目录下所有没有track过的文件,他不会删除.gitignore文件里面指定的文件夹和文件,不管这些 文件有没有被track过。 git clean -f :删除指定路径下的没有被track过的文件 git clean -df :删除当前目录下没有被track过的文件和文件夹 git clean -xf :删除当前目录下所有没有track过的文件,不管他是否是.gitignore文件里面指定的文件夹和文件。 好了,如果我们想要放弃本地的所有修改可以: git checkout . # 注意有一个“.”,会从暂存区里取出所有内容覆盖掉工作区的所有修改,如果连暂存区的内容也不想要 # 则可以git checkout commit-id git clean -xdf # 删除当前目录下所有的修改 如果我们想要放弃本地某个文件的修改: git checkout file-name # 从暂存区里 #已经提交到本地仓库 git reset --hard HEAD~{n}就是把HEAD指针回退n 个版本(commit),并且使用该commit的内容覆盖掉 工作区的内容,即丢弃了前面n个commit的修改和当前 工作区的修改。然后调用 git push origin master推送到远程仓库 #远程分支回滚 如果有其它同事基于我们的commit做修改的 话,我们回退版本的时候不想把他的提交给回退 掉,比如记录如右图: 我(lizhiyong)想回滚到5ff5433b这里,但 是king有个提交我不能回滚掉,要保存他的代码, 而且如果有多个同事的修改在在5ff5433b之后的, 那怎么办呢? 比较好的做法就是从5ff5433b拉取一个新的分 支(分支名是reset_to_5ff5433b), 因为这个新分 支不包含我要回滚的代码,此时我们可以把其它同 事的修改手动合并到reset_to_5ff5433b分支,接着 切换到master分支上,使用git merge reset_to _5ff5433b去合并分支到master上。 git revert d061cb3 # 因为4bff67b是晚于d061cb3的,如果这两个修改的内容有依赖,是会有冲突的(见图一),当然如果 # 想取消这次回退可以使用,git revert --abort fix conflict # 手动去解决冲突(见图二) git commit # 然后提交,此时使用git log会发现原理的git commit记录还在,但是增加了一个revert的记录(见图三) git push # 推送至远程库 $ git checkout -b reset_to_5ff5433b 5ff5433bd1fe4 # 从5ff5433bd1fe4处创建分支,即代码是5ff5433bd1fe4处的代码 $ git show 9d531db98276 # 查看master分支上的其它同事的提交(比如KING),把他的修改在新分支上再修改一遍 $ git commit –a –m “reverted 5ff5433b” $ git checkout master # 切换到master分支 $ git merge reset_to_5ff5433b $ git push #推送到远程仓库 # 提交 git commit file1.name file2.name file3.name .. –m “commit messages” commit指提交修改到本地的仓库里,file*.name指的是带commit的文件 –m后面的内容指提交的信息,即备注 git commit –a –m “commit messeages” 添加的-a参数会把当前暂存区里所有的修改(包括删除操作)都提交,但是那些尚未添加到暂存区的内容是不会提交的,网上有 很多的博客内容说-a参数会把尚未add的文件也提交了,这个说法是错误的。 git commit 我们可能由时候手抖忘记输入-m参数,直接输入了git commit, 于是出现了右边这个界面,即打开了一个vim编辑界面,敲入 “i”键后保存,输入要添加的message后,输入“ESC”按键 退出编辑界面,然后再敲入“:wqa”后会保存message内容, 并且提交此次修改,如果敲入“:q”会取消这次提交。 git commit --amend 这也是我们经常用的命令,他会把此次提交追加到上一次的 commit内容里。 # commit 格式 标题行: 必填, 描述主要修改类型和内容 主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等 页脚注释: 放 Breaking Changes 或 Closed Issues message的格式: ( ):
git merge test --squash
git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并
参考这个-v进行反选
git log -5 --oneline --name-only | grep -v ‘[ ]’ 那么我过滤出来的就是实实在在的路径。
text=$(git log master ^master_base --name-only --oneline | grep -v ‘[ ]’)
git log master ^master_base --name-only --oneline | grep ^ [ ^ 0-9]
git log master ^master_base --name-only --oneline | grep -v ‘[ ]’



