Version: Next

Git Basic

Git SSH 22 端口拒绝访问处理方法

常见实例场景手册

git 分支在线练习

explain git with D3

git 命令速查

commit 信息规范

解释 shell 命令的网站

  • explainshell.com

Version Control System —— VCS

  • 版本控制系统

快速上手

init diff status commit log show add

  1. 创建文件夹,执行 git init 进行初始化
  2. git status——显示状态
    • 响应 On branch master 表示在主分支上
    • Untracked files:表示没添加的文件,后续使用 git add xxx 来添加到 git 管理
    • Changes to be committed:已经做了修改,但还没有 commit 提交的文件
  3. git commit -m "{提交信息}"
  4. git diff——显示变化内容,仅限已经 add 的文件
    • 比较的是 workspacestaging 差别
  5. git diff --cached——显示变化内容,包括未 add 的文件
    • 比较的是 staginglocal repository
    • git diff --staged 是同义语句
  6. git log——显示 commit 记录
  7. git show——显示详细提交信息

Git 工作区

image-20220405094621296

  • workspace:当前工作目录
  • Local Repository 本地的代码仓库
  • Staging:暂存区

选择性提交

  • git add -p 文件名
  • git add -p——会逐个文件询问
    • 选项 y、n、q、a、d、s、e、?
    • ?:显示帮助,会显示上面几个操作的具体含义
    • s:split 分割的意思,可以用来只提交一个文件中的 部分行
      • 变绿:修改进入了 staging,等待 commit
      • 变红:修改还在 workplace

练习1

  1. 在本地创建一个名为 YOUR_NAME-learning-git 目录,并用 git 管理目录
  2. 在目录中创建一个 exercise-1.txt 文件,在其中添加任意文字,并将添加的文字提交到版本库
  3. 分别创建 exercise-2.txtexercise-3.txt 文件,在其中添加任意文字,并将添加的文字提交到版本库
  4. exercise-3.txt 做任意修改,使用 git diff 命令查看变化,然后将变化提交到版本库,请注意使用有意义的提交信息
  5. 反复重复练习上一步,直到你非常熟悉上一步的操作,你可以尝试在一个提交中修改多个文件

checkout reset reflog

如果我在文件中做了不想要的修改,需要回退,该怎么做

如果修改只在本地文件进行,还没有进行 add 操作

git checkout {filename}

git checkout .

  • 将在本地 workplace 进行的,还没有 add 到 staging 的操作全部回退

如果已经 add 了,怎么回退呢?

  • 使用 git reset {filename}
    • 执行之后,会提示 Unstaged changes,表示从 staging 已经退回到 workplace 去了
    • 接下来还要执行一下 checkout,把 workplace 中的修改再回退

如果已经 commit 了,咋办呢

  • git reset --hard head~
    • 会返回指向某个 commit 记录的 Hash Code
    • 这样就可以了,不需要再使用普通 resetcheckout

HEAD

每一次 commit 都会生成一个 Hash Code 用来作为 ID 使用

  • HEAD 是一个 指针,用来指向当前正在生效的 commit 版本,所以 HEAD 默认指在最新的那个 commit 上
  • 可以用 git reset --hard {commit_hash} 来回退到某次具体 commit 的版本
  • git reset --hard HEAD~ 中的 HEAD 表示当前的最新 Commit hash,~ 表示往前一次 commit hash~~ 表示往前两个...
  • ~^ 同义,推荐 ~
  • 还可以使用 git reset --hard HEAD~3 当前 HEAD 之前的第三个 commit

问题:那我把 HEAD 拉到过去的某个 commit 上去了,比较新的哪些 commit 会怎么样,会丢失吗,还是说能找回来呢?

  • git reflog
  • 会显示出所有 commit hash,可以看到过去的所有 HEAD
  • 再用 git reset --hard {commit_hash} 跳到指定的 commit 就可以了
  • 简单地说,比较新的那些 commit 的 hash code 可以用 reflog 命令查找到

练习2

  1. 任意修改 exercise-2.txt 文件,然后使用 git 命令撤销修改,注意在过程中使用恰当的 git 命令查看状态和比较变化
  2. 任意修改 exercise-2.txt 文件,添加到 Staging 区,然后使用 Git 命令撤销修改,注意在过程中使用恰当的命令查看状态和比较变化
  3. 任意修改 exercise-2.txt 文件,提交修改,然后使用 git 命令撤销修改,注意在过程中使用恰当的命令查看状态和比较变化
  4. 重复练习以上三个题目,直到你非常熟悉这些操作
  5. 使用恰当的 git 命令,查看各个提交的历史状态,在各个历史提交中反复切换

clone push

  • Clone:把远程仓库拉到本地
  • push:将本地仓库推到远程仓库
    • git push origin master

remote

git remote -v 查看所有远程仓库

  • fetch 表示当前如果你从远程仓库拉代码到本地用的仓库地址
  • push 表示当前你从本地往远程仓库推用的仓库地址

pull

当你 clone 了一个项目,做了修改再往回 push 的时候,可能会被拒绝,这是由于,若果 多个人 clone 了同一个版本,当其中一个人做了修改并率先进行了 push 之后,后续人的 push 都会被 github 判定为未基于最新版本,也就是缺失了第一个 push 的那个人做的修改,因而第一个人做的修改与后续所有人做的修改存在 冲突 conflict

  • git pull --rebase 拉取远程仓库代码
  • 如果远程仓库的代码被修改了,本地仓库的代码经历了与其不同的修改,那么就会触发 冲突,会出现 unmerged path。未合并路径
  • 手动 merge:用 vscode 之类的编辑器进入目标文件,手动进行修改,保留你需要的内容
  • 修改过后的文件需要进行 git add {filename} 操作
  • git rebase --continue 告诉 git 你改好了

练习3

  1. 在本地工作区任意创建三个文件,分别写入任意内容,提交,推送到 github
  2. 如果推送被远端拒绝,请阅读 git 的输出信息,然后做适当处理,再推送到远端
  3. 拉取 Github 上的提交到本地,如果此时你能看到别人提交的文件,请在别人提交的文件上做任意修改,ing将修改后的文件推送到远端;如果此时看不到任何人的提交,请稍等一会,再次拉取 Github 上的提交到本地
  4. 如果推送被远端拒绝,请阅读 git 的输出信息,然后做适当处理,再推送到远端
  5. 如果在这个过程中遇到冲突,请解决冲突

工作流 workflow

  1. git pull -rebase
  2. 做一些修改
  3. git add 并且 git commit
  4. git pull --rebase (解决冲突)
  5. git push

以上只是众多 Git 工作流实践中的一种,其他的还有

  • Trunk-based
  • Gitlab workflow
  • Github workflow
  • gitflow

基本思想

  • 确保追溯一切变化
  • 便于回退历史版本
  • 保护公共分支不被污染
  • 方便引入变化

练习4

  1. Github 创建一个私有仓库
  2. 本地生成 SSH-key,并将公钥配置到 Github 上
  3. 将仓库克隆到本地
  4. 在本地做任意修改,推送到远端
  5. 至少完成 3 个提交