git的使用
Git的使用
git git称为版本控制的神器,如果你不小心把当前版本删了,也照样可以恢复到原先的样子,其功能强大 git中分为三个区域,工作区,暂存区, 历史区 git用法 1.建立仓库的方法 1.1 创建git仓库 对新仓库进行初始化 >>git init 初始化后会在目录建立.git目录,所有资源和数据都会存放在这个目录中 origin - 这是 Git 给你克隆的仓库服务器的默认名字
>>git remote add origin http://xxx/xx.git 如果想要修改或者添加origin可以使用这个命令,其中origin可以叫其他名字,之后你本地写http://xxx/xx.git就直接写origin就行了 1.2 克隆git仓库 >>git clone https://xxx.git 如果要制定新项目名 >>git clone https://xxx.git <new_object_name> 2.文件的变化周期 目录文件状态无外乎两种状态:已跟踪或未跟踪 2.0 查看历史区 >>git log 2.1 查看文件状态 >>git status 2.2 未跟踪状态 因为git考虑到一些临时文件,例如日志文件,这些都是不需要被我们使用,所以都是未跟踪状态 2.2.1 gitignore文件格式 通常创建cat .gitignore文件来存储无用的文件,文件第一行定义.[oa]表示忽略.a或者.o的文件 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。 可以使用标准的 glob 模式匹配。 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 如:file/ 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。如:!a.py 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字) 2.2.1 gitignore文件格式例子 # 此为注释 – 将被 Git 忽略 # 忽略所有 .a 结尾的文件 *.a # 但 lib.a 除外 !lib.a # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO /TODO # 忽略 build/ 目录下的所有文件 build/ # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录下所有扩展名为 txt 的文件 doc/**/*.txt 2.3 已跟踪状态 如果我们想要一个新文件状态变为已跟踪,>>git add <new_file_name> 如果想要添加目录中的全部文件 >>git add . 或者 >>git add -A,此时文件处于暂存状态,这里add的意思就是把目标文件的快照放入暂存区 2.3 暂存区状态 git status查看状态,只要在 “Changes to be committed” 这行下面的,就说明是已暂存状态 2.3.1 修改已暂存文件 当修改完已暂存的文件,git status查看发现Changes not staged for commit表示说明已跟踪文件的内容发生了变化,但还没有放到暂存区,
需要运行git add命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等) 2.3.2 删除已暂存文件 >>git rm --cached <file_name> ,如果要删除目录所有的文件 >>git rm --cached . -r 2.4 已暂存和未暂存的更新 git status只能列出文件是否被修改,如果需要查看文件修改了什么地方使用git diff 2.4.1 工作区与暂存区与历史区的比较 >>git diff 查看工作区的文件和暂存区的文件快照之间的差异 >>git diff <master或者分支名> 查看工作区的文件和历史区的文件快照之间的差异 >>git diff --cached 查看暂存区的文件快照和历史区的文件快照之间的差异 >>git diff --staged 效果相同(Git 1.6.1 及更高版本) 2.5 提交更新 >>git commit <filename> -m"<message>" 一次性提交更新是把暂存区的文件提交到历史区 >>git commit <filename> -a -m"<message>" 一次性把工作区数据通过命令直接到历史区 2.6 区域之间的滚动 2.6.1 暂存区还原工作区 >>git checkout <file_name> 从暂存区中将内容覆盖到工作区 2.6.2 暂存区上一次版本还原到工作区 >>git reset HEAD <file_name> 从暂存区的上一个版本内容覆盖到工作区 2.6.3 历史区版本滚动 >>git reset --hard HEAD^ 回滚上一级版本 >>git reset --hard <版本号> 历史区版本覆盖暂存区和工作区,注意回到之前版本想要再回到现在版本通过git log看不到所有日志,可以通过git reflog查看所有版本日志,拿到版本号回滚 3.从远程仓库操作 本地->第三方库或者github库 3.1 获取远程仓库的数据 >>git fetch [remote-name] 这个命令会访问你的远程仓库,从中拉取你还没有获取的数据,执行完成后,你会拥有那个远程仓库中所有分支的引用,可以随时合并和查看 注意 git fetch命令会将数据拉取到你的本地仓库的历史区,并不会合并到你的的工作区,之后可以使用git merge origin/master 合并,所以git fetch|git merge 等价于 git pull 3.2 添加关联并推送到远程仓库 >>git remote add <origin> <https://xx地址.git> //关联地址,git默认<origin>,之后可以用origin来代替<url>使用 >>git push [remote-name] [branch-name] 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器 >>git push -u <origin> master //-u表示第一次推送后,下一次就不需要填写origin master了 3.3 查看远程仓库 >>git remote -v >>git remote show [remote-name] >>git remote show <origin> 查看默认分支信息 3.4 远程仓库的移除与重命名 >>git remote rename [oldname] [newname] 重命名 >>git remote rm [name] 删除 3.5 拉取远程仓库数据 >>git pull <origin> master //常见错误,线上线下代码重复,线上代码拉到线下 git pull origin master,自动合并发现错误,提示合并失败,手动修改代码, 提交数据commit,再pull到线上 4.git的配置 4.0 用户配置 不配置不能提交代码
>>git config --list 查看配置历史
1.项目配置文件: 你的项目/.git/config
>>git config --local user.name <your name>
>>git config --local user.name <your email>
2.全局配置文件: ~/.gitconfig >>git config --global user.name <your name> >>git config --global user.email <your email>
3.系统配置文件: /etc/.gitconfig 要有root权限
>>git config --system user.name <your name>
>>git config --system user.email <your email>
配置读取的顺序是项目配置>全局配置>系统配置
4.1 免密登录
1.url体现
#在配置文件的url改写成
url = https://你的用户名:密码@github.com/xxx/xx.git
2.ssh实现
linux中实现三步:
1.linux中安装git
2.在github或者其他代码库注册
3.在linux中创建ssh公私钥
ssh-keygen -t rsa -C "your email"
vi /root/.ssh/id_rsa.pub 之后复制代码添加到github的ssh公钥中,并且在git本地配置ssh地址,在git项目中会有ssh的地址链接
不同版本的git在linux中输入账户密码有些会记录之后在拉取代码就不需要输入密码了,而有些则还是要输入的情况通过下面方式↓
pull添加需要密码,如果出现一直让输入密码,可以设置 git config --global credential.helper store,当然如果要取消长期密码账号存储的话在vi ~/.git-credentials,将账号密码删除即可
3.git凭证 默认第一次输入后密码会保存在相关区域或者是相关软件中,这个功能是git自动管理,无需人员参与的
4.2 master/origin
git默认clone下来的代码默认master分支,如果需要拉取其他分支,需要创建一个新的分支,再拉取它 git中.git文件的config是配置文件,其默认配置了你的远程仓库地址,默认远程仓库地址别名(origin),当然你也可以修改它,因为你的仓库地址一般都很长,之后你就可以使用别名来替换地址了 5.git 分支操作 当文件的根路径必须提交了一次后才会有分支 5.1 查看分支 >>git branch 5.2 创建分支 >>git branch <分支名> 创建了一个分支,拷贝当前的分支/master到新的分支中 5.3 切换分支 >>git checkout <分支名> >>git checkout -b <分支名> 创建并切换分支 5.4 删除分支 >>git branch -D <分支名> 删除分支时,当前用户不能在当前删除的分支中,-d小写也是一样
>>git push origin -d <分支名> 删除远程的分支,其实在本地push一个空的分支过去也可以实现删除
5.6 合并分支 >>git merge <分支名> 注意合并前需要提前切换到想要合并的分支中,如:dev分支代码要提交到主master上,也就是dev要合并到master,这时需要切换到master分支中,使用git merge dev 如果合并分支遇到冲突只能手动解决留下想要的结果并再次提交
5.7 分支的切换文件的归属
只有当文件commit操作后,也就是在历史区中后,谁提交的文件,另外分支不可查看到此文件
所以除了提交到历史区外,文件在不同分支时是可以共享查看的
当修改了文件而没有提交,并且想要切换到另外分支,git给出暂存文件的方法
>>git stash 检测当前目录下的未跟踪文件文件(也就是git中显示红色的文件),如果有,移动这些文件到一块隐藏区域,隐藏区域代码不会被提交
>>git stash pop 将当前目录下存放在隐藏区域的文件再次合并在当前目录(合并可能会产生冲突,拉取的是第一条记录,也就说pop可以有多次)
>>git stash list 查看隐藏区域所有记录
>>git stash apply <编号> 由于隐藏区域可以重复提交,可能会存在多个,可以使用此命令来选择拉取回指定文件到工作区(可能会产生冲突,编号可以从git stash list中获取)
>>git stash clear 清空隐藏区域
5.8 分支记录修正(变基) 当出现提交后忘记pull到远程仓库,之后出现添加新文件,推送到远程仓库,然后再拉取时提示需要merge合并(因为合并可能造成分支节点出现分叉记录)或者提交记录过多,导致git log有大量的记录这时如何简洁提交记录呢,可以使用 rebase保持提交记录的整洁性,通过下面2条命令就不会出现分叉记录了
>>git rebase <仓库地址/分支名> git rebase origin/master
>>git rebase -i HEAD~3 当前所在的分支的记录与当前分支记录的最近3条记录进行合并,之后会出现记录合并vim框,最上放会显示版本排序从初始到最近,默认都为pick指令,s指令表示这个版本会合并他上一个版本,之后还需要填写提交信息才算合并成功
>>git rebase -i 版本号 当前所在的分支的记录与版本号的记录进行合并
--------------------------
>>git fetch <仓库地址/分支名> #这种情况是忘记提交到远程代码仓库导致之后提交代码会出现merge情况
>>git rebase <仓库地址/分支名>
# 注意:尽量不要合并已经提交到远程仓库的记录(push操作),可能会很繁琐
rebase产生冲突时先解决冲突,再git add 添加到暂存区,之后执行git rebase --continue
6.0 分支记录图形化
>>git log --graph 在git历史显示图片化的分支记录 --pretty=format:"%h %s" s表示提交的版本 h表示提交的记录
6.git的标签 tag
使用git log可以查询版本的号,发现是一大串哈希值,其实公司会以tag方式来命名版本,如v1,v3,所以如果打了tag就等于哈希值
>>git tag -a v1 -m 'xxxx' #在git的本地创建了当前版本的一个tag 参数-a表示v1是版本号 -m是版本描述
>>git push origin dev --tags #推送到dev分支并把本地的标签也推到远程去
git工作流
1.git-flow 适用于中高型企业,给代码管理分支一种清晰化的流程结构和规范,其中的分支有开发分支(dev),主干分支(master),预发布分支(release),紧急修复分支(hotfix)
dev:主干开发分支,主要是所有的开发任务分支,它可以根据业务的大小的细分各自的特性分支(Feature分支),通过开发分支包括测试在内,理解为主干开发分支是一个测试成功的版本,再流向release分支
release:预发布分支,主要是合并主dev分支,一般线上没问题就删除这个分支
master:生产环境分支
hotfix:在master分支发现bug,需要手动创建一个全新的分支去修复这个bug,流向release分支,一般线上没问题就删除这个分支
https://www.cnblogs.com/wish123/p/9785101.html
版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。