Git 基础篇
人生不能重来,但Git可以
什么是git ?
分散式版本控制使用 SHA1 杂凑演算法只在乎档案内容,不在乎目录基础概念
当执行 git init 初始化指令后,会在该资料夹下面新增一个 .git
的资料夹,该资料夹就是 Git Repository 的本体所在。其中包含 blob objects, branch, remote, config 设定档等。.git
储存了 Git 所有资讯。在 Local 端对 Git 的所有操作,也都是反映在这个资料夹中。
.git
内包含几个部分
object, commit message 以及所指向的 tree object 资讯。tree objects - 记录资料夹的档案结构,包含档案的路径,名称,模式以及对应的 blob objects。blob objects - 记录实际档案物件的二进位内容。
当我们每次进行 branch 切换时,
Git 会去 objects 资料夹中找出该 branch 对应的 commit object从 commit object 中取得对应的 tree object 后再由 tree object 所记录的档案结构将资料夹回复到该 branch 所对应的状态
基本 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 ? 如何做
状况题记录
如何修改 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 之修改历史纪录的指令的场合。
"远程版本回推"
注意: 该方法因为会修改远程,所以在使用时必须与同伴沟通好,尽量避免此方法先按照上述将本地branchA退回到希望的版本在使用git push -f origin branchA
整理分支
在开发过程中,为了确保主线不被开发过程中的代码影响,所以我们会开立许多分支(功能),这样做的好处是可以独立开发互不影响,但相对的就会有许多支线,相当混乱的状况,**所以当我们开发完成后,可以先做分支整理
**在推至主线上,这样在查看纪录时也比较方便。
git branch -d <branchName>
删除远程分支: git push -d origin <branchName>
合併分支:git rebasegit merge突然要修改别的分支,但手上的分支尚未到一个段落
参考
先进行add、commit(完成后就可以先进行其他分支的工作)切回未处理完成的分支git reset HEAD^
(reset预设是mixed,所以档案会被丢回工作区)