设为首页 收藏本站
查看: 707|回复: 0

[经验分享] 一个很流行的版本控制系统Git学习笔记

[复制链接]

尚未签到

发表于 2018-9-17 06:10:09 | 显示全部楼层 |阅读模式
  什么是Git  
  Git是一种非常流行的分布式版本控制系统,它和其他版本控制系统的主要差别在于Git只关心文件数据的整体是否发生变化,而大多数版本其他系统只关心文件内容的具体差异,这类系统(CVS,Subversion,Perforce,Bazaar 等等)
  每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容
  Git另一个比较好的地方在于绝大多数操作都可以在本地执行,而每个本地都可以从服务器获取一份完整的仓库代码
  而且在没网时仍然可以修改和使用大部分命令,在方便时再跟服务器进行同步,这样可以更好的实现多人联合编程
  另外个人感觉Git系统的强大在于它创建了一个个类似于快照的东西
  记忆我们每一次的提交并且可以在未来的任何时候回到这里,对于大型项目的管理非常有效
  最原始的版本控制是纯手工的版本控制:修改文件,保存文件副本。有时候偷懒省事,保存副本时命名比较随意
  时间长了就不知道哪个是新的,哪个是老的了,即使知道新旧,可能也不知道每个版本是什么内容
  相对上一版作了什么修改了,当几个版本过去后,很可能就是下面这个老土的样子了:
DSC0000.png

  
  Git特点
  分布式相比于集中式的最大区别在于开发者可以提交到本地
  每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库
  直接记录快照,而非差异比较 : Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中
  近乎所有操作都是本地执行 :在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网
  时刻保持数据完整性 :在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算
  并将此结果作为数据的唯一标识和索引
  多数操作仅添加数据 :常用的 Git 操作大多仅仅是把数据添加到数据库
  开发流程示意图:
DSC0001.png

  1、基本概念
  Stage:暂存区,缓存区
  Repository:仓库(本地仓库).git目录
  Remote:远程仓库
  Track: 将一个新文件加入到git
  Unstage:取消放入暂存区
  Git存储原理
  Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
  快照管理:(微型文件系统,文件指纹验证是否变化,不便的直接链接)
DSC0002.png

  三种区域
DSC0003.png

  所有数据存放在本地.git目录,可以直接拷贝。
  2、基本操作
  
  2.1、仓库创建
  Git init
  2.2、仓库复制
  Git clone  url
  只会复制master下来
  Git clone  url dir
  指定文件夹
  git clone https://github.com/libgit2/libgit2 mylibgit
  2.3、文件管理
  2.3.1、添加文件到暂存区
  Git add *
  Git add file
  Git add dir
  2.3.2、删除文件到暂存区
  Git rm
  2.3.3、修改文件名(移动)到暂存区
  Git mv [file-orgin]  [file-rename]
  2.3.4、提交暂存区到仓库
  Git commit –m “注释”
DSC0004.png

  2.3.5、撤销修改文件
  修改的文件可以在git status观察到
  如果撤销修改
  可以采用git checkout -- file的方式撤销
  撤销所有
  git checkout  -- *
  2.3.6        撤销暂存区数据
   DSC0005.png
  
  2.4、分支管理
  查看分支:git branch
  创建分支:git branch
  切换分支:git checkout
  创建+切换分支:git checkout -b
  合并某分支到当前分支:git merge
  默认使用fast-forward模式
DSC0006.png

  可以禁用,合并时会生成一个新的commit
  git merge --no-ff -m "merge " dev
  删除分支:git branch -d
DSC0007.png

  远程分支下载:git checkout -b  origin/
  合并冲突:
  当merge出现冲突的时候,git会提醒
DSC0008.png

  需要手动修改后进行提交
  Git add
  Git commit
  2.5、版本管理
  每个提交都是一个版本,git提供了一些方便的命令供我们使用。
  2.5.1、查看日志
  Git log
  当前分支的commit历史
  有用的配置
  log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit
DSC0009.png

  Git reflog
  显示引用变化历史,相当于head变化
DSC00010.png

  2.5.2、版本回退:
  一个git reset --hard HEAD^
  俩git reset --hard HEAD^^
  多个git reset --hard HEAD~数字
  回退到指定版本
  git reset --hard commit_id
  commitid可以从reflog或者log中查看
  --hard表示丢弃暂存区的东西
  --soft – 暂存区和工作目录都不会被改变,改变都放在暂存区
  --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响,改变不会放在暂存区。
  --hard – 缓存区和工作目录都同步到你指定的提交
  Git revert
  reset是指将当前head的内容重置,不会留任何痕迹。
  revert是撤销某一次提交,但是这次撤销也会作为一次提交进行保存
  假设当前有3个commit,git log如下:
  commit3:  add test3.c
  commit2:  add test2.c
  commit1:  add test1.c
  执行 git revert HEAD~1之后,会提示提交信息,提交后git  log如下:
  commit4:  Reverts “test2.c”
  commit3:  test3.c
  commit2:  test2.c
  commit1:  test1.c
  执行完后,test2.c被删除了,运行git status,无任何变化。
  执行 git reset HEAD~1之后,再次看git log,如下:
  commit2:  test2.c
  commit1:  test1.c
  执行完后,commit3被删除了
  但是test3.c还在本地缓存区,运行git  status,可以看见提示test3.c可以用git add包含该文件。
  若执行git reset --soft HEAD~1,log为:
  commit2:  test2.c
  commit1:  test1.c
  执行完后,test3.c也被删除了,查看git  status,提示可以commit以提交test3.c,test3.c在暂存区。
  若执行git reset --hard HEAD~1,log为:
  commit2:  test2.c
  commit1:  test1.c
  执行完后,test3.c也被删除了,查看git  status,无任何变化。
  2.6、标签管理
  2.6.1、打标签
  相当于给某个提交取一个好记住的名字,例如v1.0.0
  git tag v1.0.0 [commitid]
  2.6.2、显示所有标签
  git tag
  2.6.3、显示标签信息
  Git show tagname
  2.6.4、标签管理
  命令git push origin 可以推送一个本地标签;
  命令git push origin --tags可以推送全部未推送过的本地标签;
  命令git tag -d 可以删除一个本地标签;
  命令git push origin :refs/tags/可以删除一个远程标签。
  2.7、远程管理
  一般都要和两部分人提供
  2.7.1、git clone
  从远程主机克隆一个版本库
  git clone  
DSC00011.png

  2.7.2、git remote
  为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
  列出所有主机:git remote
  带网址列出主机:git remote –v
  clone版本库的时候,所使用的远程主机自动被Git命名为origin
  如果想用其他的主机名,需要用git clone命令的-o选项指定。
  git clone -o jQuery https://github.com/jquery/jquery.git
  git remote show命令加上主机名,可以查看该主机的详细信息。
  git remote show
  git remote add命令用于添加远程主机。
  git remote add  
  git remote rm命令用于删除远程主机。
  git remote rm
  git remote rename命令用于远程主机的改名。
  git remote rename  
  2.7.3、git fetch
  将某个远程主机的更新,全部取回本地。
  如果只想取回特定分支的更新,可以指定分支名。
  git fetch  
  所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取
  比如origin主机的master,就要用origin/master读取。
  git branch  –r,可以用来查看远程分支,
  -a选项查看所有分支。
  可以采用git checkout / 切换到该分支
  但是一般用git checkout -b newBrach /
  意思是在/ 的基础上,创建一个新分支。
  也可以使用merge,合并远程分支。
  2.7.4、git pull
  取回远程主机某个分支的更新,再与本地的指定分支合并。
  git pull  :
  等同于先做git fetch,再做git merge
  2.7.5、git push
  命令用于将本地分支的更新,推送到远程主机。
  git push   :
  省略远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名)
  如果该远程分支不存在,则会被新建。省略本地分支名,则表示删除指定的远程分支
  如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
  如果本地版本低,那么会报错,可以--force强制push,--tags表示也推送tags.
  git push --force origin
  2.7.6、将本地库推到远程端
  git push origin master
  2.8、自定义Git
  2.8.1、自定义命令
  可以利用git config命令来给命令取别名。
  例如
  git config --global alias.co csheckout
  git config --global alias.ci commit
  git config --global alias.br branch
  git config --global alias.unstage 'reset HEAD'
  其中,global表示针对当前用户所有仓库都起作用
  如果不加,表示只对当前仓库有用,每个仓库的Git配置文件都放在.git/config文件中:
  当前用户的config存放在用户主目录下的一个隐藏文件.gitconfig中:
  2.8.2、忽略文件
  为了防止没用的文件被提醒untracked,可以在git仓库主目录下添加.gitignore文件
  (本身要放到版本库里面),该文件可以配置git要忽略哪些文件,不添加到仓库中。

  如果发现不能添加文件,可以采用
  git check-ignore -v file检查被哪个规则忽略了


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-587685-1-1.html 上篇帖子: 巧用第三方开源工具trash-git放置linux误删除文件 下篇帖子: Git 初始化版本库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表