git工作笔记

156 阅读7分钟

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"
  1. git status: 查询目前目录的「状态
  2. git add :把档案交给 Git ,让 Git 开始「追踪」目录,此时内容加到暂存区
  3. git commit -m"init commit"  :将暂存区的内容提交到储存库(Repository)保留
    切记|git commit 只会处理「暂存区」里的内容
  4. git log :检视 Git 纪录

git add .指令|将目前所在的目录,以及它以下的子目录、子子目录... 等里的变动都加到暂存区,但如果是在这个目录外的东西,就不会被影响。

git add --all指令|不管在哪一层目录,只要是这个专案里的东西,所有的变动都会加至暂存区。

image.png

暂存区好处

拥有暂存区,可以赋予 Git 更多操作上的弹性与灵活性。在 Commit 提交之前我们都可以针对不同状况去操作不同指令来控制档案。

例如:

  1. 修改了三个档案,其中一个不想提交,如何操作?
  2. 原先修改的档案想放弃,如何回到原来的版本
  3. 尚未完成的档案,想先储存可以怎么做?
  4. 发现忘记切换分支怎么办,想切回正确的分支

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 [CommitSHA-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

image.png

image.png

Blob 储存档案「内容」、Tree 储存档案「名称」

Blob 属性(二进制大对象):git add加至暂存区时,在.git 目录里产生一个 Blob 物件(存放档案的「内容」)

  1. 使用 git add 将档案加至暂存区后,会建立一个 Blob 物件,并根据物件的内容计算出 SHA-1 值。
  2. SHA-1值前 2 个字元作为子目录名称,剩余 38 个字元作为档案名称
  3. 档案内容为 Git 压缩演算法后,将内容压缩之后的结果。 Tree :可以帮助我们储存档案的名称目录的名称 档案权限 image.png

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"

我们拥有之前的 HEADSHA-1 值,所以当如果我们后悔刚才所执行的 filter-branch 指令时,可以使用以下指令来回复:
git reset refs/heads/eagle --hard

image.png

远程仓库

总结|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名称)
小声说

点赞是不要钱的,但作者会傻乐好几天~