git&github 速查指南
git使用指南
- git常用命令小结
- git可参考的工作流程
- git的初始配置
- git的理论基础
- 创建git仓库
- git工作流程的简单实例
- git克隆开源仓库的简单流程
- git查看当前工作状态
- git文件的更新及回退
- 这里补充一个注意点 checkout 和 reset HEAD
- git历史提交目录查看
- git三棵树各自独立
- git快照回滚
- git向前回滚(仅可通过id进行回滚)
- git解决中文文件名乱码问题
- git对比两个文件的差异
- 终极奥义图
- git修改最后一次commit的内容
- git恢复被删除的内容
- git删除文件
- git修改文件名
- git的分支
- git实例
- git分支开发基本规范
- git合并分支
- git删除分支
- git寻找所有commitId
- github
- git错误记录
- git远程库管理
git常用命令小结
命令 | 作用 |
---|---|
git add 文件 | 从working directory向stage提交 |
git commit -m “快照描述” | 从stage向repository提交,并形成快照 |
git status | 当前状态 |
git log | 简要日志 |
git reflog | 查看所有操作及对应的commitID |
git reset --hard/[mixed]/soft HEAD~ | 从repository向stage覆盖(hard—直接到work dir、mixed—到stage、soft—仅回滚repository) |
git restore – 文件/ checkout – 文件 | 从stage向working directory覆盖 |
git checkout HEAD 文件 | repository覆盖stage和working directory |
git diff | 比较working directory和stage文件的区别 |
git diff --cached | 比较stage和repository文件的区别 |
git diff HEAD | 比较working directory和repository文件的区别 |
git branch 分支名 | 创建分支 |
git checkout 分支名 | 切换分支名 |
git merge 分支名a | 将分支a合并到当前分支中 |
git branch | 查看分支 |
git branch -va | 查看远程和本地所有分支 |
git remote add 远程名 远程仓库地址 | 添加远程仓库的连接 |
git remote remove 远程名 | 删除远程连接 |
git remote -v | 查看存在哪些远程连接 |
关于git reset的理解,git reset的功能是从repository覆盖回stage、{working directory} 覆盖回哪一级由 --mixed/–hard/–soft来控制。当使用HEAD时,没有波浪线 代表当前的版本快照。
git可参考的工作流程
1、创建"README.md"文件,提供描述性语言;
2、创建"LICNESE"文件,描述该项目是否开源,及开源程度;
3、创建相关项目文件;
4、添加git跟踪;
git的初始配置
1、cmd中输入以下内容,初始化用户
git config --global user.name "用户名"
git config --global user.email "邮箱"
2、 cmd中输入以下内容,查看账户是否初始化成功
git config --list
出现以下内容(最下方有user.name和user.email)则成功。
git的理论基础
1、git的每个版本都存储着一份完整的代码镜像;
2、git的三棵树:工作区域(Working Directory)、暂存区域(Stage(index))、git仓库(Repository(HEAD));
3、git的一般工作流程:
1)、在工作目录中添加、修改文件;
2)、将需要进行版本管理的文件放入暂存区;
3)、将暂存区的文件提交到git仓库;
4、git文件管理的三种状态:
1)、已修改(modified);
2)、已暂存(staged);
3)、已提交(committed)
创建git仓库
1、进入要创建目录的文件夹;
2、输入以下命令创建git仓库:
git init
git工作流程的简单实例
在工作目录中添加、修改文件
在创建git仓库的位置创建"README.md"文件,里面填写该项目的描述性信息。
将需要进行版本管理的文件放入暂存区
通过以下命令将"README.md"文件添加到暂存区
git add "README.md"
区分大小写,名称错误会在后面报错
将暂存区的文件提交到git仓库
通过以下命令将文件提交到git仓库,注:每次使用git commit都会将暂存区的所有文件全部提交
git commit -m "add a readme file"
commit — 提交
-m — -m之后跟的是描述性的语句,用于简单描述此次改动
如果只输入
git commit
则会弹出一个cmd窗口以输入相关的描述,弹出窗口的编译器和安装时选择的文本编译器相同
将暂存区的文件清除出暂存区(git不跟踪)
1、当前有两个文件在git目录下新建,但是还没有使用 git add添加到暂存区中
2、现在将这两个文件添加到暂存区
3、将这两个文件清除出暂存区
清除暂存区中的文件(如果不写文件名则清除所有)
git reset HEAD
原理:
1)、文件从工作区添加到了暂存区,但是还没添加到git仓库中。 所以现在 工作区和暂存区的文件是一样的, 但是和git仓库中的是不一样的。
2)、通过 git reset HEAD命令,将当前的 git 仓库中的数据覆盖回 暂存区,但是不覆盖回工作区。 这就使暂存区的文件版本与git仓库中一致,即回到了 git add 之前的状态
4、git中的新方法,仅可通过文件名来清除出暂存区
git restore --staged 文件
git克隆开源仓库的简单流程
git clone https://github.com/n0tr00t/Sreg
git查看当前工作状态
git status
git文件的更新及回退
当工作目录的文件(已经由git进行track)发生变化时,有两个选择。
一个是将更新后的文件从“工作目录”—添加到“暂存区域”—添加到“git仓库”:
git add 文件
git commit -m "描述"
另一个是从“暂存区”—将文件覆盖回“工作目录”,即不保存此次修改:
git checkout -- 文件
或者
git restore 文件
这里补充一个注意点 checkout 和 reset HEAD
1、用法区别:
git chechout -- 文件名
git reset HEAD
2、含义的区别:
git reset HEAD 是将文件从repository覆盖回stage
git checkout – 文件名 是将文件从stage覆盖回working directory
git历史提交目录查看
git log
git三棵树各自独立
当把文件提交到stage,但是尚未提交到repository,此时再修改工作working directory中的对应文件,则会出现以下情况 既有红色、又有绿色。红色说明working directory中的文件与repository中的不同,绿色说明stage中的文件尚未提交到repository。
此时若使用 git commit -m “xxx” 是将stage中的文件存放到repository中,而working directory中的文件与stage中的不同,即使提交了也不是最新的。
所以此时要先使用 git add 再使用 git commit 来保证三棵树的文件版本是相同的。此处有一个偷懒的做法就是使用
git commit -am "xxx"
此命令会先将working directory中的文件add到stage中,再将stage中的文件commit到repository中
git快照回滚
git中的三棵树是独立的,当输入git status时,出现红色说明working directory和stage中的是不一样的、出现绿色说明stage和repository是不一样的。
git的快照回滚指的是在repository中从最新的commit id回滚到前一个commit id,如下
当使用以下命令时,回滚到上一个快照。两个波浪线则为上两个快照,三个即为上三个快照。此处的波浪线是上波浪线,这里打不出来。
git reset HEAD~
回滚到倒数第四个快照,也可简写为
git reset HEAD~3
功能与下相同
git reset HEAD~~~
回滚一个快照之后发现当前repository中的当前版本(HEAD->master)指向了commit id为b8e3c1d0…的这个版本
此时输入git status查看状态
出现红字说明当前working directory中的版本和stage中的不一样了,即回滚的结果存放到了stage中去了。
此时三棵树的状态是:
working directory — 回滚前的快照,commit id 68f92…
stage — 回滚后的快照,commit id b8e3c1…
repository— 回滚后的快照,commit id b8e3c1…
git快照回滚(reset)的参数
git reset HEAD ~ 是 git reset --mixed HEAD~的简写版本,此命令实际执行了两步:
1、移动HEAD指向,并将其指向上一个快照(即回滚repository);
2、将HEAD移动后指向的快照,回滚到暂存区域(即回滚stage)。
另外两个更灵活的参数
git reset --soft HEAD~ 它仅仅执行第一个,即回滚repository
git reset --hard HEAD~ 它不仅会执行前两步,而且会同时将working directory中的内容同步回滚,即修改 repository、stage、working directory三棵树。
git通过commit id回滚快照
git reset commitId,commit id不需要全部输入,只输入前6个差不多就够了。如下当前有四个版本
使用commit id 回滚到 b8e3c1这个快照,此处要注意 --mixed和–soft --hard的选择
回滚结果如下
git仅回滚个别文件,不改变HEAD指针
git向前回滚(仅可通过id进行回滚)
git reset commitId
目前的HEAD指针在快照 b8e3c1这里
之前的快照如下
现在通过命令向前回滚到 354e02这个快照版本
回滚结果
git解决中文文件名乱码问题
在git bash中输入
git config --global core.quotepath false
git对比两个文件的差异
使用命令git diff比较stage区文件和working directory区文件的区别
git diff
如上图,
其中第三行 "index eba6606…4bc6df6 100644"中的eba6606和4bc6df6是两个文件commit id,100644中的100为linux中的文件类型编码,644为权限编码
第四行、第五行" — a/game.py"中的"—“代表stage区文件也就是旧文件。而第五行的”+++"则表示working directory中的新文件
蓝色字体后方表示内容比对开始,其中红色的是老版本(stage)中有的,而新版本(working directory)中没有的。绿色的表示新版本(working directory)中有的,老版本(stage)中没有的。
对比内容的显隐
注意:如果代码太长,不会将所有代码全部加载进来,而是在显示的结尾以 " : "独占一行,提示此处等待命令,此处可以输入的命令均为键盘按键(区分大小写):
j — 向下显示一行(向下扩展显示) 或者 方向键 ↑
k — 向上显示一行(向上收缩显示) 或者 方向键 下
f — 向下显示一页
b — 一页一页向上移
G — 移动到最后
g — 移动到最前
先输入数字3,再输入g则跳到第三行
对比内容的搜索
同样再上方的":"处输入以下字符开始查找
/ — 自上向下开始搜索
如,搜索print:
/print
? — 自下向上开始搜索
如,搜索print:
?print
此时按下:
n — 跳转到下一个被搜索的关键字
N — 跳转到上一个被搜索的关键字
h — 显示帮助信息
q — 退出
对比两个快照
git diff 快照id1 快照id2
对比working directory和repository
对比working directory和某个版本的快照
git diff 快照id
如果是和最新的快照对比则使用
git diff HEAD
对比stage和repository
对比stage和某个版本的快照
git diff --cached 快照id
如果是和最新的快照对比则使用
git diff --cached
终极奥义图
git修改最后一次commit的内容
git修改最后一次commit的内容,即在不改变快照数量的情况下修改其中内容(其实质就是覆盖这个提交,会改变commit id)。
适用场景如:
1、最后一次的提交漏掉某个或者某几个文件;
2、最后一次提交的说明需要更改或完善等情况。
命令:
git commit --amend
实例:
1、现在有两个版本的快照,修改最新的7463b996这个的描述性内容。从"python without chinese char"改为"modify by git commit --amend"
2、输入git commit --amend后弹出vim框,如下
3、 现在修改最上面的描述内容
4、保存更改,依次按下
ESC —> shift + z —> shift + z
成功后回到cmd
5、修改结果如下:
git commit --amend进入后不修改退出
直接输入: “:q!” 即可退出
git commit --amend -m "xxxx"不进入修改说明
输入以下内容,以新的说明代替"xxxx"
git commit --amend -m "xxxx"
git恢复被删除的内容
输入以下命令执行
git checkout -- 文件名
或者
git restore 文件名
实例:
1、现在删除working directory中的README.md文件
2、输入命令
或者
3、文件均成功恢复
git删除文件
使用命令,此命令仅删除working directory和stage中的,不会修改快照
git rm 文件名
删除后提示,stage中内容与当前快照中的内容不符
git强制删除文件
适用于当git的working directory和stage中的文件不一致时
git rm -f 文件名
实例:
1、将README.md修改后git add,添加到stage中
2、在working directory中再次修改README.md
3、此时无法使用git rm 文件名的形式删除该文件
4、使用git rm -f 文件名删除
git仅删除stage中的文件
git rm --cached 文件名
git修改文件名
如果直接在working directory中修改文件名,git会识别为删除了旧的文件并且添加了新的文件,而不会认为是重命名。因此重命名操作需要在git中进行
git mv 旧文件名 新文件名
git的分支
常用于实际开发中有新功能需要添加时,在不改变主程序的情况下创建一个新的分支来进行相关功能的开发
git分支创建方法
git branch 分支名
git分支的查看方法
查看当前指向快照的所有引用(包括HEAD、分支、标签)
git log --decorate
以每个快照id独占一行的形式显示快照ID
git log --decorate --oneline
git分支切换方法
git checkout 分支名
git分支树的查看
git log --decorate --oneline --graph --all
git分支创建流程的图解
1、尚未创建分支时
2、使用 git branch创建分支后
3、切换分支后
4、在工作目录中新建一个文件"thisInFeatureBranch.txt",注意此时HEAD指向feature分支
5、提交一下改动,再切换回主分支,发现新创建的文件并不存在于主分支当中
1)、提交改动
2)、切换回主分支
git实例
git 忽略指定文件
创建 .gitignore 文件
打开git bash,并输入 touch .gitignore
在 .gitignore 文件中输入要忽略的文件
输入前
.gitignore 赋值后
重命名文件
复杂的方法:
例:将 foo.html 重命名为 bar.html
1、重命名文件,以防 git 把文件从文件系统中永久删除
mv foo.html bar.html
2、从 git 中删除 foo.html
$ git rm foo.html
3、向 git 中添加 bar.html
$ git add bar.html
4、提交修改
$ git commit -m “some message”
简单的方法:
$ git mv foo.html bar.html
$ git commit -m “some message”
git分支开发基本规范
常设分支
常设分支就主分支(master)和开发分支(develop)两个即可,另外的功能分支(feature)、预发布分支(release)和维护分支(hotfix)属于临时分支,用完之后应该及时删除。
So,在正式开发中,Git 的分支管理如下:
git合并分支
git merge
1、在合并之前要先解决分支的冲突问题
git删除分支
git branch -d 分支名
或
git branch --delete 分支名
git寻找所有commitId
git reflog
github
如果是新的仓库,但是已经生成了ssh,则如下操作
1、git remote add <remotename> 远程仓库地址
2、git pull <remotename> main --allow-unrelated-histories
3、git branch --set-upstream-to=<remotename>/main master
4、git push
获取ssh
ssh:为某个电脑分配固定的密钥,通过此密钥可以不通过账号和密码来连接github
1、打开git bush,并输入以下内容
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2、输入密钥存放目录(可默认)
3、输入密钥口令(可空)
4、密钥产生成功
5、找到密钥保存的目录,打开.pub文件 密钥在这里
配置ssh
1、登录github,如下图点击setting
2、点击new shh
3、将密钥放入key中,title可写可不写,点击Add SSH key
4、SSH key配置成功
创建新项目
1、New repository
2、创建新项目
3、空仓库创建成功
将本地的git仓库推到github上
1、关联
git remote add origin https://github.com/alunAlunnnnn/gittest.git
上面这串命令在这
2、在本地仓库目录下的git bush中运行命令
3、将本地仓库的数据推送到github
git push -u origin master
弹出login
4、推送成功
5、刷新仓库,内容显示
6、创建分支
7、从本地push到github新分支中
使用命令
git push origin master:分支名
如:
git push origin master:dev
master:dev的含义 master 本地的分支名,dev github上的分支名
8、push成功
从github拉取到本地
1、获取clone连接
2、进入某个目录,并执行
git clone 链接
3、拉取成功
4、如果要切换分支,先用以下命令查看有哪些分支
git branch -va
5、通过git checkout切换到目标分支
git checkout remotes/origin/dev
6、分支切换成功
企业级工作流程
非正常状态
1、在有代码需要提交的时候,先从master分支拉取代码,查看代码是否有新增和冲突,解决完冲突以后再推送
git pull origin master
2、推送到master
git push origin master:master
正常状态
1、将master分支pull下来,确认无冲突
2、将本地代码推送到github的自己分支上去
3、提交请求
4、填写相关信息,并@主管
5、主管查看完后,若通过则自动合并进去
git错误记录
$ git push —— Updates were rejected because the tip of your current branch is behind
原因:本地库的版本落后(不相同)于远程仓库
解决方法:
1、先git pull origin 分支名,合并后再git push
$ git pull origin master:master
$ git push origin master:master
git pull此步可能会报错拒绝合并两个不相关的库 “fatal: refusing to merge unrelated histories”,可以强制将远程库拉下来进行合并
$ git pull origin master --allow-unrelated-histories
强制拉取并合并后再push
2、强制将本地库推送到远程库,会使远程库被覆盖(多人开发不可取)
$ git push -u origin master -f
git远程库管理
当推送到服务器时首先要添加远程地址的
$ git remote add origin gitAddress
查看本地添加了哪些远程地址
$ git remote -v
删除本地指定的远程地址
$ git remote remove origin gitAddress