【个人笔记】Git

Tiltle: Github 使用


📖 快速使用


音标:[ɡɪthʌb]

0 介绍

  • Github是一个面向开源与私有软件项目的 托管平台,Git源自其内部的版本库格式.
  • 2008年上线,18年被微软收购;
  • 有很多知名的开源项目:jQuery、python等
  • Github有企业版,要付钱. 免费用户只能使用公共仓库,代码要公开;付费用户可建立私人仓库.

1 Git 入门

1.1 准备工作

  1. 注册github账户
  2. 下载安装git
  3. ... 懒得写了

1.2 是否用ssh

  • 前言

    分成用 https url进行 git clone,和用 ssh url 进行clone;

    区别

    1. 用https url 进行clone时方便,谁的项目都能随便 colne;用ssh url 进行clone麻烦,必须是项目的拥有者,需配置配置和添加 ssh key;
    2. 用https url的,push时需要用户名和密码(得project开了权限),这样不方便也不安全;ssh在push时方便又安全,不需要用户名,若ssh设置了密码就需要密码,不然密码都不需要;

    github生成ssh密钥教程 CSDN

1.3 project的建立到简单flow

  • git init

    把当前路径,新建仓库并初始化

    在当前目录中生成本地的git管理与文件夹 (.git/

  • 配置个人信息

    1. git config --global user.mail "我邮箱@?.com"

    2. git config --global user.name "我的usr name"

    全局设置个人commit的usr name、邮箱

    取消 的方式:git config --global --unset user.mail 以及 --unset user.name

    设置全局,就是所有项目commit时都用这个;在公司电脑上不知道会不会影响别人,我把global撤了;

    不想设置全局的话,就删掉--global

    • 查看是否设置成功:输 git config --list

      会打印本地project的 .git/config 中的内容,会显示user和email设置信息

  • git add 文件

    没报错,就成功地把文件加入到了仓库的暂存区

    git add . 加入所有文件

    • 注意:git add .git add -A的区别

      git add .是当前path下,文件变化都加入到暂存区,不包括"删除";

      git add -A 或者 git add --all是所有path下,==整个项目的文件变化(包括删除)==都加入到暂存区。

  • git commit -m '注释' (是短注释)

  • git commit -a (弹窗长注释)

    上传当前版本

  • git push -u origin master

    提交到网络上

1.4 常用指令

  • git clone 路径 ------ clone项目

    git clone 目标path 我path

    自定义clone后文件名

  • git branch [option] ------ 列出(查看)所有本地分支,当前分支上标了*

    常用option:

    1. -r 查看远程分支
    2. -a 查看所有分支

    git branch A ------ 建新分支A

  • git checkout A ------ 切换为分支A

  • git pull ------ 更新remote 的branch信息

  • git log ------ 查看提交日志

    git log --oneline ------ 精简模式

2 常见情景/需求

2.1 branch操作

查看分支是否是最新的
  • git diff HEAD origin/分支名

    不是最新,就会有内容打出来。

  • 或者重新 git pull,如果最新的话,会说的。

删除本地分支
  • 直接暴力删除此branch

    git branch -D 分支名,就是-delete -force的意思。

  • merge后改分支的名称

    • 在当前分支上修改此分支名称

      git branch -m 新名字

    • 修改任意分支的名字

      git branch -m 分支名 新名字

  • merge后删除

    git branch -d 分支名即可

2.2 commit操作

  • commit_ID不需要写全,写前几位就好了!
git log只显示一条
  • git log --prettt=oneline
回滚到之前的commit
  1. git reset --hard commit_ID

    hard是强制回滚。要慎用!

⭐️ 撤回上一次的commit
  • git reset --soft HEAD^

    1. --soft 不删除工作区代码的改动,不撤销add,仅仅是撤销commit;

      其他代替:--mixed默认参数:不删除工作区代码的改动、撤销add、也撤销commit;

      --hard:既删除工作区代码的改动、也撤销add、也撤销commit;

    2. HEAD^ 意思是上个代码版本,等价于 HEAD~1

      其他代替:若想把上次commit、上上次commit也撤掉,就写HEAD~2.

  • 一不小心执行多了,撤销了以前的commit,咋办!!💢

    1. git reflog

    2. 复制选择黄色的ID数字

    3. git reset --soft [id]

      就可以回到之前commit的状态了!偶也!

删除上一次commit------(这个好复杂,底层原理没看懂)
  1. git commit rebase -i commit_ID 打开这次commit之后的(不包含此次)commit记录。

  2. 把后面几条commit记录,从pick改成drop;(但我实验后报错说,"没有drop命令")...

  3. 重新git log,可以看到commit记录没了已经。但目前还是rebase状态,还没退出去呢。

    如果出现第二点的报错(说没有"drop"命令)的话,commit记录依然会没有的,直接在此时commit就好了。

  4. git rebase --continue退出rebase即可。

修改上一次commit的注释
  • flow

    git commit --amend,弹窗后修改注释即可

    注:此句依然具有commit的效果

合并多次commit的记录
  • flow

    把我搞死,好不容易才试出来.

    1. 先把当前状态commit掉先:

      git add -A 把所有变化都放入暂存区(git add .对大项目没用的);

      git commit提交掉。

    2. git log ,查看提交日志;

    3. git rebase -i commit_ID ,ID选择最前面"不要被合掉的log";

    4. 会弹窗,多个log的记录。第一条必须是pick开头,后面几条的pick全改成s,即squash.

      注:必须第一条是pick。

      保存退出。

    5. 此时进入rebase状态,用git log查看,只剩第一个commit log了,就在这个状态下重新git add -A 然后 git commit --amend

    6. git rebase --continue,退出rebase,弹出日志,直接保存退出即可。

    7. 中途如果不想折腾了,用git rebase --abort即可中断。

  • 理解 git rebase

    git rebase是把当前的代码放在暂存区(stash),在保证当前工作区是干净的情况下(也就是得在刚commit后),把以前branch的code拉到本地(工作区)。然后把工作区和暂存区的代码合并。

  • 暂存区有什么异常或者报错

    就用git status,查看一下。

2.3 文件追踪

查看那些文件被git追踪
  • git ls-tree -r master --name-only,不想显示子目录,就去掉-r哈。
屏蔽/忽略/unstaging部分文件

设置了,这些文件就不会被git add算入了。

  • 工程目录中新建一个.gitignore文件,里面写上要unstaging的文件名

    demo:

    makefile 复制代码
    # 忽略(unstage)所有 .log 后缀文件
    *.log
    
    # 忽略所有子文件夹中,名称为temp的文件夹
    temp/
    # 忽略的文件夹中,额外有某个文件要stage
    !temp/important.md
    
    # 仅忽略某个指定路径的文件夹内的数据
    /text.txt

    更多语法,见:Git .gitignore ------w3school

📖 git 细说


1 工作区与分支

工作区、暂存区、版本库

  • 工作区(working directory/workspace/project folder)

    电脑肉眼可见的文件目录

    是下图的 绿色。存项目文件的。

  • 暂存区(staging area/index)

    位置在.git/index中,故又称"索引";

    是下图的 蓝色肚子里的白色 ,存**git add**的staging文件信息。

  • 本地版本库(local repository/repo)

    为工程path下的隐藏文件.git/object

    是下图的 蓝色。存版本、节点信息的,装的是各种**git commit**内容。

  • 远处版本库(remote repo):服务器上的repository.

  • 关系如下图:

  • Head就是指向"当前active的分支"的游标,可以根据我们的切换(checkout)跳来跳去;

  • 各种git操作对三个区的影响

    • git add:会基于文件修改,更新到index(staging area);

    • git commit:把staging area的东西存入objects中来;

    • git checkout .:用staging area的内容,替换工作区的文件。

      故若工作区文件未保存,将被清除。

    • git checkout HEAD .:会替换staging area以及工作区的文件。

      两边的文件若未保存,将被清除。

分支

没写

2 rebase指令 (commit修改)

  • 不错的ref:【git 整理提交】git rebase -i 命令详解 CSDN

  • rebase时,对commit_ID的操作有:

    • pick,正常提交(commit)

      改变顺序的话,commit的顺序也会改;删掉的话,commit的记录也会删掉;

    • squash

      多个commit合并,向old的记录合并;

    • 其他

      懒得写。

3 reset (版本回退)

简要用法

  • 理解git的存档与时间穿梭关系

    1. 在git中,commit就是一个存档点;

    2. 当前所处的commit版本是HEAD,上一个版本是HEAD^,上上个版本是HEAD^^,往上100个版本是HEAD~100

    3. 版本回滚一次是:

      git reset --hard HEAD^

      后悔了,取消回滚 咋办------terminal还没有关掉时,输入:

      git reset --hard 原来的commit_ID.

      不小心关机了,开机后很后悔想取消回滚 咋办------可以用git reflog查看自己的所有git操作,里面会显示自己在之前节点操作的commit_ID,然后再用reset指令恢复(同上)。

细节语法

  • 不同option

    • --mixed模式

      也就是默认的git reset模式。

      回退

其他(未整理)

  • RHEL系统安装 git:

    【忙了一天,发现可以联网,我没设置好,晕倒】

    因为redhat企业系统 不能联网,安装git得自己下source code编译安装;但我RHEL系统库确实,不能联网下载安装很痛苦和麻烦。

    1. git官网 上去下载RHEL版本的git的source code

    2. 拷贝到RHEL系统中

    3. 解压:tar -vxf git-file.tar.gz

    4. 进入此文件夹;

    5. 编译①:./configure --prefix=/usr/local/git

    6. 编译②:make

    7. 安装:su
      make install

    8. 添加环境变量:

      ~/.bashrc 中追加一行:export PATH=$PATH:/usr/local/git/bin

    9. 查看是否安装完成:git --verision

    然后我出现了问题------"编译①"时,说zlib.h not found ,因为我的RHEL不能联网,只能继续离线安装zlib-devel 了:

    1. zlib官网 下载source code;

    2. 拷贝到RHEL系统中

    3. 解压:tar -xvzf zlib-file.tar.gz

    4. 进入此文件夹;

    5. 编译①:./configure

    6. 编译②:make -j4

    7. 安装:su
      make install

      搞定!注意,我看了一些网站用的编译①和编译②都不一样,比如用的是make,但我失败了,安装完还是扫描不到zlib.h,即使我在路径里看得见。改成现在的写法就ok了。真不容易。

  • git工程打包,包含log日志

    git archive --output "./output.tar.gz" master

    默认是 tar.gz 格式,对master分支进行打包。

    ❓ 我好像失败了?

    但是直接文件用tar打包,git文件直接就在里面了,方便多了。

origin

  • 前言

    git里关于origin分支等部分的内容,一直没搞明白。

  • Ref

    git中origin master详解

  • 概括

    origin是远程仓库(remote repository) 的默认仓库名,用来指代远程github上的仓库版本,不然总不能每次都用url来指代远程仓库吧~

    git remote -v查看所有远程分支名称,可以看到git clonegit pull下来的分支,默认名称是origin.

    当然,可以自己改。

    这样在push的时候,就知道是push给谁了。即,git push 仓库别名 推上去新建的分支名称

    • git remote add 新名字 git仓库链接 来"添加远程仓库",同时能取别名。

      新建仓库时,起名字;

    • git remote rename 老名字 新名字 来给已有的远程仓库"换名字"。

相关推荐
xiaoyalian7 分钟前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
Red Red2 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
贰十六2 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
知兀3 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
醉陌离4 小时前
渗透测试笔记——shodan(4)
笔记
LateBloomer7774 小时前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz4 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py4 小时前
【Linux】-学习笔记04
linux·笔记·学习
fengbizhe5 小时前
笔试-笔记2
c++·笔记