Git版本控制工具(Linux运维CICD版)
git概述Git诞生分布式项目管理工具目前整个行业内最流行最受欢迎的项目版本管理工具开发者Linus TorvaldsLinux的创始人Linux诞生以后全球很多开发者开发了很多个版本的Linux提交给Linus TorvaldsLinus Torvalds 将优秀的代码集成在Linux内核中手动管理所有的代码Linus Torvalds 不喜欢传统的免费CVS等工具因为这些工具不好用好用的都收费Linus Torvalds 选择了一个商业化的工具达成协议可以免费使用于是团队中的一个哥们有个想法能不能破解这个东西被发现了Linus Torvalds 保证不再破解两周以后Linus Torvalds 自己用C语言开发了Git使用了类似于Linux的管理方式Linus Torvalds 将Linux的版本控制切换到Git上Git的开发汲取了其他的版本控制工具的优点避免了缺点用git原生的方式就相当于写Linux命令git安装官网: https://git-scm.com/Debian 戴比安git安装[rootvm1~]# yum install git[rootvm1~]# git --versiongit version2.43.5查看参数帮助查看参数帮助[rootvm1~]# git --helpgit的操作可以说只需要git一条命令加参数即可git应用git身份设置因为git是分布式版本控制系统,不同的人提交代码需要区分,所以每个人都要设置一个身份标识。如果不设置的话谁会知道你这个开发者是张三李四还是王五呢?[rootvm1~]# git config --global user.name daniel[rootvm1~]# git config --global user.email danielitcast.cn[rootvm1~]# git config --global color.ui true[rootvm1~]# git config --listuser.namedanieluser.emaildanielitcast.cncolor.uitrue创建本地仓库工作目录(working directory): 也可叫工作区.是存放项目代码文件的一个目录。注意它不是一个普通的文件仓库(repository) : 也可叫版本库.在git init命令初始化工作目录后会产生一个隐藏的子目录.git, 可以将其理解为git的仓库或版本库。仓库分为本地仓库与远程仓库创建本地仓库的步骤:创建工作目录[rootvm1~]# mkdir GitTest在对应的工作目录中创建本地仓库[rootvm1~]# cd GitTest/[rootvm1GitTest]# git initInitialized empty Git repositoryin/root/GitTest/.git/会产生一个.git子目录,所有除代码数据外的相关数据都在此目录,不要修改它.(它就是仓库或叫版本库)[rootvm1GitTest]# ls .git/branches config description HEAD hooks info objects refs小结:mkdir创建一个工作目录, 然后cd进去, 使用git init就创建好了本地仓库。开发者就可以在工作目录里开发项目代码文件了。暂存区暂存区(stage或index): 也有叫缓存区暂存区就看作是一个缓区区域临时保存你的改动。如果在工作目录创建了一个新文件需要将新文件添加到暂存区。添加文件到暂存区1, 准备一个文件[rootvm1GitTest]# cat 1.pyprint(hello world)2, 使用git add命令提交到暂存区逆向操作为git rm --cached 1.py)[rootvm1GitTest]# git add 1.py3, 提交第一个文件后,版本库.git子目录里就多了一个index[rootvm1GitTest]# ls .git/branches config description HEAD hooksindexinfo objects refs4, 使用strings命令查看可以看到git add的文件列表[rootvm2GitTest]# strings .git/indexDIRC1.py 这里可以看到1.py文件添加到了index文件里了git版本控制提交文件(第1个版本)代码文件需要commit提交后才能纳入版本控制。1, 可以使用git status查看工作目录里有哪些文件需要提交[rootvm1GitTest]# git status# On branch master## Initial commit## Changes to be committed:# (use git rm --cached file... to unstage)## new file: 1.py#2, 使用git commit提交; -m 后接提交的说明信息 -m 表示备注信息[rootvm1GitTest]# git commit -m 提交1.py[master(root-commit)4e67190]提交1.py1filechanged,1insertion()createmode1006441.py3, 再次git status查看状态,没有需要提交的文件了[rootvm1GitTest]# git status# On branch masternothingtocommit,working directory clean小结初始化本地仓库 git init把工作目录代码提交到暂存区git add文件名称只提交某个文件/git add . 提交当前目录的所有文件把暂存区代码发布到本地仓库git commit -m “备注/描述信息”查看是否有代码需要提交 git status修改再提交(第2个版本)1, 修改1.py文件,我这里加了一句print(“hello python”)[rootvm1GitTest]# cat 1.pyprint(hello world)print(hello python)2, 使用git status查看信息告诉我们1.py被修改了[rootvm1GitTest]# git status# On branch master# Changes not staged for commit:# (use git add file... to update what will be committed)# (use git checkout -- file... to discard changes in working directory)## modified: 1.py#nochanges addedtocommit(usegit addand/orgit commit -a)3, 使用git diff查看修改了什么这个命令是在修改内容后没有提交到仓库再执行才可以看到效果[rootvm1GitTest]# git diff 1.pydiff--git a/1.py b/1.pyindex8cde782..5da7641100644--- a/1.pyb/1.py -11,2print(hello world)print(hello python)4, 提交修改(addcommit)[rootvm1GitTest]# git add 1.py[rootvm1GitTest]# git commit -m 添加了一行代码打印hello python[master0e9371b]添加了一行代码打印hello python1filechanged,1insertion()再修改再提交(第3个版本)再增加一句代码print(hello linux)[rootvm1GitTest]# cat 1.pyprint(hello world)print(hello python)print(hello linux)[rootvm1GitTest]# git add 1.py[rootvm1GitTest]# git commit -m 添加了一行代码打印hello linux[master b679b01]添加了一行代码打印hello linux1filechanged,1insertion()小结:工作目录中写好的代码文件需要先git add 文件名添加到暂存区如果提交的多了再git commit 文件名 提交。以后每次修改都要重复前两步。git status查看工作目录中的状态git diff 文件名查看文件修改了什么查看提交历史1, 使用git log查看提交的历史版本信息[rootvm1GitTest]# git logcommitb679b01f2ee42c1c4a7e14ed5d37e02da131a98e Author: danieldanielitcast.cnDate: Wed Jan1614:00:4420190800添加了一行代码打印hello linuxcommit0e9371bfdbc27049c31017773248ae8333b5bf3f Author: danieldanielitcast.cnDate: Tue Jan1523:43:5820190800添加了一行代码打印hello pythoncommit4e67190ec3c57f1708702c9eca5aebe88017bdd2 Author: danieldanielitcast.cnDate: Tue Jan1523:23:2620190800提交1.py2, 使用git log –prettyoneline查看提交的历史版本信息, 查看的显示信息更简洁。前面字符串你可以看作就是一个版本号(commit id)。[rootvm1GitTest]# git log --prettyonelineb679b01f2ee42c1c4a7e14ed5d37e02da131a98e 添加了一行代码打印hello linux0e9371bfdbc27049c31017773248ae8333b5bf3f 添加了一行代码打印hello python4e67190ec3c57f1708702c9eca5aebe88017bdd2 提交1.py 说明 PrettyPrint表示美化打印版本回退与还原重点1, 使用git reset --hard HEAD^回退到上一个版本(也就是第2个版本)[rootvm1GitTest]# git reset --hard HEAD^HEADisnow at0e9371b 添加了一行代码打印hello python# --hard 表示强制提交[rootvm1GitTest]# cat 1.pyprint(hello world)print(hello python)说明假设提交历史为A ← B ← C当前 HEAD 指向 C执行 git reset --hard HEAD^ 后就变成了 A ← Bgit reset --hard HEAD^^ 等于 HEAD~2回退到上两个提交2, 使用git reset --hard 第3个版本号还原到第3个版本。但如果我忘了第3个版本号是什么了,使用git reflog查看所有的操作历史。[rootvm1GitTest]# git reflog0e9371b HEAD{0}: reset: movingtoHEAD^b679b01 HEAD{1}:commit: 添加了一行代码打印hello linux0e9371b HEAD{2}:commit: 添加了一行代码打印hello python4e67190 HEAD{3}:commit(initial): 提交1.pyref 是 reference 的缩写指引用命令意为引用日志记录所有引用如 HEAD、分支的移动历史。3, 还原到第3个版本[rootvm1GitTest]# git reset --hard b679b01HEADisnow at b679b01 添加了一行代码打印hello linux[rootvm1GitTest]# cat 1.pyprint(hello world)print(hello python)print(hello linux)4, 回退到上上一个版本, 也就是回退两个版本,使用git reset --hard HEAD^^回退三个版本,使用git reset --hard HEAD^^^, 以此类推。如果回退100个版本那用100个^符号不方便可以换成git reset --hard HEAD~100[rootvm1GitTest]# git reset --hard HEAD^^HEADisnow at4e67190 提交1.py[rootvm1GitTest]# cat 1.pyprint(hello world)小结:提交后的代码文件使用git log查看当前版本及以前的历史版本。使用git reset --hard HEAD^或者git reset --hard HEAD~100实现版本回退。使用git reflog查看提交的所有操作及版本号使用git reset --hard 版本号你可以自由的在不同版本之间来回切换。简单说这是个“时光倒流”命令能让你的 Git 项目直接回到某个版本连带着把工作区和暂存区的改动全扔了。它特别狠不留一点痕迹。git reset --soft只动版本库暂存区和工作区不动。git reset --mixed默认动版本库和暂存区工作区留着。git reset --hard全清啥都不留。git工作流再次理解与应用拓展工作目录里任何修改或增加的文件都要git add到暂存区让暂存区和工作目录的状态一致这样才能提交一个版本。git commit提交的是在暂存区里的所有文件状态。也就是说是整个工作目录里的状态保存为一个版本而不是某一个文件。git版本控制不仅仅是用于项目开发你也可以用于一个软件包仓库的版本控制。撤销修改如果开发者状态不好,今天写的代码一团乱,想吃后悔药,git也提供了撤销的方法。1, 准备一行或一段写错的代码[rootvm1GitTest]# cat 1.pyprint(hello world)print(hello python)print(hello linux)print(hey,xxx is a gay)这是写错的代码需要反悔想要撤销修改有以下方法:直接把写错的代码删除就好, 但如果改变的代码很多开发者自己都忘了具体改了哪些代码这种做法就不方便了使用git checkout – 文件名就可以直接撤销修改了把仓库中的代码拉取覆盖本地代码如果写乱了代码添加暂存区但还没有commit提交。git rm --cached 1.py /手工修复来撤销修改也可以使用命令 git restore --staged 1.py 从暂存区中删除git restore 1.py恢复工作区中的 1.py还可以一条命令搞定 git restore --sourceHEAD --staged --worktree 1.py2.23版本才支持如果写乱了代码添加暂存区并提交了。则使用版本回退 git reset HEAD^| 版本号误删恢复1, 只要文件git add到了暂存区, 无论有没有git commit提交。误删除后都可以使用 git checkout – 文件名来恢复。[rootvm1 GitTest]# touch 2.py[rootvm1 GitTest]# git add 2.py[rootvm1 GitTest]# rm -rf 2.py[rootvm1 GitTest]# ls1.py[rootvm1 GitTest]# git checkout -- 2.py[rootvm1 GitTest]# ls1.py 2.py 说明 工作中git checkout--*更常见星号*表示当前目录下所有的文件2, 如果文件没有git add到暂存区, 误删除了就没了。[rootvm1GitTest]# touch 3.py[rootvm1GitTest]# rm -rf 3.py下面命令恢复报错[rootvm1GitTest]# git checkout -- .error: pathspec2.pydidnotmatchanyfile(s)knowntogit.文件删除1, 没有git add到暂存区的文件直接rm删除就ok2, git add添加到暂存区,但没有git commit提交的文件。需要rm删除本地,还要git rm 文件名删除[rootvm1GitTest]# touch 3.py[rootvm1GitTest]# git add 3.py[rootvm1GitTest]# rm -rf 3.py[rootvm1GitTest]# git rm 3.pyrm3.py3, git add添加到暂存区,并且已经git commit提交的文件需要rm删除本地,再git rm 文件名删除,最后再提交删除[rootvm1GitTest]# touch 3.py[rootvm1GitTest]# git add 3.py[rootvm1GitTest]# git commit -m 提交了3.py[master0236aef]提交了3.py1filechanged,0insertions(),0deletions(-)createmode1006443.py[rootvm1GitTest]# rm -rf 3.py[rootvm1GitTest]# git rm 3.pyrm3.py[rootvm1GitTest]# git commit -m 删除了3.py[master dc4ee5e]删除了3.py1filechanged,0insertions(),0deletions(-)deletemode1006443.pygit rm 3.py这条命令会把 3.py 文件从工作区和暂存区里删掉并且告诉 Git“我要把这个文件从下次提交里去掉。” 它不直接改版本库但会影响下一次提交的内容。小结git分支管理先来考虑一个问题: 开发者A开发软件的某一个功能模块, 还没有开发完成但害怕进度丢失就提交。假设另一位开发者B并不知道A没有完成, 而直接使用了A开发的文件,这造成了问题。解决方法: 开发者A创建一个属于自己的分支(fork)这个分支只属于A不会影响其他人。开发完成后合并到项目主分支即可。分支可以看作为平行空间查看分支默认只有一个master分支, 前面有*号的代表为当前分支。[rootvm1GitTest]# git branch*master创建分支使用git branch 分支名来创建分支[rootvm1GitTest]# git branch dev[rootvm1GitTest]# git branchdev*master切换分支使用git checkout 分支名来切换分支[rootvm1GitTest]# git checkout devSwitchedtobranchdev[rootvm1GitTest]# git branch*dev master合并分支1, 在dev分支上新开发了一个代码文件,添加并提交[rootvm1GitTest]# git branch*dev 确认为dev分支 master[rootvm1GitTest]# echo new feature 4.py[rootvm1GitTest]# git add 4.py[rootvm1GitTest]# git commit -m 增加了新特性[dev4a0c78e]增加了新特性1filechanged,1insertion()createmode1006444.py2, 切换到master分支后,却发现根本没有这个文件[rootvm1GitTest]# git checkout masterSwitchedtobranchmaster[rootvm1GitTest]# cat 4.pycat:4.py:Nosuchfileordirectory3, 合并分支,再查看能在master分支上查看到了[rootvm1GitTest]# git merge devUpdating dc4ee5e..4a0c78e Fast-forward4.py|11filechanged,1insertion()createmode1006444.py[rootvm1GitTest]# cat 4.pynew feature分支冲突面试有些复杂的情况会造成冲突这个时候git就不能帮我们自动的合并分支。我们就要手动处理冲突。1, 在dev分支修改文件[rootvm1GitTest]# git checkout devSwitchedtobranchdev[rootvm1GitTest]# echo 冲突测试 4.py[rootvm1GitTest]# cat 4.pynew feature 冲突测试2, 提交dev分支上的修改[rootvm1GitTest]# git add 4.py[rootvm1GitTest]# git commit -m 冲突测试[dev de5075c]冲突测试1filechanged,1insertion()3, 切回master分支,也修改相同的文件[rootvm1GitTest]# git checkout masterSwitchedtobranchmaster[rootvm1GitTest]# echo master feature 4.py[rootvm1GitTest]# cat 4.pynew feature master feature4, 提交master分支上的修改[rootvm1GitTest]# git add 4.py[rootvm1GitTest]# git commit -m 冲突测试[master c17f325]冲突测试1filechanged,1insertion()5, 合并dev分支到master就会出现冲突了[rootvm1GitTest]# git merge dev # 把dev合并过来也就是合并到master上Auto-merging4.py CONFLICT(content):Mergeconflictin4.py Automaticmergefailed;fix conflictsandthencommitthe result.6, 手工解决冲突面试git使用,,符号分割冲突的内容手动删除这些符号并修改成你想要的内容解决冲突前:[rootvm1GitTest]# cat 4.pynew featureHEAD master feature冲突测试dev 解决冲突后:[rootvm1GitTest]# cat 4.pynew feature 冲突解决7, 解决冲突后添加并提交,最后再合并[rootvm1GitTest]# git add 4.py[rootvm1GitTest]# git commit -m 冲突解决[master fb05c2f]冲突解决[rootvm1GitTest]# git merge devAlready up-to-date.小结什么原因产生了分支冲突、代码冲突答往往是不同的开发人员同时修改了同一份文件或者程序如何解决方案一开发前期要进行合理规划不同开发人员开发不同的模块或者功能代码尽量减少冲突的情况。方案二如果的确出现了分支冲突可以手工修复重新提交重新合并问题就可以解决了删除分支使用git branch -d 分支名来删除分支。注意:不能删除当前使用的分支.[rootvm1GitTest]# git branchdev*master[rootvm1GitTest]# git branch -d devDeleted branch dev(was de5075c).[rootvm1GitTest]# git branch*master恢复分支如果你不小心删除了一个分支还是可以恢复的。# 1 查看该分支的最近一次操作找到 ID 值git reflog恢复语法git branch[新分支名称]之前提交的commit_ID# 2 创建一个分支指向原来的 IDgit branch master 459f9b4# 再次查看发现文件都回来了llTAG标签将commit id关联一个容易记忆的标签更加方便用于版本的更新或回退。打TAG指定 commit id 打TAG# git tag -a v1.0 xxxx -m 稳定版第1版xxxx 表示commit_id 说明-a 是-annotate 的缩写表示创建带注释的标签git log --oneline 可以用于查看commit id。如果不指定commit id则代表最新的commit id将最新的commit id打TAG# git tag -a v1.1 -m 稳定版第2版查看TAG# 查看 tag# git tag# 查看具体 tag 信息# git show v1.0删除TAG# git tag -d v1.0
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2538756.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!