码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【linux命令讲解大全】012.Git:分布式版本控制系统的先驱和常用命令清单(一)


    文章目录

    • Git
      • 补充说明
      • Git常用命令清单
        • 语法
        • 选项
        • 例子
          • init
          • status
          • add
          • commit
          • remote
          • push
          • clone
          • 配置
          • 常见使用场景
            • 创建SSH密钥
            • 多账号ssh配置
            • 免密码登录远程服务器
            • https协议下提交代码免密码
            • 文件推向3个git库
            • 修改远程仓库地址
            • 撤销远程记录
            • 放弃本地的文件修改
    • 从零学 `python`

    Git

    Git是目前世界上最先进的分布式版本控制系统。

    补充说明

    很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

    Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

    事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

    你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

    不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

    安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

    Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

    Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

    Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

    历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

    Git常用命令清单

    语法

    git [--version] [--help] [-C ] [-c name=value]
       [--exec-path[=]] [--html-path] [--man-path] [--info-path]
       [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
       [--git-dir=] [--work-tree=] [--namespace=]
        []
    
    • 1
    • 2
    • 3
    • 4
    • 5

    选项

    • add: 将文件内容添加到索引
    • bisect: 通过二进制查找引入错误的更改
    • branch: 列出,创建或删除分支
    • checkout: 检查分支或路径到工作树
    • clone: 将存储库克隆到新目录中
    • commit: 将更改记录到存储库
    • diff: 显示提交,提交和工作树等之间的更改
    • fetch: 从另一个存储库下载对象和引用
    • grep: 打印匹配图案的行
    • init: 创建一个空的Git仓库或重新初始化一个现有的
    • log: 显示提交日志
    • merge: 加入两个或更多的开发历史
    • mv: 移动或重命名文件,目录或符号链接
    • pull: 从另一个存储库或本地分支获取并合并
    • push: 更新远程引用以及相关对象
    • rebase: 转发端口本地提交到更新的上游头
    • reset: 将当前HEAD复位到指定状态
    • rm: 从工作树和索引中删除文件
    • show: 显示各种类型的对象
    • status: 显示工作树状态
    • tag: 创建,列出,删除或验证使用GPG签名的标签对象

    例子

    init
    git init # 初始化
    
    • 1
    status
    git status # 获取状态
    
    • 1
    add
    git add file # .或*代表全部添加
    git rm --cached  # 在commit之前撤销git add操作
    git reset head # 好像比上面git rm --cached更方便
    
    • 1
    • 2
    • 3
    commit
    git commit -m "message" # 此处注意乱码
    
    • 1
    remote
    git remote add origin git@github.com:JSLite/test.git # 添加源
    
    • 1
    push
    git push -u origin master # push同事设置默认跟踪分支  
    git push origin master  
    git push -f origin master # 强制推送文件,缩写 -f(全写--force)
    
    • 1
    • 2
    • 3
    clone
    git clone git://github.com/JSLite/JSLite.js.git
    git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹
    git clone [user@]example.com:path/to/repo.git/ # SSH协议还有另一种写法。
    
    • 1
    • 2
    • 3
    配置

    首先是配置帐号信息 ssh -T git@github.com 测试。

    修改项目中的个人信息:

    git help config # 获取帮助信息,查看修改个人信息的参数  
    git config --global user.name "小弟调调"           # 修改全局名字
    git config --global user.email "wowohoo@qq.com"  # 修改全局邮箱
    git config --list         # 查看配置的信息  
    
    • 1
    • 2
    • 3
    • 4

    配置自动换行:

    自动转换坑太大,提交到git是自动将换行符转换为lf

    git config --global core.autocrlf input
    
    • 1
    常见使用场景
    创建SSH密钥

    这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github

    ssh-keygen -t rsa -C 'wowohoo@qq.com' # 生成密钥  
    ssh-keygen -t rsa -C "wowohoo@qq.com" -f ~/.ssh/ww_rsa # 指定生成目录文件名字
    ssh -T git@github.com # 测试是否成功
    
    • 1
    • 2
    • 3
    多账号ssh配置
    1. 生成指定名字的密钥
    ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa
    
    • 1
    1. 密钥复制到托管平台上

    打开公钥文件 jslite_rsa.pub,并把内容复制至代码托管平台上

    1. 修改config文件

    修改 ~/.ssh/config 文件,如果没有则创建

    Host jslite.github.com
      HostName github.com
      User git
      IdentityFile ~/.ssh/jslite_rsa
    
    Host work.github.com
      HostName github.com
      User git
      IdentityFile ~/.ssh/work_rsa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 测试
    ssh -T git@jslite.github.com  # `@`后面跟上定义的Host  
    ssh -T work.github.com        # 通过别名测试
    ssh -i ~/公钥文件地址 Host别名  # 如 ssh -i ~/.ssh/work_rsa work.github.com
    
    • 1
    • 2
    • 3
    1. 使用

    原来的写法:

    git clone git@github.com:/learngit.git
    
    • 1

    现在的写法:

    git clone git@jslite.github.com:/learngit.git
    git clone git@work.github.com:/learngit.git
    
    • 1
    • 2
    免密码登录远程服务器
    ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key
    ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次
    
    • 1
    • 2

    编辑 ~/.ssh/config:

    Host aliyun1
      HostName 192.168.182.112
      User root
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/aliyunserver.key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面配置完了,可以通过命令登录,不需要输入IP地址和密码 ssh aliyun1

    https协议下提交代码免密码
    git clone https://github.com/username/rep.git
    
    • 1

    通过上面方式克隆可能需要密码,解决办法:进入当前克隆的项目 vi rep/.git/config 编辑 config, 按照下面方式修改,你就可以提交代码不用输入密码了。

    [core]
    	repositoryformatversion = 0
    	filemode = true
    	bare = false
    	logallrefupdates = true
    	ignorecase = true
    	precomposeunicode = true
    [remote "origin"]
    -	url = https://github.com/username/rep.git
    +	url = https://用户名:密码@github.com/username/rep.git
    	fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
    	remote = origin
    	merge = refs/heads/master
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    文件推向3个git库
    1. 增加3个远程库地址
    git remote add origin https://github.com/JSLite/JSLite.git  
    git remote set-url --add origin https://gitlab.com/wang/JSLite.js.git  
    git remote set-url --add origin https://oschina.net/wang/JSLite.js.git
    
    • 1
    • 2
    • 3
    1. 删除其中一个 set-url 地址
    usage: git remote set-url [--push]   []
       or: git remote set-url --add  
       or: git remote set-url --delete  
    git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git
    
    • 1
    • 2
    • 3
    • 4
    1. 推送代码
    git push origin master
    git push -f origin master  # 强制推送
    
    • 1
    • 2
    1. 拉代码

    只能拉取 origin 里的一个url地址,这个 fetch-url 默认为你添加的到 origin 的第一个地址

    git pull origin master   
    git pull --all # 获取远程所有内容包括tag  
    git pull origin next:master # 取回origin主机的next分支,与本地的master分支合并  
    git pull origin next # 远程分支是与当前分支合并  
    
    # 上面一条命令等同于下面两条命令   
    git fetch origin  
    git merge origin/next  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致 git pull 不知不觉删除了本地分支。
    但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

    $ git pull -p
    # 等同于下面的命令
    $ git fetch --prune origin 
    $ git fetch -p
    
    • 1
    • 2
    • 3
    • 4
    1. 更改pull

    只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。

    修改远程仓库地址
    git remote remove origin  # 删除该远程路径  
    git remote add origin git@jslite.github.com:JSLite/JSLite.git  # 添加远程路径 
    
    • 1
    • 2
    撤销远程记录
    git reset --hard HEAD~1 # 撤销一条记录   
    git push -f origin HEAD:master # 同步到远程仓库
    
    • 1
    • 2
    放弃本地的文件修改
    git reset --hard FETCH_HEAD # FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull
    git reset --hard FETCH_HEAD 出现错误
    
    git pull
    You are not currently on a branch, so I cannot use any
    'branch..merge' in your configuration file.
    Please specify which remote branch you want to use on the command
    line and try again (e.g. 'git pull  ').
    See git-pull(1) FOR details.
    解决方法:
    
    git checkout -b temp # 新建+切换到temp分支 
    git checkout master
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    从零学 python

    【从零学习python 】92.使用Python的requests库发送HTTP请求和处理响应
    【从零学习python 】91. 使用装饰器和字典管理请求路径的简洁Web应用
    【从零学习python 】93.使用字典管理请求路径
    【从零学习python 】89. 使用WSGI搭建简单高效的Web服务器
    【从零学习python 】88. WSGI接口详解:实现简单高效的Web开发
    【从零学习python 】87. 手动搭建HTTP服务器的Python实现及多线程并发处理
    【从零学习python 】86. 深入了解HTTP协议及其在浏览器和服务器通信中的作用
    【从零学习python 】85.Python进程池的并行计算技术应用
    【从零学习python 】84.深入理解线程和进程
    【从零学习python 】83. Python多进程编程与进程池的使用
    【从零学习python 】82. 基于多线程的聊天程序实现
    【从零学习python 】81.Python多线程通信与队列的应用
    【从零学习python 】80.线程访问全局变量与线程安全问题
    【从零学习python 】79. 线程访问全局变量与线程安全问题
    【从零学习python 】78. 文件下载案例
    【从零学习python 】77. TCP服务端编程及注意事项
    【从零学习python 】76.服务器与客户端:网络通信的关键组成部分
    【从零学习python 】75. TCP协议:可靠的面向连接的传输层通信协议
    【从零学习python 】74. UDP网络程序:端口问题与绑定信息详解
    【从零学习python 】73. UDP网络程序-发送数据
    【从零学习python 】72. 深入理解Socket通信及创建套接字的方法
    【从零学习python 】71. 网络端口及其作用
    【从零学习python 】70.网络通信方式及其应用:从直接通信到路由器连接多个网络
    【从零学习python 】69. 网络通信及IP地址分类解析
    【从零学习python 】68. Python正则表达式中的贪婪和非贪婪模式
    【从零学习python 】67.Python中的re模块:正则替换与高级匹配技术
    【从零学习python 】66.深入了解正则表达式:模式匹配与文本处理的利器
    【从零学习python 】65. Python正则表达式修饰符及其应用详解
    【从零学习python 】64. Python正则表达式中re.compile方法的使用详解
    【从零学习python 】63.正则表达式中的re.Match类及其属性和方法介绍
    【从零学习python 】62. Python正则表达式:强大的字符串匹配工具
    【从零学习python 】61.Python中的property属性详解和应用示例
    【从零学习python 】60.探索生成器:迭代的灵活利器
    【从零学习python 】59.迭代器:优化数据遍历的高效工具
    【从零学习python 】58.Python中的自定义异常及引发异常的方法
    【从零学习python 】57.Python中使用with关键字正确关闭资源
    【从零学习python 】56. 异常处理在程序设计中的重要性与应用
    【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
    【从零学习python 】54. 内存中写入数据
    【从零学习python 】53. CSV文件和Python的CSV模块
    【从零学习python 】52.文件的读写 - Python文件操作指南
    【从零学习python 】51.文件的打开与关闭及其在Python中的应用
    【从零学习python 】49. Python中对象相关的内置函数及其用法
    【从零学习python 】48.Python中的继承与多继承详解
    【从零学习python 】47. 面向对象编程中的继承概念及基本使用
    【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
    【从零学习python 】45.Python中的类方法和静态方法
    【从零学习python 】44.面向对象编程中的私有属性和方法
    【从零学习python 】43. Python面向对象编程中的实例属性和类属性
    【从零学习python 】42.Python中的内置属性和方法
    【从零学习python 】41.python魔法方法(二)
    【从零学习python 】40.python魔法方法(一)
    【从零学习python 】39.面向对象基本语法及应用示例
    【从零学习python 】38.Python包的使用及导入方式
    【从零学习python 】37.Python自定义模块的使用和注意事项
    【从零学习python 】36.Python中使用pip进行第三方包管理的方法与技巧
    【从零学习python 】35. Python常见系统模块及其用法
    【从零学习python 】34.Python模块的导入和使用方法详解
    【从零学习python 】33.装饰器的作用(二)
    【从零学习python 】32.装饰器的作用(一)
    【从零学习python 】31.深入理解Python中的高阶函数和闭包
    【从零学习python 】30.深入理解递归函数和匿名函数
    【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法
    【从零学习python 】28. Python中的局部变量和全局变量
    【从零学习python 】27. Python 函数的使用及嵌套调用
    【从零学习python 】25.函数:提高代码编写效率的利器
    【从零学习python 】24. Python中的字符串操作与遍历方法
    【从零学习python 】23. Python中集合(set)的使用方法和常见操作
    【从零学习python 】22. Python中的字典的增删改查及字典的变量
    【从零学习python 】21.Python中的元组与字典
    【从零学习python 】20. Python列表操作技巧及实例
    【从零学习python 】19. 循环遍历列表和列表嵌套的应用
    【从零学习python 】18. Python列表的基本操作详解(一)
    【从零学习python 】17. Python字符串的format方法(二)
    【从零学习python 】16. Python字符串的format方法(一)
    【从零学习python 】15.深入了解字符串及字符集编码
    【从零学习python 】14.Python字符串常见操作(二)
    【从零学习python 】13.Python字符串常见操作(一)
    【从零学习python 】12.Python字符串操作与应用
    【从零学习python 】11.Python循环语句和控制流程
    【从零学习python 】10.Python条件语句和if嵌套详解
    【从零学习python 】09.Python 中的条件判断语句
    【从零学习python 】08.Python了解位运算符, 运算符优先级
    【从零学习python 】07.Python运算符详解:赋值、比较和逻辑运算符
    【从零学习python 】06. Python中运用算数运算符进行计算和字符串拼接
    【从零学习python 】05. Python中的输出和输入
    【从零学习python 】04. Python编程基础:变量、数据类型与标识符
    【从零学习python 】03. Python交互式编程及注释详解
    【从零学习python 】02. 开发工具介绍
    【从零学习python 】01. 安装配置python

  • 相关阅读:
    thingsboard3.4版本之OTA升级
    linux 文件压缩和打包操作
    数学家陶哲轩在形式证明帮助下发现论文中错误
    这才是增加收录的核心操作方向
    java EE初阶 —进程与线程的区别
    自定义linux cp命令
    【完美世界】天仙书院偷食也就算了,竟然还偷院长的孙女,美滋滋
    26_基础加强03
    【Java实验五】继承与多态
    Java中接口间的继承
  • 原文地址:https://blog.csdn.net/qq_33681891/article/details/132554303
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号