Tiltle: Github 使用
📖 快速使用
音标:[ɡɪthʌb]
0 介绍
- Github是一个面向开源与私有软件项目的 托管平台,Git源自其内部的版本库格式.
- 2008年上线,18年被微软收购;
- 有很多知名的开源项目:jQuery、python等
- Github有企业版,要付钱. 免费用户只能使用公共仓库,代码要公开;付费用户可建立私人仓库.
1 Git 入门
1.1 准备工作
- 注册github账户
- 下载安装git
- ... 懒得写了
1.2 是否用ssh
-
前言
分成用 https url进行
git clone
,和用 ssh url 进行clone;区别:
- 用https url 进行clone时方便,谁的项目都能随便 colne;用ssh url 进行clone麻烦,必须是项目的拥有者,需配置配置和添加 ssh key;
- 用https url的,push时需要用户名和密码(得project开了权限),这样不方便也不安全;ssh在push时方便又安全,不需要用户名,若ssh设置了密码就需要密码,不然密码都不需要;
1.3 project的建立到简单flow
-
git init
把当前路径,新建仓库并初始化
在当前目录中生成本地的git管理与文件夹 (
.git/
) -
配置个人信息
-
git config --global user.mail "我邮箱@?.com"
-
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:
-r
查看远程分支-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
-
git reset --hard commit_ID
hard是强制回滚。要慎用!
⭐️ 撤回上一次的commit
-
git reset --soft HEAD^
-
--soft
不删除工作区代码的改动,不撤销add,仅仅是撤销commit;其他代替:
--mixed
是默认参数:不删除工作区代码的改动、撤销add、也撤销commit;--hard
:既删除工作区代码的改动、也撤销add、也撤销commit; -
HEAD^
意思是上个代码版本,等价于HEAD~1
;其他代替:若想把上次commit、上上次commit也撤掉,就写
HEAD~2
.
-
-
一不小心执行多了,撤销了以前的commit,咋办!!💢
-
git reflog
-
复制选择黄色的ID数字
-
git reset --soft [id]
就可以回到之前commit的状态了!偶也!
-
删除上一次commit------(这个好复杂,底层原理没看懂)
-
git commit rebase -i commit_ID
打开这次commit之后的(不包含此次)commit记录。 -
把后面几条commit记录,从
pick
改成drop
;(但我实验后报错说,"没有drop
命令")... -
重新
git log
,可以看到commit记录没了已经。但目前还是rebase状态,还没退出去呢。如果出现第二点的报错(说没有"
drop
"命令)的话,commit记录依然会没有的,直接在此时commit就好了。 -
用
git rebase --continue
退出rebase即可。
修改上一次commit的注释
-
flow
git commit --amend
,弹窗后修改注释即可注:此句依然具有
commit
的效果
合并多次commit的记录
-
flow
把我搞死,好不容易才试出来.
-
先把当前状态commit掉先:
git add -A
把所有变化都放入暂存区(git add .
对大项目没用的);git commit
提交掉。 -
git log
,查看提交日志; -
git rebase -i commit_ID
,ID选择最前面"不要被合掉的log"; -
会弹窗,多个log的记录。第一条必须是
pick
开头,后面几条的pick
全改成s
,即squash.注:必须第一条是pick。
保存退出。
-
此时进入rebase状态,用
git log
查看,只剩第一个commit log了,就在这个状态下重新git add -A
然后git commit --amend
。 -
git rebase --continue
,退出rebase,弹出日志,直接保存退出即可。 -
中途如果不想折腾了,用
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 细说
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修改)
-
rebase时,对commit_ID的操作有:
-
pick
,正常提交(commit)改变顺序的话,commit的顺序也会改;删掉的话,commit的记录也会删掉;
-
squash
多个commit合并,向old的记录合并;
-
其他
懒得写。
-
3 reset (版本回退)
简要用法
-
理解git的存档与时间穿梭关系
-
在git中,
commit
就是一个存档点; -
当前所处的commit版本是
HEAD
,上一个版本是HEAD^
,上上个版本是HEAD^^
,往上100个版本是HEAD~100
; -
版本回滚一次是:
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系统库确实,不能联网下载安装很痛苦和麻烦。
-
git官网 上去下载RHEL版本的git的source code
-
拷贝到RHEL系统中
-
解压:
tar -vxf git-file.tar.gz
-
进入此文件夹;
-
编译①:
./configure --prefix=/usr/local/git
-
编译②:
make
-
安装:
su
make install
-
添加环境变量:
在
~/.bashrc
中追加一行:export PATH=$PATH:/usr/local/git/bin
-
查看是否安装完成:
git --verision
然后我出现了问题------"编译①"时,说
zlib.h not found
,因为我的RHEL不能联网,只能继续离线安装zlib-devel
了:-
去zlib官网 下载source code;
-
拷贝到RHEL系统中
-
解压:
tar -xvzf zlib-file.tar.gz
-
进入此文件夹;
-
编译①:
./configure
-
编译②:
make -j4
-
安装:
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
-
概括
origin
是远程仓库(remote repository) 的默认仓库名,用来指代远程github上的仓库版本,不然总不能每次都用url来指代远程仓库吧~用
git remote -v
查看所有远程分支名称,可以看到git clone
或git pull
下来的分支,默认名称是origin.当然,可以自己改。
这样在push的时候,就知道是push给谁了。即,
git push 仓库别名 推上去新建的分支名称
-
用
git remote add 新名字 git仓库链接
来"添加远程仓库",同时能取别名。新建仓库时,起名字;
-
用
git remote rename 老名字 新名字
来给已有的远程仓库"换名字"。
-