Git操作步骤图解_GitBash
Git操作步骤图解_GitBash
(〇)前戏
比较重要的内容
记得要在github上注册账户,或者gitee(国内的比较快)
Bash窗口里只要是没有输入符
$
就不能输入Bash窗口里用鼠标右键复制粘贴千万不要按ctrl + C/ctrl + V,特此提醒
Bash窗口中文乱码:右键->Options->左边Text->
- Local->zh_CN
- Character set->UTF-8
- Save
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
SSH钥匙
- 本则步骤出自于简书, 如果没有SSH,就无法与远程数据通信
- 在桌面上右键——>
Git Bash Here
cd ~/.ssh
查看有没有密钥,如果右边黄字变化,说明有密钥git config --global user.name "用户名"
(注意是英文引号)git config --global user.email "邮箱"
(注意是英文引号)ssh-keygen -t rsa
生成公钥和私钥,写入github里的用户名密码git config -l
查看状态cat ~/.ssh/id_rsa.pub
查看公钥cat ~/.ssh/id_rsa
查看私钥
浏览器登不上GitHub怎么办
- 进入站长工具
- 域名搜索:
github.com
,找到TTL值最低的数字IP,一般是XXX.XXX.XXX.XXX,填入Host - 域名搜索:
github.global.ssl.fastly.net
,填入Host同上
1 | 类似: |
Git常用命令
1 | git init 【初始化仓库】 |
(一)初始化
- 在想要作为仓库的电脑目录里右键打开git小黑窗口——>
Git Bash Here
- 初始化仓库——>
git init
- 确保目录里除了想要作为版本迭代的文件还有一个仓库隐藏文件
.git
- 如果显示了这一行, 表示你没有登录,git未设置用户信息
- 输入
Run
下面的两行就行
- 接着查看仓库状态——>
git status
On branch master
表示当前分支叫master
(主分支),跟右上角一致No commits yet
表示仓库里还没有声明版本Untracked files
表示拥有无效文件,无效文件用红色表示
git status
里文件四大状态1
2
3
4无效文件 untracked【红色】【新文件】
暂存文件 staged【绿色】【进入暂存区的无效文件或修改文件】
有效文件 tracked【不显示】【进入版本的暂存文件】
修改文件 modified【红/绿】【改动的有效文件】git add 文件名
能够将某一红色文件变成绿色git add .
能够将所有红色文件变成绿色
(二)创建
git commit -m 版本名
用于创建一个版本
git log
用于查看所有版本及其状态- 使用
--oneline
可以看简要日志 - 使用
--graph
可以看日志图表 - 使用
--reverse
可以看倒序日志 - 使用
--all
可以看全部分支的版本 - 使用
--n数字
可以查看最近几次版本 - 使用
--author 作者名
可以依作者筛选 - 使用
--since{2020-12-21}
和--before{2020-12-21}
可以依时间筛选 - 使用
--decorate
可以查看标签
- 使用
- 黄色乱码是指针地址,一般使用前7位用于定位该地址:
058544f
(HEAD -> master)
代表当前用户位于master
分支下Author
版本创建作者,Date
版本创建日期
(三)更新
- 打开文件
document.docx
,在保存版本version_1
时里面没有写任何东西:
- 对文件做修改,并保存
- 然后
git status
检查文件状态
Changes not staged for commit
表示非有效文件- 红色
modified
表示修改文件 - 这时
git add .
就可以将修改文件加入暂存文件 - 当然,无论是红是绿都不是有效文件,因为有效文件不显示
- 将暂存文件保存成版本
version_2
- 如果修改了文件,不想保存成新的版本,可以选择
git commit --amend
--amend
用于修复最近一次保存的版本-i
- 如果修改了文件,不想保存成新的版本,可以选择
- 查看版本状态
(HEAD -> master)
指向的是当前所处版本以及分支
(四)回溯
回溯基础
- 突然就想让文件回到
version_1
的状态了 git reset 版本哈希或前7位 --soft/hard/mixed
用于回溯版本- 如果使用
--soft
,表示更改当前用户位置HEAD
,不会修改源文件,将【回溯前版本与回溯版本的差异】视为已暂存修改文件,git status
显示绿色修改文件 - 如果使用
--hard
,表示更改当前用户位置HEAD
,会修改源文件 - 如果使用
--mixed
,表示更改当前用户位置HEAD
,不会修改源文件,将【回溯前版本与回溯版本的差异】视为未暂存修改文件,git status
显示红色修改文件 git reset 版本哈希或前7位
不一定要去找到那些哈希值,可以用以下方法来定位:↓HEAD
指代当前的版本HEAD^^^
指代倒数第四个版本HEAD~3
指代倒数第四个版本
- 如果使用
HEAD is now at 058544f version_1
表示当前位于version_1
版本
- 但是查看版本列表时,之后的版本消失了
- 打开文件
document.docx
,发现文件回到了version_1
的状态:
- 这说明回溯有效
- 但如何返回到
version_2
呢 - 使用
git reflog
查看历史 - 可以看到
version_2
的哈希值前7位为2920056
git reset 版本哈希或前7位 --soft/hard/mixed
回到目标版本
回溯进阶
- 这一节主要讲
git rebase -i 开始版本哈希值 结束版本哈希值
命令 - 这个命令会生成一个交互式文本编辑窗口,可以是任何文本编辑器
- 这里它自动给我打开了vscode
- 它的流程是:修改里面的前几行指令,保存关闭,vscode会重新弹出新的窗口,以此类推
- 下面几行是里面的指令提示
1 | # p, pick <commit> = use commit |
- 当
rebase
执行完之后,如果指针出于游离状态detached
,就使用:git rebase --abort
来退出rebase
(五)分支
- 如果说上面的回溯很搞人心态,那么就需要使用分支系统
- 在例子里,假设希望在
version_2
的基础上继续增加版本,但希望版本与版本之间的切换更加的自如 - 那么就在
version_2
这里新建分支 git checkout -b 分支名
新建一个分支并进入分支,或者使用git branch 分支名
创建分支- 然后就发现:右边蓝字修改了
- 再回到
master
主分支
- 再新建一个分支,再回到主分支
git branch
用于查看所有分支- 带
*
号的分支是当前所处分支
- 现在进入
branch_1
,修改document.docx
文件
- 保存,进入暂存,一条龙
- 在
branch_1
保存成一个版本
- 现在在
branch_1
和master
里查看现在的版本状态 - 可以发现,分支里创建的版本在
master
里不显示,因为是子分支版本 (master, branch_2)
表示version_2
版本在两个分支里都能访问
branch_1
![pics/git_pics/24_gitstatus.png](https://iamsleepinggroup.coding.net/p/coding-devops-guide/d/link-pool/git/raw/master/pics/git_pics/24_gitstatus.png)master
![pics/git_pics/25_gitstatus.png](https://iamsleepinggroup.coding.net/p/coding-devops-guide/d/link-pool/git/raw/master/pics/git_pics/25_gitstatus.png)- 使用
git checkout 分支名
来跳转当前分支,会发现文件夹里的文件也在实时地变换
- 所以,现在的关系是这样的:
- 使用
git branch -d 分支名
来删除branch_2
- 现在重新创建这个
branch_2
- 喔嚯不小心打成了
branch_3
,使用git branch -m 分支名
来重命名当前分支
- 修改文件并保存版本
- 删除该分支
- 首先报了个
... is not fully merged
表示该分支还没有被合并,系统取消了这次删除指令 - 于是使用
git branch -D 分支名
来强制删除该分支
(六)分支合并
- 什么是分支合并
- 就是从
master/version_2
里分了branch_1/version_3
和branch_2/version_4
,将version_3
和version_4
合并到master/version_2
里 - 于是我们先恢复
branch_2
- 查看历史,找到哈希码
1056d61
,虽然不是显示branch_2
,但从version_4
可以推断出应该就是它
- 使用
git checkout -b 分支名 哈希值
这样就恢复了branch_2
- 回到
master
,使用git merge 分支名
来合并分支 - 合并
branch_1
时显示正常 - 合并
branch_2
时发生了冲突,因为document.docx
文件在两个分支版本中内容不同 - 发生冲突后,git会进行自动合并处理,但是word的编码出现了问题
- 这说明了两个问题:
- 如果修改了
branch_2
的问题,就能正常合并 - word格式无法正常自动合并,可以尝试其他文件格式
- 如果修改了
- 出现了git 二进制文件冲突问题
warning:Cannot merge binary files
,超纲了
- 当你修改好了冲突之后,回来一看:地址位于
(master|MERGING)
- 这时就需要回退到当前版本:
git reset HEAD --hard
,因为HEAD
指的是当前环境
- 将
.git
和document.docx
删除,我们重来,嘿嘿(没有翻车) - 这次我使用
.txt
文件,里面啥都没写
- 标准一条龙
- 再打一套军体拳(应该知道写的是啥)
- 在两个不同版本里,也对txt文件做了版本修改
- 接着合并
- 因为txt文件编码符合要求,所以合并正常,没有warning
- git贴心地将txt改成了这样:
- 用这种方式来提示你这里有冲突(有点傻)
- 你就把txt改成你想要的样子
- 然后就新建一个分支,在新的分支底下保存新的版本(保证更新在平行版本下)
- 平行分支下版本也是平行的,分支与分支之间跳跃也非常的方便
- 可以想象:版本是横向的,分支是纵向的
(七)多人运动
多人运动基础
- 在git上创建账户
- Repositories就是仓库,去New一个
- 这就是新创建的仓库,可以等同于一个服务器端的仓库,用来和本地仓库沟通
- 左上角的
main▲
可以用来切换主分支,它默认是main
- 点开
Code▲
下拉菜单,在HTTPS底下可以找到该仓库的地址
- 我们的带
.git
隐藏文件的文件夹就是一个本地目录 - 使用
git remote add 自定义远程主机名 <github上的仓库地址,以.git结尾>
建立远程链接 - 你如果修改好了本地文件,最好新建一个分支来保存版本,当然,不这么做也不会出问题
- 使用
git push 远程主机名 本地分支名:远程分支名
来将本地分支推送到远程主机的远程分支 ↓ - 举个例子,比如说:
-
git push origin master
就是git push origin master:master
git push origin master:master
才是完整表达- 如果出现红色
[rejected]
错误,说明服务器版本与本地版本不一致,则: - 使用
git push -u origin 本地分支名:远程分支名 -f
来解决
-
- 这里不该写
master
的,因为服务器上的默认分支是main
- Git就会弹出一个Github登录窗口
登录就完事儿了,毕竟是在github上有号的人
没完呢,还会弹出OpenSSH的准入窗口,就把Github用户名和密码填上去就行
- 就会显示这些内容:
- 将服务器的分支跳到
master
- 就能看到本地上传成功的消息
- 但是我们的
test.txt
文件的版本还处于version_2
,是因为: - 这行指令:
git push 远程主机名 本地分支名:远程分支名
写错了 - 应该改为:
git push origin branch_3:master
- 刷新网页,实时更新
- 好耶,可以把任何东西传到服务器上!
- 那别人怎么下载呢
- 举个例子,狗屁不通文章生成器这个仓库
- 点击
Code▲
复制仓库链接
- 随便在哪新建一个文件夹:
- 右键——>
Git Bash Here
- 下载:
git clone <仓库链接,以.git结尾>
- 你就下载了源码
- 使用
git clone
你就可以下载github服务器上的所有文件 - 注意,在
BullshitGenerator
目录里,同样有一个.git
的隐藏文件 - 这说明
BullshitGenerator
目录也是一个本地仓库
多人运动进阶
回到我们的
git_test
目录假设说有人更新了github上的文件,你也必须更新本地文件
- 可以直接在文件夹
git clone
,但是有风险,我们不用 - 也可以使用如下方法:↓
- 可以直接在文件夹
第一步也是最重要的一步:新建一个分支并进入,记住,这是个坑,我检查了好几个小时
git merge
用于合并本地已修改代码git fetch 远程主机名
用于抓取服务器文件git merge 远程主机名/远程分支名
用于将本地文件与服务器同步,并在刚才创建的分支本地创建一个新的版本,版本无法重命名,只能commit
一个新的来命名
- 我如何删除服务器上的某个分支?
- 先使用
git branch -a
查看所有分支列表- 白色
main
是本地分支 - 绿色
master
是当前分支 - 红色是服务器分支,都有
remote
标识
- 白色
- 先将当前分支转到本地最大分支,比如说是
master
- 假设说要删掉
remotes/origin/master
的话, - 使用
git push origin --delete 该删除的分支名
多人运动流程简略
1 | 链接服务器:(只用执行一次,git会记住服务器地址的) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Iamsleepingnow 世界!