Version: Next
Git Basic
解释 shell 命令的网站
explainshell.com
Version Control System —— VCS
- 版本控制系统
快速上手
init diff status commit log show add
- 创建文件夹,执行
git init
进行初始化 git status
——显示状态- 响应
On branch master
表示在主分支上 Untracked files
:表示没添加的文件,后续使用git add xxx
来添加到 git 管理Changes to be committed
:已经做了修改,但还没有 commit 提交的文件
- 响应
git commit -m "{提交信息}"
git diff
——显示变化内容,仅限已经add
的文件- 比较的是
workspace
与staging
差别
- 比较的是
git diff --cached
——显示变化内容,包括未add
的文件- 比较的是
staging
与local repository
git diff --staged
是同义语句
- 比较的是
git log
——显示commit
记录git show
——显示详细提交信息
Git 工作区
workspace
:当前工作目录Local Repository
本地的代码仓库Staging
:暂存区
选择性提交
git add -p 文件名
git add -p
——会逐个文件询问- 选项 y、n、q、a、d、s、e、?
?
:显示帮助,会显示上面几个操作的具体含义s
:split 分割的意思,可以用来只提交一个文件中的部分行
- 变绿:修改进入了 staging,等待 commit
- 变红:修改还在 workplace
练习1
- 在本地创建一个名为
YOUR_NAME-learning-git
目录,并用 git 管理目录- 在目录中创建一个
exercise-1.txt
文件,在其中添加任意文字,并将添加的文字提交到版本库- 分别创建
exercise-2.txt
、exercise-3.txt
文件,在其中添加任意文字,并将添加的文字提交到版本库- 对
exercise-3.txt
做任意修改,使用git diff
命令查看变化,然后将变化提交到版本库,请注意使用有意义的提交信息- 反复重复练习上一步,直到你非常熟悉上一步的操作,你可以尝试在一个提交中修改多个文件
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- 这样就可以了,不需要再使用普通
reset
和checkout
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
- 任意修改
exercise-2.txt
文件,然后使用 git 命令撤销修改,注意在过程中使用恰当的 git 命令查看状态和比较变化- 任意修改
exercise-2.txt
文件,添加到 Staging 区,然后使用 Git 命令撤销修改,注意在过程中使用恰当的命令查看状态和比较变化- 任意修改
exercise-2.txt
文件,提交修改,然后使用 git 命令撤销修改,注意在过程中使用恰当的命令查看状态和比较变化- 重复练习以上三个题目,直到你非常熟悉这些操作
- 使用恰当的 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
- 在本地工作区任意创建三个文件,分别写入任意内容,提交,推送到 github
- 如果推送被远端拒绝,请阅读 git 的输出信息,然后做适当处理,再推送到远端
- 拉取 Github 上的提交到本地,如果此时你能看到别人提交的文件,请在别人提交的文件上做任意修改,ing将修改后的文件推送到远端;如果此时看不到任何人的提交,请稍等一会,再次拉取 Github 上的提交到本地
- 如果推送被远端拒绝,请阅读 git 的输出信息,然后做适当处理,再推送到远端
- 如果在这个过程中遇到冲突,请解决冲突
工作流 workflow
git pull -rebase
- 做一些修改
git add
并且git commit
- git pull --rebase (解决冲突)
- git push
以上只是众多 Git 工作流实践中的一种,其他的还有
- Trunk-based
- Gitlab workflow
- Github workflow
- gitflow
基本思想
- 确保追溯一切变化
- 便于回退历史版本
- 保护公共分支不被污染
- 方便引入变化
练习4
- Github 创建一个私有仓库
- 本地生成 SSH-key,并将公钥配置到 Github 上
- 将仓库克隆到本地
- 在本地做任意修改,推送到远端
- 至少完成 3 个提交