• git_note


    Git入门

    git学习笔记
    Git官网:http://git-scm.com
    本文主要是Git教程 | 廖雪峰的学习总结

    常用Git命令清单 | 阮一峰
    Pro Git
    git-cheat-sheet
    author: gyc514893758


    git简介

    什么是git

    git 是分布式版本控制系统
    对于一个项目,有不同版本,可以记录每次改动,可以有不同分支
    方便回退、协作等

    分布式版本控制系统

    每个人电脑上都是一个完整的版本库,不联网也能工作
    方便拉取分支、合并修改

    安装git

    Windows下载地址
    按默认选项安装即可。
    安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

    打开“Git Bash”,输入:

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    
    • 1
    • 2

    注意git config中的--global表示此电脑上所有git仓库都使用该配置。你也可以为某个仓库指定不同的用户名和E-mail地址。

    使用git config --list命令可以查看所有设置


    创建版本库

    版本库,也叫仓库,repository
    可以理解成一个被Git管理的目录、文件夹。git可以跟踪每个文件的修改删除。

    1. 新建文件夹,创建一个空目录(目录名最好不含中文
    2. 右键Open Git Bash here
    3. 输入指令git init建立仓库
      此时生成一个.git目录(默认隐藏),不要改动
    4. 添加文件
      (1) 在仓库中创建文件
      (2) git add ,添加成功没有消息
      (3) git commit -m"",将文件提交到仓库,-m输入本次提交的说明,执行成功会告诉你改动
      add可以添加多个文件,commit一次提交

    git commit不带-m参数时,进入vim编辑器。编辑完成,退出时:
    Esc键退出编辑模式,然后:

    • 保存并退出:
      输入英文wq ZZ + 回车
    • 不保存退出
      输入英文q! qa! + 回车

    版本控制

    工作区与暂存区

    • 工作区
      电脑中能看到的目录
    • 版本库
      隐藏目录.git。版本库包括:
      • 暂存区stage、index
      • 自动创建的第一个分支master
      • 指向master的一个指针HEAD

    修改文件

    指令git status告诉我们当前仓库的状态。

    • Untracked files:表示仍在工作区的文件
    • Changes to be commited:表示在缓存区,还没有提交的文件
    • 如果没有改动,会告诉你nothing

    指令git diff 会告诉你修改的内容

    版本回退

    命令git log告诉我们提交的历史记录,按Q键退出查看
    git log --pretty=oneline可以简化输出信息)
    一长串16进制数字是版本号commit id

    在git中,HEAD表示当前版本,HEAD^表示上个版本(上上个HEAD^^,上100个HEAD~100

    git reset --hard HEAD^回退到上个版本
    git reset --hard 回退到版本号对应版本(id不用写全,只写前几位可识别就行)
    重设,此版本之后的版本消失。此时log中不能查询目前回退到的版本之后的版本。
    可以使用git reflog查看每一次命令对应id,以回退到消失的版本

    git revert --hard不会丢失版本,它实际上是新的一版使用了以前的内容,本质上不是回滚。而reset是完全退回到之前的版本。

    撤销修改

    1. 工作区修改,未添加到暂存区git restore
    2. 修改已添加到暂存区,未提交git restore --staged ,再转1
    3. 已提交版本,直接git reset --hard HEAD^回退

    删除文件

    直接在文件管理器中删除,或者指令rm
    此时,工作区和版本库不一致。

    如果确实要从版本库删除,就用git rm删除,并且git commit提交。

    如果删错了,可以从版本库还原误删文件git checkout --
    git checkout其实是用版本库版本替换工作区版本,无论工作区是修改还是删除,都可以“一键还原”。


    远程仓库

    设置Github

    GitHub提供Git仓库托管服务。本地Git仓库与GitHub仓库之间的传输通过SSH加密。

    1. 创建SSH Key
      打开Git Bash,输入ssh-kyygen -t rsa -C"youremail@example.com"。使用自己邮箱,并且一直回车(使用默认值)。成功后,在用户主目录(C:\Users\用户名)里可以找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
    2. 登录GitHub
      打开账户设置,“SSH Keys”,点击"add SSH Key",填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。(Github允许添加多个Key)

    添加远程库

    创建远程库

    在本地创建一个git仓库后,想要在GitHub上创建一个同步的远程仓库。

    1. 登录GitHub,“create a new repo”,填写基础信息,创建仓库。
    2. 在本地仓库运行git remote add origin git@github.com:
      此时远程库名字叫origin,默认叫法,也可以改成别的。
    3. git push -u origin master把本地库内容推送到远程库。
      由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会关联二者。在以后的推送或者拉取时就可以简化命令git push origin master
    SSH警告

    当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

    The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
    RSA key fingerprint is xx.xx.xx.xx.xx.
    Are you sure you want to continue connecting (yes/no)?
    
    • 1
    • 2
    • 3

    这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

    Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
    Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
    这个警告只会出现一次,后面的操作就不会有任何警告了。

    从远程库克隆

    先有远程库,从远程库克隆到本地

    1. GitHub上先建好远程库
    2. git clone git@github.com: <新建本地仓库名>
      会在当前目录下生成一个子目录仓库(省略后者默认同名)

    上述使用的是ssh协议,速度最快。

    有时也使用https协议:git remote add origin https://github.com/user/repo.git
    比较慢,且每次推送必须输入口令。

    删除远程库

    运行git remote rm 命令。
    使用前,建议先用git remote -v查看远程库信息。然后,根据名字删除。比如删除origin:git remote rm origin

    此处的“删除”其实是解除了本地和远程的绑定关系,远程的仓库仍存在。

    Git分支管理

    创建一个属于自己的分支,不影响其他人的工作。可以和之前讲的一样管理。到开发完毕再一次性合并分支。

    分支可以理解为当前工作目录的一个副本(平行世界)。
    将项目划分成多条线,例如:在开发线(dev)上修改,之后合并到主线(master,main)上,保证主线的稳定性。

    创建与合并分支

    git branch查看分支,*标明当前分支,附加参数:

    • -r远程库分支列表
    • -a所有分支,remotes开头表示远程分支
    • -v查看一个分支的最后一次提交
    • --merged查看已合并到当前分支的分支
    • --no-merged查看所有未合并的分支

    git branch 创建分支
    git switch git checkout 转到分支
    git switch -c git checkout -b 创建并转到分支
    切换分支时工作区和暂存区应该是干净的

    git merge 将分支合并到当前分支
    git branch -d 删除分支(已合并或者未修改
    git branch -D 强制删除分支(没有合并过,丢失修改)

    git branch -m 重命名分支

    解决冲突

    不能自动合并的冲突,需手动解决(此时分支名变化):

    <<<<<<
    =======
    <传入的更改>
    >>>>>>>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    手动编辑更改之后再提交

    git log --graph可以查看合并分支图。

    bug分支

    git stash保存、隐藏当前工作状态,此时用git status查看工作树是干净的。
    git stash list查看保存状态。

    恢复工作状态(两种方法):

    • git stash pop恢复并删除stash
      1. git stash apply恢复stash
      2. git stash drop删除stash

    可以多次stash,恢复指定的stash:
    git apply stash@{0}

    保存stash,创建bug分支、修改、提交、合并,删除bug分支,恢复stash。

    此时修改了master分支的bug,该bug在dev分支上也存在,只复制这次提交:
    git cherry-pick
    这个操作仍会生成一个commit id,虽然提交的内容相同,但本质不是同一次提交

    多人协作

    从远程仓库克隆时,自动将本地的master分支和远程的master分支对应。远程库默认名称origin

    git remote查看远程库信息
    git remote -v显示远程库详细信息

    git push 推送分支,将该分支所有本地提交推送到远程库。(需指定本地分支)
    masterdev分支应与远程库同步,其他分支视情况而定。

    推送分支前,应该先拉取分支(远程库可能比本地更新)。如有冲突,先解决冲突。
    git pull

    git branch --set-upstream  origin/
    
    • 1

    建立本地分支与远程分支的关联。

    git pull :
    拉取远程分支,如果省略本地分支,默认同名

    git push :删除远程分支


    标签管理

    给版本库打一个标签tag,取某个标签的版本。
    就像给commit id起个名字加书签。

    创建标签

    git tag 给最新一次提交打标签
    git tag 给历史某次提交打标签
    git tag -a -m'message' 可以指定标签信息
    git tag查看所有标签(按字母排序,不是时间)
    git show 查看某个标签信息

    操作标签

    标签存储在本地,不会自动推送到远程。如果要推送到远程:

    • git push origin 某个标签
    • git push origin --tags所有标签

    删除标签:

    • 标签只在本地:
      git tag -d 删除本地标签
    • 标签推送到远程:
      1. git tag -d 删除本地标签
      2. git push origin :refs/tags/删除远程标签

    自定义Git

    忽略特殊文件

    忽略文件的原则是:

    • 忽略操作系统自动生成的文件,比如缩略图等;
    • 忽略通过另一个文件自动生成的中间文件,比如Java编译产生的.class文件;
    • 忽略带有敏感信息的配置文件,比如存放口令的配置文件。

    在工作区根目录创建.gitignore文件,写入要忽略的文件名。
    不需要从头写.gitignore文件。所有配置文件可以直接在线浏览:https://github.com/github/gitignore. 组合即可。

    如果想添加被忽略的文件:
    git add -f 强制添加
    git check-ignore检查哪条规则忽略了该文件。

    .*排除所有.开头的隐藏文件
    *.class排除所有.class类型文件
    !.gitignore不排除文件

    可以通过https://gitignore.itranswarp.com 在线生成.gitignore文件。

    配置别名

    $ git config --global alias.co checkout
    $ git config --global alias.cm commit
    $ git config --global alias.br branch
    $ git config --global alias.unstage 'reset HEAD'
    $ git config --global alias.last 'log -1'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代替的命令是一个单词可以直接写,有空格加引号,有引号则单双引号交替。

    每个仓库的配置文件在.git/config中,当前用户的配置文件在用户主目录下隐藏文件.gitconfig中。
    别名就在[alias]后面,可以直接修改。

    其他

    # 适当显示颜色
    $ git config --global color.ui true
    
    • 1
    • 2

    搭建Git服务器

    https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

    Git的图形界面工具

    SourceTree
    一个单词可以直接写,有空格加引号,有引号则单双引号交替。

    每个仓库的配置文件在.git/config中,当前用户的配置文件在用户主目录下隐藏文件.gitconfig中。
    别名就在[alias]后面,可以直接修改。

    其他

    # 适当显示颜色
    $ git config --global color.ui true
    
    • 1
    • 2

    搭建Git服务器

    https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

    Git的图形界面工具

    SourceTree
    https://www.liaoxuefeng.com/wiki/896043488029600/1317161920364578

  • 相关阅读:
    Nodejs之egg基本使用(初始化项目、内置对象、egg路由、egg控制器)
    大数据课程K19——Spark的电影推荐案例&&推荐系统的冷启动问题
    Babylonjs学习笔记(五)——创建PBR材质
    设计模式-组合模式(Composite)
    Java学习--day16(集合)
    【第三篇】商城系统-基础业务-实现类别管理
    [贪心][二分]Sort Zero Codeforces1712C
    pytorch3d安装遇到的一些坑和解决过程
    在Vue中使用列表渲染v-for时为什么不要用index作为key?
    Web 3.0 是泡沫还是金矿?
  • 原文地址:https://blog.csdn.net/weixin_68393125/article/details/136164107