git 相关使用总结

简介

git是Linux之父Linus开发出来的用于分布式版本控制的系统软件, 我们项目就式用git来做版本管理的。

基本原理

u=3456711285,762623164&fm=26&gp=0.jpg

git流程图

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

 

分支管理

696683-20170303101941579-959672434.png

  • master:线上分支   预发环境测试通过后,运营/测试会将此分支代码发布到线上环境;
  • develop:开发分支   开发人员每天都需要拉取/提交的最新代码分支
  • release:测试分支/预发布分支  开发人员自测通过的bug或功能提交到此分支 发布测试环境 给测试人员测试 大公司一般测试环境和预发布环境是分开的,预发布的数据跟正式的数据库是共用的 这时测试环境测完了才合到预发布分支
  • feature:功能开发分支   开发人员基于dev分支创建的新功能开发分支,开发完成合并到develop  多个新功能可同时进行开发
  • hotfix:bug修复分支  基于dev或master分支创建的用于bug修复的分支  一般修复完要到release分支进行测试再发布到线上  若基于master修复的 可提交后使用cherry-pick进行复制到develop和release分支

常用命令

  • 初始化区(开发前准备 相关命令)----------------- 拉取远程仓、初始本地仓  保持本地仓和远程仓一致

     git config --global user.name  '用户名'  配置全局用户名

     git config --global user.email 'git账号'  配置全局用户账号

     git config --global  --unset user.xxx 删除全局配置

 

    git init 初始化git仓库

     git remote add origin git@server-name:path/project-name.git 关联远程仓

     git remote rm origin 删除已关联的远程仓库

     git remote set-url origin  git@xxx:xxxxx.git  更新关联的远程仓库

     git remote -v   查看远程关联仓库

 

     git clone  git@server-name:path/project-name.git  project-name 克隆远程仓库代码到本地

 

  • 开发区(开发过程中 常用命令)-------------------- 本地仓操作、推送远程仓 实现文件最新修改更新至远程仓

      git branch  查看分支(本地)

git branch -a   查看分支(本地+远程)

git branch <name> 新建本地分支

git checkout <name> / git switch <name>  切换分支 (如果暂存区有内容会切换到新分支、但是commit的不会被移过去)

git checkout -b <name> / git switch -c <name>   创建+切换

      git checkout -b <name> origin/<name>  创建并切换新分支且与远程分支建立联系

git branch -d <name>   删除某分支

git branch -D <name>   强制删除某分支

      git branch |grep 'xxx' |xarhs git branch -D  批量删除分支

      git merge <name>    合并分支到当前分支

     git remote update origin -p  /  git remote update origin --prune 刷新远程仓库分支(清理无效远程追踪分支)

 

      git add <file> 添加到暂存区

     git commit -m <message> 提交到本地仓库

      git branch --set-upstream-to <branch-name> origin/<branch-name> /

      git branch --set-upstream-to=origin/<branch-name> <branch-name> 本地分支和远程分支建立联系(第一次推)

    git push    本地仓推送到远程仓

     git push  --set-upstream origin test / git push  -u origin test  推送远程库(第一次推送,要建立联系)

      git push origin HEAD --force 强制推送更新远程仓

      git merge  --no-ff -m 'merge with no-ff' dev  合并分支到当前分支(禁用Fast forward模式)

      git rebase 整理提交历史分叉线为一条直线(但分支提交被修改了 不建议使用)

 

      git status   查看工作区状态

     git diff  查看修改内容

git log   查看提交历史,回退版本可用

git log --oneline  查看历史记录的紧凑简洁版本

git reflog  查看命令历史,重置回退版本操作可用

 

git checkout -- file  丢弃工作区的修改 (git add 之前用)

git reset HEAD <file> 丢弃暂存区的修改(git add 之后git commit之前用)

git reset --soft HEAD^  取消上一步commit (commit内容不会删除 会在暂存区可再次提交)

git reset --hard commit_id  版本穿梭  (git commit之后用,也可配合强制推送使用实现回退远程仓)

git reset --hard HEAD^  本地回退上一个commit

git reset --hard HEAD~3 本地回退3个commit之前的版本,以此类推,回退到n之前

git rm file  删除文件(暂存区和目录都会删掉)

 

git satsh  暂存工作现场代码

git stash list   查看储藏的代码列表

git stash apply 取出最新储存的代码(不会删除)

git stash drop 删除最新储存的代码

git stash pop 取出+删除最新储存的代码

git stash clear  清空储藏区

 

  • 维护区(开发完成之后  常用命令)-----------------  拉取远程区  修复更新远程区

       git tag <name>   打标签(默认为HEAD)

       git tag <name> commitId   给某一次commit打标签

       git tag -a <name> -m  '说明文字--' 打带说明的标签(用-a指定标签名,-m指定说明文字)

       git tag   查看所有标签

       git show <tagname>  查看某个标签

      git tag -d <name>  删除标签

      git push origin <tagname> 推送某标签到远程

       git push origin --tags  一次性推送未推送的本地标签到远程

 

      git cherry-pick commitId  复制特定提交到当前分支

 

常见问题及处理

Q:版本回退

A: 先回退本地仓库代码,再推送到远程更新---->先git reset --hard HEAD~3  再 git push origin HEAD --force

 

Q:删除远程标签

A:先删除本地标签 再推送远程删除---> 先git tag -d <tagname>     再git push origin :refs/tags/<tagname

 

Q: 拉取别人代码分支合并后 不小心删除了别人上传的文件 再拉取提示already-up 怎么办

A: 回滚代码 重新拉取

 

Q: git pull遇到错误:error: Your local changes to the following files would be overwritten by merge

A:原因是本地有未提交代码  

    解决方案:

    ①stash保存 再拉取  stash apply取出 ;

    ② 如果本地代码不想要 可以直接 git reset --hard 再拉取

 

Q: git push后出现 src refspec dev does not match any

A: 问题应该是出在了本地分支和远程当前分支不匹配上  新建切换分支 重新提交

 

Q:git 使用出现MERGING状态 无法提交

A:出现原因 是本地git 和远程 git版本不一致 有冲突

   三种解决方法:

   1.解决冲突,删除代码中矛盾的代码,然后上传或者下拉

   2.回退git reset --hard head到操作前的状态 (一般使用这条即可 但是使用前要记得备份一下本地修改代码)

   3.discard删除下载的,或者上传的代码,然后分别check out两个分支

 

Q: 不小心把本地的某些文件上传到远程仓库/想要删除远程仓库中的文件

A:使用git rm --cached filename 命令 取消对该文件的追踪  git下次提交就不会提交这个文件 从而远程库的该文件也会被删除

 

Q:每次git push 都会要输入用户名、密码

A:

step 1:打开git bash  生成公钥     ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  三次回车

step 2:查看已生成的公钥   cat ~/.ssh/id_rsa.pub

step3:复制已生成的公钥添加到 git 服务器  并测试 ssh 是否能够连接成功  ssh -T git@github.com

step4:使用 ssh 协议 clone 远程仓库 或者 如果已经用 https 协议 clone 到本地了,那么就重新设置远程仓库

git remote set-url origin git@xxx.com:xxx/xxx.git

 

Q:git不允许提交空文件夹

A:当前目录 添加一个 .gitkeep 文件

 

Q: 如何修改最后一次提交 修订提交历史

A: git commit --amend   会打开编辑器  允许你修改commit 提交信息  / 或者新加修改的文件提交

 

Q:分支名称出现拼写错误

A:  

  1. 没有push ------->  git branch -m future-brunch feature-branch;
  2. 已经push 到远程分支  ----->

       git branch -m future-brunch feature-branch; // 改名

       git push origin --delete future-brunch   // 删除远程错误名分支

       git push origin feature-branch   // 重新推送

 

Q: 删除远程分支

A: git branch -d <name>  

     git push origin --delete <name>

 

Q: git push 或者  git clone时报错:RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

A: git上传文件有限制文件大小   当前上传文件超出git限制 

       处理方案: git config http.postBuffer 524288000

 

Q: git分支如何强制覆盖

A:两个方案--

   方案Ⅰ.git push origin test:master -f           //将test分支强制(-f)推送到主分支master

   方案Ⅱ.

      git checkout master                          //将当前分支切换到主分支

      git reset --hard test                            //将主分支重置为test分支

      git push origin master -f             //将重置后的master分支强制推送到远程仓库

 

名词备注

  • 版本控制:开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的技术。('后悔药')
  • 分布式:版本控制的一种方式,中心服务器控制最新版本代码,每个开发者自己还有一个本地仓库,开发过程中先把代码提交到本地再推送到服务器上。 如下图:

      image.png

  • 集中式:版本库放在中央服务器上,当需要的时候从中央服务器取得最新版本,修改完毕之后上传到中央服务器。如下图:

     image.png

  • 其他常见的版本控制工具:SVN、CVS (三者的共同点是:免费开源;不同点是:git是分布式  后者是集中式;git不需要联网,后者需要联网)

 

  • Fast forward模式:git合并分支的默认模式,删除分支会丢掉该分支信息;使用 --no-ff则会生成一条新的commit记录,会禁用该模式
  • 知识点:Git Reference简写为refs,是管理本地分支的

                  1)本地分支的Reference格式:refs/heads/<local_branch_name>

                    如refs/heads/master,在保证唯一的情况下可以简写为master

                  2)远程追踪分支的Reference格式:refs/remotes/ <remote_repository>/<remote_branch_name>

                Reference Specification简称refspec    在执行push或fetch操作时,refspec用以给出本地Ref和远程Ref之间的映射关系

 

参考文献

1.廖雪峰的git教程:https://www.liaoxuefeng.com/wiki/896043488029600

2.开发工具之git: https://www.cnblogs.com/wangxinwen/p/9836936.html

3.国外友人总结常用命令: https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值