git 环境
git 使用
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用户组
$ sudo adduser git
$ sudo passwd git
$ sudo groupadd git
$ sudo usermod -G git git
二、创建git仓库
$ cd /srv
$ mkdir nginx-docs.git
$ cd nginx-docs.git
$ git init --bare
$ sudo chown -R git:git /srv/nginx-docs.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服务器上:
$ su git
$ ssh-keygen –t rsa
$ touch authorized_keys
然后把客户端的id_rsa.pub追加到这个文件里。这样后,
我们就不需要每次都输入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
git checkout –b feature/FT-123456
git checkout develop
git merge feature/FT-123456
git branch –d feature/FT-123456
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
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
第一步:安装一些依赖软件
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
第二步:添加下载源:
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’
https://docs.gitlab.com/omnibus/settings/configuration.html
gitlab-ctl reconfigure
第五步:启动重启查看状态:
gitlab-ctl restart/start/status/stop
比如gitlab-ctl status,会显示以下信息:
此时我们可以使用gitlab-ctl tail来查看gitlab的服务日志,通过日志可以看到8080端口被别的进程占用了
vim /var/opt/gitlab/gitlab-rails/etc/unicorn.rb
gitlab-ctl restart
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如,要想获得config 命令的手册,执行$ git help config
当然,如果你遇到问题也可以查看git的官方文档。https://git-scm.com/book/zh/v2
$ git log
$ git log --onelie
$ git log –[length]
$ git log --skip=[skip] -3
$ git log -p
$ git log --stat
$ git shortlog
按日期
$ git log --after="2018-7-1"
$ git log –-before="2014-7-1"
按作者
$ git log --author="Dounin"
按照提交信息
$ git log --grep=“issue”
按文件
$ git log -- ./src/http/modules/ngx_http_xslt_filter_module.c
按照内容
$ git log -S “ngx_free”
按照范围
$ git log <since>..<until>
$ git show commit-id
看到git checkout命令就是从本地仓库中或暂存区检出文件,并且覆盖工作目录的内容
$ git checkout branches/stable-1.14
$ git checkout 9bfbacdd
$ git checkout main.cpp
可是上面都是说从git的本地仓库和暂存区里检出内容,然后覆盖掉工作区的内容,即丢弃了本地所有的修改。
那如果是有些内容已经存在工作区了,但是尚未提交到暂存区,即是untracked的内容,那么我们可以使用
git clean命令来删除这些文件,用法如下:
git clean -n :是一次clean的演习,告诉你哪些文件会被删除,记住他不会真正的删除文件,只是一个提醒。
git clean –f :删除当前目录下所有没有track过的文件,他不会删除.gitignore文件里面指定的文件夹和文件,不管这些
文件有没有被track过。
git clean -f <path> :删除指定路径下的没有被track过的文件
git clean -df :删除当前目录下没有被track过的文件和文件夹
git clean -xf :删除当前目录下所有没有track过的文件,不管他是否是.gitignore文件里面指定的文件夹和文件。
好了,如果我们想要放弃本地的所有修改可以:
git checkout .
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
fix conflict
git commit
git push
$ git checkout -b reset_to_5ff5433b 5ff5433bd1fe4
$ git show 9d531db98276
$ git commit –a –m “reverted 5ff5433b”
$ git checkout 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内容里。
标题行: 必填, 描述主要修改类型和内容
主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等
页脚注释: 放 Breaking Changes 或 Closed Issues
message的格式:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
Type指:
feat: 新特性
fix: 修改问题
refactor: 代码重构
docs: 文档修改
style: 代码格式修改, 注意不是 css 修改
test: 测试用例修改
chore: 其他修改, 比如构建流程, 依赖管理.
scope: commit 影响的范围,即影响的模块或者组件,比如: route, component, utils, build...
subject: commit 的概述, 建议符合 50/72 formatting
body: commit 具体修改内容, 可以分为多行, 建议符合 50/72 formatting
footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接,或者feature等等其余的信息.
使用git cmmit模板来规范提交
1. 在~/.gitconfig文件里添加
[commit]
template=~/.gitmessage
2. 添加~/.gitmessage文件
下载对应版本的nodejs包,并安装
https://nodejs.org/en/download/
2. 使用 npm 工具进行全局安装,
npm install commitizen -g
3. 然后在项目目录里,运行下面命令,使其支持 Angular 的 Commit message 格式,
commitizen init cz-conventional-changelog --save --save-exact
以后,凡是用到 git commit 命令,一律改用 git cz ,这时候就会出现选项,来生成符合规范的 commit message 。
4. 如果我们希望每个使用 git 的项目都遵循这个标准,可以使用下面命令进行全局设置。
安装 cz-conventional-changelog ,
npm install -g cz-conventional-changelog
5. 创建一个 .czrc 文件在你的 home 目录,并将 path 指向上面所安装的 commitizen 适配器,
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
6. 现在我们可以在每个 git 项目中使用 git cz 提交我们的 commit message 了,当然我们还可以配置Commitlint做自动检测,检查不通过的可以拒绝提交,比较绝吧。
7. 如果我们所有的commit信息都是按照这个格式填写的,在发布版本时,我们就可以使用以下命令生成changelog了
conventional-changelog -p angular -i CHANGELOG.md -s
git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。例如:
git push origin master:refs/for/master
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
Git push的时候如果有冲突,会显示如下,此时我们必须去修复这个冲突。
首先我们调用git pull去拉取分支下来(如左下图),然后会在冲突的文件里记录冲突的内容,手动去解决冲突,然后
再git commit 和 git push
此时我们可以先调用git add README.md文件到暂存区,然
后调用git commit –-amend把当前暂存区里的内容合并到上一
次commit里,而且还可以修改上一次提交的message信息。
当然我们除了添加“漏掉”的文件,也可以删除
“误修改”的文件。最后使用git push –fore强制推送修改后的commit
$ git rebase –i bed58d54e
输入上面一条命令后,会弹出下文这个窗口,上半部分是一些pick命令,下半部分是一些提示内容,不过有意思的是此时的commit内容的排列和git log里的排列是反的,也就是倒序的。如果我们仅仅修改commit message,需要把打算修改的commit的对应pick命令修改为reword,然后保存。
之后会弹出编辑commit message的内容,如果我们
有多处commit需要被修改的话会多次弹出vim编辑窗口。
如果在修改前所有的commit都已经push到远程仓库的话,我们需要使用git push --force强制推送到远程仓库。
上文仅仅说明了修改历史提交的message,但是如果在某个历史提交中少提交内容,比如上文某个源码文件里的内容修改不完整,提交很多天经过严格测试才发现,那么我们就可以使用git rebase的edit命令修改提交内容了。
$ git rebase –i bdc6778948a
上面的命令后我们可以使用edit命令替换pick命令。
保存后,此时git rebase会停止工作,以便我们可以编辑文件和commit message,修改并提交后,可以继续其它的edit命令。在这个过程中我们会使用到以下这两条命令
$ git commit –-amend
$ git rebse --continue
如果在修改前所有的commit都已经push到远程仓库的话,我们需要使用git push --force强制推送到远程仓库。
在使用git的时候,我们可能针对同一个任务由多次提交,比如我们针对同一个feature可能由多个同事修改了不同部分,但是
多个提交让我们的版本管理显得比较凌乱,此时我们可以合并多个commit为一个。
首先假设我们有三个commit,如左下所示:我们想把最近的三个commit合并为一个commit,那么此时我们可以使用git rebase
命令了,即git rebase –i 4cbeb4248f7, -i后面的参数表示不要合并的commit的hash值。输入命令出现右下图:
可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,而下方注释的部分则是指令的提示说明。指令部分中由前方的
命令名称、commit hash 和 commit message 组成。
pick 和 squash的意思如下。我们将 ad777ea和a271901这两个commit前方的命令改成 squash 或 s,然后输入:wq以保存并退出
pick 的意思是要会执行这个 commit
squash 的意思是这个 commit 会被合并到前一个commit
退出后会弹出如下界面,即需要我们重新编辑合并后的commit信息,未注释掉的是会包含在commit message里的,按”wqa”保存后即完成了此次commit的合并
1)设置ssh的免密登录方式:
ssh-kengen –t rsa
vim ~/.ssh/id_rsa.pub
chmod 400 /root/.ssh/authorized_keys
2)书写以下脚本:我们使用ssh协议进行git clone, --mirror是拷贝镜像的意思(不能省掉,因为git仓库有很多的分支和
tag信息)
3)通过crontab添加定时任务:
crontab –e
systemctl restart cron
甚至是依赖了第三方的项目,那么我们可以使用git的submodule来管理这些依赖,submodule允许父项目可以有很多的独立的
Git子项目,这些子项目可以单独提交/push/pull等管理,而且父项目中的提交不会影响到子项目。这有很多好处:
1) 把子模块单独作为一个git项目,他们可以独立开发,他们的错误并不会影响到父项目
2) 团队分模块工作在不同git项目上,减少了代码提交的依赖,减少了很多更新操作
X
git stash
git stash pop
.gitignore可以提交到远程仓库中,这样这些规则就可以共享给所有的开发人员了,在.gitignore文件中每一行都定义了忽略
的规则
git add <files>
git commit -m "comment"
git log
git log --pretty=oneline
git reset --hard HEAD^
git reset --hard 1094a
git reflog
git add
git commit -m
git diff HEAD -- readme.txt
git checkout -- readme.txt
git rm test.txt
git commit -m "remove test.txt"
git checkout -b dev
git branch
git checkout master
git merge dev
git branch -d dev
git switch -c feature1
git switch master
git merge feature1
git branch -d feature1
git switch -c dev
git switch master
git merge --no-ff -m "merge with no-ff" dev
git stash
git checkout master
git checkout -b issue-101
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
git switch dev
git stash pop
git stash list
git stash apply stash@{0}
git switch -c feature-vulcan
git switch dev
git branch -D feature-vulcan
git remote -v
git push origin master
git push origin dev
git pull
git checkout -b branch-name origin/branch-name
git branch --set-upstream branch-name origin/branch-name
git log --graph --pretty=oneline --abbrev-commit
git rebase -i [startpoint] [endpoint]
git tag v1.0
git tag
git tag v0.9 f52c633
git show v0.9
git tag -a v0.1 -m "version 0.1 released" 1094adb
git tag -d v0.1
git push origin v1.0
git push origin --tags
git push origin :refs/tags/v0.9
git show v0.1
总结