git crud
mkdir XX
git init [初始化仓库:任何版本都需要透过这个资料夹进行版本控制]
git status [git status 、 git add 指令提交档案给 Git 控管]
git add . [git md .gitignore git add *.html]
git commit -m"init commit"
git log --oneline --graph [--oneline`- 仅用一行显示每次的 commit `--graph` - 显示 commit 的树状结构]
git rm hello.html
git status
git commit -m"del file"
git status
git mv before2.html after2.html
git status
git commit -m"renamed"
👉 档案已加入追踪,但想还原之前工作目录所做的修改。
git add
git commit -m"rename"
git checkout after2.html [还原档案内容]
md index1.html
md index2.html
git add *
git status
git reset HEAD index2.html
git commit -m "reset"
git status
: 查询目前目录的「状态」git add
:把档案交给 Git ,让 Git 开始「追踪」目录,此时内容加到暂存区git commit -m"init commit"
:将暂存区的内容提交到储存库(Repository)保留
切记|git commit 只会处理「暂存区」里的内容git log
:检视 Git 纪录
git add .
指令|将目前所在的目录,以及它以下的子目录、子子目录... 等里的变动都加到暂存区,但如果是在这个目录外的东西,就不会被影响。
git add --all
指令|不管在哪一层目录,只要是这个专案里的东西,所有的变动都会加至暂存区。
暂存区好处
拥有暂存区,可以赋予 Git 更多操作上的弹性与灵活性。在 Commit 提交之前我们都可以针对不同状况去操作不同指令来控制档案。
例如:
- 修改了三个档案,其中一个不想提交,如何操作?
- 原先修改的档案想放弃,如何回到原来的版本?
- 尚未完成的档案,想先储存可以怎么做?
- 发现忘记切换分支怎么办,想切回正确的分支?
git修改与恢复
✏️ 在 Git 的世界里,不管是新增、删除或重新命名,都可以看为是一个「修改」的动作。
新增一个档案 > git add (暂时区) > git commit(储存区)
git add index.html
删除一个档案 > git rm (暂时区) > git commit(储存区)
git rm - 告知 git ,我们要「删除」的档案有哪些
重新命名一个档案 > git mv [旧档名]+[新档名](暂时区) > git commit(储存区)
git mv - 告知 git ,我们要「重新命名」的档案有哪些
- `git checkout`指令 + 分支名称 —> Git 切换到指定的分支
- `git checkout`指令 + 档名 / 路径 —> Git 不会切换分支,而是把档案从.git 目录里拉一份到目前的工作目录。
git log --online # 检视 Git 纪录(简单一行形式)
git reset [Commit 的 SHA-1 编号] # 还原指定的 Commit
git reset HEAD <file> # 还原「`指定`」的档案状态
git reset HEAD # 还原「全部」的档案状态
总结|可以清除过去的纪录,负责移动 HEAD 和 master 的指令。
建议使用时机:
1. `git add`加到不想要的档案,想*从暂存区移除掉*
1. *已经 Commit 后的档案*,发现有地方想修改或者有问题要修改
git reset 小科普
HEAD
指的是一个指标,指向当前所在的分支,git rerset的三种模式
git reset master^
git resetmaster^ --hard
git reset master^ --soft
Blob 储存档案「内容」、Tree 储存档案「名称」
Blob 属性(二进制大对象):git add
加至暂存区时,在.git 目录里产生一个 Blob 物件(存放档案的「内容」)
- 使用 git add 将档案加至暂存区后,会建立一个 Blob 物件,并根据物件的内容计算出 SHA-1 值。
SHA-1
值前 2 个字元作为子目录名称,剩余 38 个字元作为档案名称。- 档案内容为 Git
压缩演算法
后,将内容压缩之后的结果。 Tree :可以帮助我们储存档案的名称、 目录的名称 、 档案权限
Git 分支
✏️分支只是一个指向某个 Commit 的指标。因此删掉分支,对 Git 来说只是一个指标没有了,但是 Commit 的内容依然存在,所以我们可以透过git reflog
Commit 的 SHA-1 值接回分支。
👉 观念:虽然我们说明上都是讲「合并分支」,实际上合并的应该是「分支指向的 Commit」。
切换分支之前的修改依然会留在工作目录,不受影响。
git branch
git branch cat # 新增一个名为 cat 的分支
git branch -m cat eagle # 将 cat 分支名称更改为 eagle
git checkout eagle # 切換到 eagle 分支
git log --oneline
git checkout master
git branch -d eagle # 刪除 eagle 分支
git branch one # 新增一个 one 分支
git checkout one # 切换到 one 分支
// 重复动作提交第二次
touch hello.html # 新增一个档案
git add . # 加至暂存区
git commit -m"讯息记录" # 提交到储存库
git merge one --no-ff# 合并 one 分支
//fast-forward 模式 进行合并,简单来说可以想像是 master 分支可以将两个分支都直接收割了
分支冲突解决
在一个专案中,如果有多人合作,万一改到相同的样式设定,或者改到同一行 html 结构,那么在合并分支时,Git 就会很贴心的提醒你,现在有地方发生冲突
git merge hello
git status
打开有错误的档案,可以看到 Git 有贴心的帮你指出哪边发生冲突,将冲突的地方修改,选择留下最终要的那个 Code
git add . # 加至暂存区
git commit -m"讯息记录" # 提交到储存库
//非文字档的合并冲突
git checkout --ours [档名] // 如果决定使用当前分支的档案
git checkout --theirs [档名] // 如果决定使用对方的档案
git tag,git stash 暂存档案, git filter-branch
👉 假设今天不想要为还没完成的档案额外新增一个 Commit ,也不想要使用切换分支再回来 Reset 的动作,那么在 Git 的指令中,git stash指令也可以达到同样暂存档案的效果。
git checkout hello# 切换到 a_branch 分支
touch hello.html # 新增 hello.html 档案
git add . # 将所有档案加至暂存区
git stash # 暂存档案
git stash list
git stash pop - 叫回暂存的档案,并从 stash list 中移除
//git stash pop stash@{1}
git stash drop - 清除暂存档案
git stash apply - 将某个暂存档案套用在目前分支,原本的 Stash 依然保留着
git stash clear # 清除所有暂存档案
⚠️分支会随着 Commit 移动,而标签则是固定留在某个 Commit 上
git tag -a [Tag名称] -m"纪录讯息"
git show [标签名称] # 查看标签内容
git tag -d [标签名称] # 删除特定标签
//移除重要个资或彻底清除档案
git filter-branch --tree-filter "rm -f after2.html"
我们拥有之前的 HEAD 的 SHA-1 值,所以当如果我们后悔刚才所执行的 filter-branch 指令时,可以使用以下指令来回复:
git reset refs/heads/eagle --hard
远程仓库
总结|Pull 指令是去上限抓东西下来 (Fetch),并更新本机的进度(Merge)
👉 git pull
= git fetch
+ git merge
//远端的节点名称为`origin`、分支为`master`
git fetch origin
git merge oringin/master
git branch -r # 检视远端分支
git branch -a # 检视所有分支
git pull --rebase #使用 rebase 模式合并抓取档案 Rebase 的优点在于不会产生额外的 Commit 来纪录合并这个动作。
git branch -m main master
git fetch origin
git branch -u origin/master master
git remote set-head origin -a
git remove -v
git remote rm origin /git remote remove origin
git remote add origin
git pull origin master
git add .
git commit -m "1.0.0"
git merge origin/master --allow-unrelated-histories
git push -u origin master
git push -f origin master
git help XX
git add .
git status
git commit 建立版本
git commit -m "版本紀錄的說明文字"
git log
git rm 'Gruntfile.js'
git reset(重置「索引状态」)
git reset --hard (把工作目录也给还原到目前的最新版)
还原其中一个被改坏的档案:git checkout master Gruntfile.js
##这样可以避免使用git reset --hard一次把所有档案都给还原了!
档案更名:git mv test unit-test (把test目录更名为unit-test名称)
小声说
点赞是不要钱的,但作者会傻乐好几天~