版本控制器
|
|
git
简介
|
|
git与svn比较


git的工作流程

版本库间的通信

git分支管理

git使用
流程(核心总结)
|
|
安装
|
|
基础命令
将已有的文件夹 - 初始化为git仓库
|
|
在指定目录下 - 初始化git仓库
|
|
在仓库目录终端下 - 设置全局用户
|
|
在仓库目录终端下 - 设置局部用户
|
|
查看仓库状态
|
|
工作区操作
|
|
撤销工作区操作:改、删(了解)
|
|
工作区内容提交到暂存区
|
|
撤销暂存区提交:add的逆运算(很少使用)
|
|
提交暂存区内容到版本库
|
|
撤销版本库提交:commit的逆运算
|
|
过滤文件
|
|
多分支开发
分支操作
|
|
远程git开发
两种本地与远程仓库同步
|
|

remote源操作
|
|
采用ssh协议连接远程源
创建电脑的公钥私钥
|
|
提交本地代码到远程仓库
|
|

如何成为其他码云项目的开发者
|
|
如何成为公司自建git服务器的开发者
|
|
协同开发
|
|
冲突解决
|
|
线上分支合并

远程仓库回滚
|
|
git
一、git介绍
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:
- 无GitHub:在本地 .git 文件夹内维护历时文件
- 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
- 集中式:远程服务器保存所有版本,用户客户端有某个版本
- 分布式:远程服务器保存所有版本,用户客户端有所有版本
1、Git把管理的文件分为了两个区域四个状态。

工作区(workspace):当前开发程序所在目录称为工作区,即:工作开发都是在该目录,该区域的文件会有状态的变化且状态由git自动检测,如果程序中文件做任何操作(增、删、改),文件状态均会被检测到,可以使用 【git status】命令查看。
版本库:工作区检测到有文件发生变化,那么意味着较上一个版本之后对程序进行了修改,修改完成之后,可以当做下一版本进行提交,那么就是执行 【git add .】 将所有文件提交到暂存区(index/stage/cached),然后再执行【git commit -m '又一个版本'】提交到版本库的分支即可,之后可以使用【git log】命令查看版本记录。
- 工作区有一个隐藏目录
.git,这个不算工作区,而是Git的版本库。 - Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master,以及指向master的一个指针叫HEAD。 - 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 - 因为我们创建Git版本库时,Git自动为我们创建了唯一一个
master分支,所以,现在,git commit就是往master分支上提交更改。 - 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
- Git的四个区域:工作目录(Workspace)-->暂存区域(Index/Stage/Cached)-->本地仓库(Repository)-->远程仓库(Remote)Git命令就是用于将文件改动切换到不同的空间来记录
- Git的四种状态:Untracked--> Unmodified--> Modified-->Staged
2、基础命令
- git init,初始化,表示即将对当前文件夹进行版本控制。
- git status,查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等。
- git diff index.html,查看此文件在本地工作目录和暂存区的区别。
- git diff --cached index.html,查看此文件在暂存区和本地仓库的区别。
- git add 文件名,将指定文件添加到版本库的暂存状态。
- git add . 把当前目录下所有改动的文件都添加到版本库的暂存状态。
- git commit -m '提交信息',将暂存区的文件提交到版本库的分支也就是本地仓库。只有将文件提交到本地仓库,git才真正的对文件实现了管理
- git log,查看提交记录,即:历史版本记录
- git log -p,更详细的历史版本记录
- git log -1,显示最近一条
- git log --oneline,记录显示成一行
- $ git log --oneline --decorate,记录显示成一行,还可以看到分支
- git reflog,查看每一次命令
- git reset --hard 4459657,回滚
- git checkout -- index.html,用暂存区的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
- git reset HEAD index.html,用本地仓库版本替换暂存区的版本
- git rm index.html,git commit -m "remove index.html"从版本库中删除该文件
- git rm --cached index.html"从暂存区删除,可以理解成git add index.html 的反命令
- git rm -f index.html"从暂存区和本地工作目录中同时删除
- git mv index.html home.html"从暂存区和本地工作目录中同时改名为home.html
- git config --local user.name 'silencio9'
- git config --local user.email '343096080@qq.com'
二、分支管理
branch称为分支,默认仅有一个名为master的分支。一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。
1、创建与合并分支
2、解决冲突
3、基本命令
- git branch 分支名称 创建分支
- git checkout 分支名称 切换分支
- git branch 查看所有分支
- git branch -d 分支名称 删除分支
- git merge 分支名称 将指定分支合并到当前分支
git remote查看远程库的信息git remote -v显示更详细的信息
4、分支
-
master分支是主分支,因此要时刻与远程同步; -
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
5、标签
- git tag -a v1.0 当前内容打一个标签(方便快速回滚),每次提交都可以打个tag
- git tag -a v1.0 aa27de7 给aa27de7内容打一个标签(方便快速回滚)
- git reset --hard v1.0 回滚到v1.0版本
- git tag 查看当前所有的标签
- git show v1.0 查看当前1.0版本的详细信息
- git tag -a v1.2 -m "version 1.2 release is test" 创建带有说明的标签,-a 指定标签名,-m 指定说明文字
- git tag -d 1.0 为同一个提交版本设置了两次标签,删除之前的v1.0
三、远程仓库
1、创建SSH Key
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
第1步:创建SSH Key,一路回车,使用默认值即可。
|
1
|
$ ssh-keygen -t rsa -C "youremail@example.com" |
找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容: 最后点“Add Key”,你就应该看到已经添加的Key

- 为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
- GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
- 提示:在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
- 如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的,公司内部开发必备。
2、创建远程仓库
你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
第1步:登陆GitHub,然后,在右上角找到“New repository”按钮,创建一个新的仓库:
第2步:$ git remote add origin git@github.com:silencio9/blog.git #添加远程仓库
第3步:git push -u origin master # 推到远程
以后:git push origin master #以后只要本地作了提交,此命令就可以推到远程库



3、从远程库克隆
假设我们从零开发,没有本地库那么最好的方式是先创建远程库,然后,从远程库克隆。
第1步:登陆GitHub,创建一个新的仓库,名字叫gitskills勾选Initialize this repository with a README,这样GitHub会自动创建一个README.md文件:
第2步:$ git clone git@github.com:silencio9/gitskills.git #在本地找一个目录,克隆远程库 或者 $ git clone https://github.com/silencio9/gitskills.git



- GitHub给出的地址不止一个,还可以用https://github.com/silencio9/gitskills.git这样的地址。Git支持多种协议,默认的
git://使用ssh,但也可以使用https等其他协议。 - 使用
https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
4、基础命令
- $ ssh-keygen -t rsa -C "youremail@example.com",创建SSH Key。
- $ git remote add origin git@github.com:silencio9/blog.git # 为地址起一个别名origin 或者 $ git remote add origin https://github.com/silencio9/blog.git
- $ git push -u origin master #将本地master分支内容以及版本信息推送到GitHub
- $ git push origin dev # 将本地dev分支内容以及版本信息推送到GitHub
- $ git clone git@github.com:silencio9/gitskills.git #在本地找一个目录,克隆远程库 或者 $ git clone https://github.com/silencio9/gitskills.git
- $ git Branch # 默认获取到得只有master分支
- $ git branch dev origin/dev # 创建dev分支且和远程dev分支同步
- $ git checkout dev # 切换到dev分支
- $ git pull origin dev # 从远程GitHub仓库获取dev分支最新内容,并合并到本地
- $ git fetch origin dev # 从GitHub仓库获取dev分支最新内容到版本库的分支
- $ git merge origin/dev # 将版本库的分支内容合并到工作区
- 【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】
四、多人协作
1、合作者
将其他用户添加到仓库合作者中之后,该用户就具有向当前仓库提交代码。

2、组织
创建一个组织,然后再该组织下可以创建多个项目,组内成员可以向组内所有项目提交代码。PS:也可以对某个项目指定合作者



3、三人协同开发整个过程
- 创建程序
- 用户A创建程序,提交到GitHub
- 用户B克隆项目
- 用户C克隆项目
- 开发功能
- 用户A开发功能1
- 用户B开发功能2
- 用户C开发功能3
- 提交
- 用户A提交功能1,并push(A用户手速快,先提交。)
- 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。 - 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。 - 获取最新代码
- 用户A获取最新代码
- 用户B获取最新代码
- 用户C获取最新代码
在上面红色标注的解决方法位置可以有三种方式操作,三者都可以完成合并并提交新功能,但是日志记录会有差异,如:前两者版本记录中会出现合并,而第三种可以保证版本记录干净整洁。
- 先 git pull origin master 然后 git push origin master

- 先 git fetch origin master 然后 git merge origin/master 再 git push origin master

五、fork
- fork一下,然后这个项目就在自己仓库出现了


- 从自己仓库获取代码并进行编辑提交
- 创建并提交一个pull request,然后等待原作者是否同意这个pull request,如果同意那么在作者的源代码中就推出现小P提交的功能

################## cd blog #进入程序目录 git init #git 初始化 git status #查看当前状态 git add . #工作区提交到暂存区 git commit -m 'v1' #提交到版本库,并填写版本说明,以便以后回滚 #修改文件后 git diff #查看修改了什么地方 #回滚 git log #查看历史版本提交记录根据版本commit值可以进行回滚 git reflog #记录每一次命令 git reset --hard 版本号 #回滚 #撤销: 情况1:没有add git checkout -- index.html #工作区的修改全部撤销 情况2:已经add了,但没有commit 第1步:git reset HEAD index.html #把暂存区的修改撤销掉 第2步:git checkout -- index.html #删除: 情况1:误删除的这样找回 git checkout -- index.html 情况2:彻底删除 第1步:git rm 1.txt 第2步:git commit -m 'del 1.txt' #分支:默认在master分支 cd blog git branch dev #创建新分支,即拷贝一份当前所在分支代码到新分支 git checkout dev #切换到dev分支 git branch #查看当前分支 git branch -d 分支名称 #删除分支 git checkout master #切换回master分支 git merge dev #将dev分支内容合并到master分支 切换分支再合并 #遇到bug: git checkout master #切换回master分支 git branch bug #创建bug分支 git checkout bug #切换到bug分支 git add . git commit -m '修bug' git checkout master #切换回master分支 git merge bug #将bug分支内容合并到master分支,表示bug修复完毕,可以上线 git checkout dev #切换回dev分支,继续开发, ... git add . git commit -m '开发完毕' git checkout master #切换回master分支 git merge dev #将dev分支内容合并到master分支 ##产生冲突 CONFLICT(content):Merge conflict in ... 手动解决冲突 git add. git commit -m '解决bug和新功能冲突' ############SSH Key ssh-keygen -t rsa -C "youremail@example.com" #创建SSH Key,一路回车即可 git remote add origin git@github.com:silencio9/blog.git # 添加远程仓库(起一个别名origin) 或者 git remote add origin https://github.com/silencio9/blog.git #出现fatal:remote origin already exists.的解决方案 第1步:git remote rm origin 第2步:git remote add origin git@github.com:silencio9/blog.git # 添加远程仓库 git push -u origin master #master分支推到远程 (-u可加可不加) git push -u origin dev #dev分支推到远程 (-u可加可不加) # 第一次推会出现:Are you sure you want to continue connecting(yes/no)? 输入yes git push origin master #只要本地做了提交,就可以通过此命令推到远程 #公司 克隆远程库: cd e: git clone https://github.com/silencio9/blog.git(内部已实现git remote add origin 远程仓库地址) git checkout dev #切换回dev分支,继续开发, git merge master #让dev分支合并master [] ... git add . git commit -m '在公司开发的a.txt' git push origin dev #提交到远程 #回到家继续写代码 git checkout dev # 切换到dev分支 git pull origin dev # 从远程dev分支拉取代码 ... git add . git commit -m '在家开发的b.txt' git push origin dev #提交到远程 #到公司继续 git pull origin dev # 从远程dev分支拉取代码 ... git add . git commit -m '开发完毕' #上线 1.将dev分支内容合并到master分支 git checkout master git merge dev git push origin master #提交到远程 2.把dev分支也推送到远程 git checkout dev git merge master git push origin dev ##################rebase###################### rebase:使git记录简洁【不要把push到仓库的也合并】 多个记录整合成一个记录 ####情况1: git rebase -i 版本号 git rebase -i HEAD~3 ####情况2:dev分支变基: 第1步.git checkout dev 第2步.git rebase master 第3步.git checkout master 第4步.git merge dev 第5步.git rebase -i 版本号 ####情况3:忘记提交到远程仓库 git fetch origin dev #远程到版本库 git rebase origin/dev #版本库到工作区 ####rebase冲突,和merge冲突一样的解决方式,最后加上git rebase --continue git rebase master ... git add . git rebase --continue git log ####################################### git pull origin dev #会产生分叉 等同于 git fetch origin dev #远程到版本库 git merge origin/dev (分叉)或 git rebase origin/dev (不分叉)#版本库到工作区 git log --graph #图形显示 git log --graph --pretty=format:"%h %s" #图形简洁显示 ######快速解决冲突 1.安装beyond compare 2.在git中配置 git config --local merge.tool bc3 git config --local mergetool.path 'D:\bcomp' git config --local mergetool.keepBackup false 3.应用beyond compare解决冲突 git mergetool ##### git tag -a v1 -m '第一版' #打标签 git push origin --tags #推送 ###########多人协同开发 在dev分支上新建分支 #开发成员 git checkout dev git checkout -b bubu #创建bubu分支并切换到bubu分支 ... git add . git commit -m 'bubu开发完毕' git push origin bubu ###########代码review(pull request) 给master和dev分支添加rule ##远程仓库 bubu: New pull request bubu分支--->dev分支 ... #测试人员 git checkout dev git checkout -b release git push origin release ##远程仓库 release: New pull request release分支--->master分支 ##本地 git checkout dev git merge release git branch -d release ##master分支 git checkout master git pull origin master git tag -a v2 -m '第2版' #打标签 git push origin --tags #推送 ##给开源软件贡献代码 1.fork源代码 将别人源代码拷贝到我自己的远程仓库 2.在自己的仓库进行修改 3.给源代码的作者提交修复bug的申请 pull request ##其他 配置文件 1.项目配置文件:项目/.git/config git config --local user.name 'bubu' git config --local user.email '343@qq.com' git remote add origin 地址 默认添加到本地配置文件中 2.全局配置文件: ~/.gitconfig 当前用户的家目录下 git config --global user.name 'bubu' git config --global user.email '343@qq.com' 3.系统配置文件:/etc/.gitconfig 需要有root权限的 git config --system user.name 'bubu' git config --system user.email '343@qq.com' ##免密登录: 1.URL中体现(在项目配置文件中修改) 原来的地址:https://github.com/wupeiqi/dbhot.git 修改的地址:https://用户名:密码@github.com/wupeiqi/dbhot.git git remote add origin https://用户名:密码@github.com/wupeiqi/dbhot.git git push origin master 2.SSH实现 A:生成公钥和私钥(~/.ssh/id_rsa.pub) ssh-keygen -t rsa -C "youremail@example.com" B:拷贝公钥的内容,并设置到GitHub中 git remote add origin git@github.com/wupeiqi/dbhot.git 3.git自动管理凭证 ##git忽略文件(让Git不再管理当前目录下的某些文件) 以斜杠“/”开头表示目录; 以星号“*”通配多个字符; 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表; 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录; *.h !a.h 排出 .gitignore files/ ##任务管理相关 issues 文档以及任务管理 wiki 项目文档说明描述
# Byte-compiled / optimized / DLL files .idea/ local_db.sqlite3 __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # static files generated from Django application using `collectstatic` media static