Git操作步骤图解_GitBash

(〇)前戏

比较重要的内容

  • Git下载链接 清华镜像Git下载链接

  • 记得要在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
2
3
4
5
类似:
XXX.XXX.XXX.XXX github.com
XXX.XXX.XXX.XXX github.global.ssl.fastly.net
还要加上:
199.232.4.133 raw.githubusercontent.com

Git常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
git init 【初始化仓库】
git clone <仓库地址> 【窃取仓库】
git status 【工作区文件状态】
git add <文件名> 【将无效文件或修改文件变为暂存文件】
git add . 【将所有无效文件或修改文件变为暂存文件】
git commit -m <版本名> 【将暂存文件和有效文件保存为版本】
git commit --amend 【修改追加最后一个保存版本】
git log 【查看版本状态】
git log --all --oneline 【查看所有分支下版本状态的精简版】
git reflog 【查看日志历史】
git branch <分支名> 【新建分支】
git checkout -b <分支名> 【新建分支并进入】
git checkout <分支名> 【进入分支】
git checkout -d <分支名> 【删除分支】
git branch 【查看分支列表】
git reset <版本哈希或前7位> --soft/hard/mixed 【回溯版本】
git rebase -i <开始版本哈希值> <结束版本哈希值> 【版本修改】
git merge <分支名> 【合并分支】
git remote add <自定义远程主机名> <github上的仓库地址,以.git结尾> 【建立远程链接】
git push 远程主机名 <本地分支名>:<远程分支名> 【上传到服务器】
git push -u origin <本地分支名>:<远程分支名> -f 【覆盖上传到服务器】
git fetch <远程主机名> 【抓取服务器文件】
git merge <远程主机名>/<远程分支名> 【同步分支到服务器上】
git push origin --delete <该删除的分支名> 【删除服务器分支】

(一)初始化

  • 在想要作为仓库的电脑目录里右键打开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
2
3
4
5
6
7
8
9
10
11
12
13
14
# p, pick <commit> = use commit
版本重命名 r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
版本合并 s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
  • rebase 执行完之后,如果指针出于游离状态 detached ,就使用:
    • git rebase --abort 来退出 rebase

(五)分支

  • 如果说上面的回溯很搞人心态,那么就需要使用分支系统
  • 在例子里,假设希望在 version_2 的基础上继续增加版本,但希望版本与版本之间的切换更加的自如
  • 那么就在 version_2 这里新建分支
  • git checkout -b 分支名 新建一个分支并进入分支,或者使用 git branch 分支名 创建分支
  • 然后就发现:右边蓝字修改了

  • 再回到 master 主分支

  • 再新建一个分支,再回到主分支

pics/git_pics/19_branchcheck.png


  • git branch 用于查看所有分支
  • * 号的分支是当前所处分支

pics/git_pics/20_branch.png

  • 现在进入 branch_1 ,修改 document.docx 文件

pics/git_pics/21_branchmod.png

  • 保存,进入暂存,一条龙

pics/git_pics/22_save.png

  • branch_1 保存成一个版本

pics/git_pics/23_commit.png


  • 现在在 branch_1master 里查看现在的版本状态
  • 可以发现,分支里创建的版本在 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 分支名 来跳转当前分支,会发现文件夹里的文件也在实时地变换

pics/git_pics/26_check.png

pics/git_pics/27_check.png

  • 所以,现在的关系是这样的:

  • 使用 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_3branch_2/version_4 ,将 version_3version_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 指的是当前环境


  • .gitdocument.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

  • 刷新网页,实时更新

  • 好耶,可以把任何东西传到服务器上!

  • 随便在哪新建一个文件夹:

  • 右键——> 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
链接服务器:(只用执行一次,git会记住服务器地址的)
git remote add 自定义远程主机名 <github上的仓库地址,以.git结尾>
------------------------------------------------------------------------------
上传:
先保存修改为版本
新建分支并进入(可选)
git push 远程主机名 本地分支名:远程分支名 (最好输入一个新的远程分支)
如果报错:
就:git push -u origin 本地分支名:远程分支名 -f (最好输入一个新的远程分支)
------------------------------------------------------------------------------
下载:
如果没有本地目录:
就使用克隆:git clone <仓库链接,以.git结尾>
克隆之后别忘了使用 git checkout ... 来进入某个分支
如果有本地目录:
新建分支并进入(必选)
git merge
git fetch 远程主机名
git merge 远程主机名/远程分支名
------------------------------------------------------------------------------
删除:
当前分支转到本地最大分支,类似 master
git push origin --delete 该删除的分支名
------------------------------------------------------------------------------
速度太慢:
C:\Windows\System32\drivers\etc\hosts: 在结尾加上:
151.101.113.194 github.global.ssl.fastly.net
192.30.253.112 github.com