自我笔记 - Git 日常使用

Git 基础篇

人生不能重来,但Git可以

什麽是git ?

  • 分散式版本控制
  • 使用 SHA1 杂凑演算法
  • 只在乎档案内容,不在乎目录

基础概念

当执行 git init 初始化指令後,会在该资料夹下面新增一个 .git 的资料夹,该资料夹就是 Git Repository 的本体所在。其中包含 blob objects, branch, remote, config 设定档等。.git 储存了 Git 所有资讯。在 Local 端对 Git 的所有操作,也都是反映在这个资料夹中。

.git 内包含几个部分

  • HEAD - 目前所在的 branch。
  • config - 该 Git 资料夹的区域设定档。
  • index - 资料暂存区
  • objects (如下图所示) - Git 所有资料的 blob objects 储存处,主要包含三种类型
    • commit objects - 每笔 commit 的资讯,包含 author, parent commit
      object, commit message 以及所指向的 tree object 资讯。
    • tree objects - 记录资料夹的档案结构,包含档案的路径,名称,模式以及对应的 blob objects。
    • blob objects - 记录实际档案物件的二进位内容。

当我们每次进行 branch 切换时,

  1. Git 会去 objects 资料夹中找出该 branch 对应的 commit object
  2. 从 commit object 中取得对应的 tree object 後
  3. 再由 tree object 所记录的档案结构将资料夹回复到该 branch 所对应的状态
    https://ithelp.ithome.com.tw/upload/images/20210721/20132538wXm35SdmJv.png

基本 Action

在git中最常用的指令

  • git clone <url> : 将远端数据库克隆一份至本地
  • git add : 将档案加入至暂存区域
  • git commit : 将存於暂存区域的档案提交到本地储存库
  • git push origin <branchName> : 推至远端数据库
  • git pull origin <branchName> : 将远端数据库与本地分支同步
  • git checkout <branchName> : 在本地分支切换(连动工作目录,如基础概念所示)

commit 重点在於让协同夥伴了解做了那些改变

Why ? 为了甚麽而做,可能是使用者提了什麽需求、发现了那些BUG...
What ? 做了什麽
How ? 如何做
https://ithelp.ithome.com.tw/upload/images/20210721/20132538Ys6B699jIk.png


状况题记录

如何修改 commit 纪录

  • 修改 commit 讯息
    注记: 新的commit会更改SHA-1值
    • 修改 最新一笔 纪录:
      git commit --amend -m "新讯息"
      
    • 修改其他历史纪录:
      git rebase -i <须回朔的范围SHA-1值>
      
      跳出 Vim 编辑器:
        pick ec327e4 emcs 功能开启
        pick d3f0b4a emcs 功能初版
        pick 5b72b9e sqc 功能新增
        pick b5ba78a sqc first commit
      
      说明:
      这里的pick代表保留这次的commit,不做修改,将以上改为 ↓
      reword代表改变这次的commit,可用 r 简写
        reword ec327e4 emcs 功能开启
        reword d3f0b4a emcs 功能初版
        pick 5b72b9e sqc 功能新增
        pick b5ba78a sqc first commit
      
      上面选择修正两项commit讯息,按下储存离开後,会再跳出vim介面即可修改内容,如下
        ee6e6d6 sqc 功能新增
        8c2b80f emcs 功能初版(commit修正)
        31726f3 emcs 功能开启(commit修正)
        1507b8b Initial commit
      

穿梭各版本

  • git reflog 查看所有纪录

  • git log --oneline -n 可以查看目前所在分支前 n 次的commit纪录

  • 使用 reset

    • mixed是预设的参数,Commit 拆出来的档案会被丢回工作目录。
    • soft 模式,Commit 拆出来的档案会直接放在暂存区。
    • hard 模式,Commit 拆出来的档案,不管是工作目录以及暂存区的档案都会丢掉。
      • git reset --hard HEAD 回复到最新提交版本
      • git reset --hard HEAD~ 等於 ~1 回复到上一个提交版本
      • git reset --hard HEAD~n n 等於往上第几个提交版本 回复之前指定的提交版
        (也可以使用SHA-1值)
  • 使用 revert

    • git revert HEAD
      会新增一个 Commit 来反转(或説取消)另一个 Commit 的内容,
      原本的 Commit 依旧还是会保留在历史纪录中。
      虽然会因此而增加 Commit 数,但通常比较适用於已经推出去的 Commit
      或是不允许使用 Reset 或 Rebase 之修改历史纪录的指令的场合。
  • "远程版本回推"

    • 注意: 该方法因为会修改远程,所以在使用时必须与同伴沟通好,尽量避免此方法
    1. 先按照上述将本地branchA退回到希望的版本
    2. 在使用 git push -f origin branchA

整理分支

在开发过程中,为了确保主线不被开发过程中的代码影响,所以我们会开立许多分支(功能),这样做的好处是可以独立开发互不影响,但相对的就会有许多支线,相当混乱的状况,**所以当我们开发完成後,可以先做分支整理**在推至主线上,这样在查看纪录时也比较方便。

  • 删除本地分支: git branch -d <branchName>
  • 删除远程分支: git push -d origin <branchName>
  • 合并分支:
    • git rebase
    • git merge

突然要修改别的分支,但手上的分支尚未到一个段落

参考

  • 先进行add、commit(完成後就可以先进行其他分支的工作)
  • 切回未处理完成的分支
  • git reset HEAD^ (reset预设是mixed,所以档案会被丢回工作区)

<<:  Install Filebeat

>>:  给网站架设初心者:初阶观念与趋势剖析

NIST SP 800-53A(附录E:渗透测试)

企业通常会进行渗透测试,以验证现有的安全和隐私控制,并通过发现漏洞和利用漏洞,彻底记录测试期间执行的...

12 | WordPress 图库区块 Gallery Block

这次讨论的《图库区块》应用,图库区块可让你轻松地新增多张相片,并以引人入胜的方式自动排列相片。是《...

DAY2 简单介绍Arduino的使用

大家好今天要介绍arduino的使用,首先要先请各位下载他们官方的arduino IDE Ardui...

Flutter体验 Day 24-sqflite

sqflite 昨日我们使用WebSocket技术建立了一个简单聊天室,不过每次重新刷新画面後聊天室...

Learning How to Make a Movie

"The Great Movie Experience" as Myron En...