Git 原理探秘
版本控制系统与 Git
Git 内部原理基础
Git 基本操作
Git 团队协同开发指令
还没push 前可以做的事
Git概念及工作原理总结
Git 内部原理详解
本文档使用 MrDoc 发布
-
+
首页
版本控制系统与 Git
## 原因 在软体开发的过程中,程式码每天不断地产出,过程中会发生以下情况: 1. 档案被别人或自己覆盖,甚至遗失 2. 想复原前几天写的版本 3. 想知道跟昨天写的差在哪里 4. 是谁改了这段程式码,为什么 5. 软体发行,需要分成维护版跟开发版 因此,我们希望有一种机制,能有帮助我们: 1. 可以随时复原修改,回到之前的版本 2. 多人协作时,不会把别人的东西盖掉 3. 保留修改历史记录,以供查询 4. 软体发行时,可以方便管理不同版本 ## 定义 一个版本控制系统 Version Control System (VCS),通常有以下功能 1. 建立 Repository (储存库),用来保存程式码。 2. 方便散布程式给团队,有效率协同开发 z 3. 记录谁改变什么、在什么时候、因为什么原因 z 4. Branch(分支),可因不同情境分开开发 5. Tag(标签) 重要里程碑,以便参照 那么,什么东西要存进 *Repository* 呢? 简单来说,就是所有跑起来这个专案需要的东西,包括所有原始码、范例设计档、文件等等。而像是暂存档、log 档案、build files 等编译后的产物则不需要存进 *Repository* 。 ## 演进历史 版本控制系统从古至今,有几种不同的模式: ### VCS 位置 本地端使用 copy paste 进行资料夹管理,例如 rcs。当然,缺点是无法协同开发。 ### Centralized VCS (Lock 型,悲观锁定) 有一台中央团队共用的 *Repository* ,当有人要编辑某个档案时,进行锁定,以避免其他人也同时编辑造成冲突。 虽然可以避免冲突,但是很不方便。其他人得排队才能编辑档案,万一先取出的人写很久或忘记 unlock… ### Centralized VCS(Merge 型,乐观锁定) 也是有一台中央团队共用的 *Repository* ,但是不用 *Lock* 来避免冲突,而是事后发现如果有别人也修改同一个档案(称作冲突),再进行手动编修解决。有非常多的 VCS 属于这一型,包括 CVS, Subversion, Perforce 等等。 Centralized VCS 的共同缺点是做什么事都要跟伺服器连线,会比较慢。另外也有单点故障的风险(Single point of failure),只要伺服器坏掉,大家就不用作事了。 ### 分布式 VCS 分散式版本控制系统让本地端也拥有完整的 *Repository* ,就没有上述集中式的问题,即使没网路,照常可以 commit 和看 history log,也不用担心 server 备份。例如 Git, Mercurial(Hg), Bazaar 等就是属于分散式版本控制系统。 若要说有什么缺点,就是能力越大,功能就越复杂,一开始学习上会比较辛苦一点。 ## Git 简介 版本控制系统是当代软体开发所不可或缺的工具,而 Git 是其中最先进和热门、且为开放原始码的分散式版本控制系统(DVCS)。 Git 是由 Linus Torvalds 所发明,一开始的目的是为了管理 Linux Kernel 原始码,他于 2005/4 开始开发,2005/6 开始管理 Linux Kernel,2005/12 就释出了 1.0 版。 因其分散式、效能好、本地存取、无痛分支的特性,而普遍适合各种开发流程,近年来受到多数人喜爱。使用 Git 的专案包括:Linux Kernel, Apache, Debian, Drupal, Eclipse, Fedora, Gnome, KDE, Perl, PHP, PostgreSQL, Ruby on Rails, Node.js, JQuery, YUI… 等等。诸如 Google, facebook, Microsoft, Twitter, Linkedin, NetFlix 等公司皆有使用 Git 作为版本控制系统。 不同于传统 Delta 储存方式,记录每次档案变更,开分支需要建立副本。Git 使用 DAG (Directed acyclic graph) 的储存方式,利用有向无环图来记录 metadata 建构出 snapshots,相同内容只会有一份记录。开分支也只是建立参考。Git 的内部原理,下一章会进一步介绍。这里读者只要有一个概念,理解 Git 最好的方法,就是用图论中的节点(node)和指标(points)来思考,所有 *Git* 的指令操作,都是在操作这些节点,新增、修改、删除、变更指标。 ## Git 安装 ### 安装步骤(Ubuntu) 在 Ubuntu 上安装 Git ``` sudo apt-get install git-core git config --global user.name "Your Name" git config --global user.email "your@email.com" git config --global color.ui true git config --global core.editor vi 或 git config --global core.editor gedit ``` 安装 GUI ``` sudo apt-get install gitg 或 sudo apt-get install gitk ``` > Github 上的安装文件[http://help.github.com/linux-set-up-git/](http://help.github.com/linux-set-up-git/) ### 安装步骤(Windows) Windows 的 Git 请至官网下载安装[Git Downloads](http://git-scm.com/download/win)。用以下步骤产生 SSH key: ``` $ ssh-keygen -t rsa -C "your_email@example.org" ``` 接着用文字编辑器打开“%homedrive%%homepath%.ssh\id_rsa.pub” 的内容,即是你的 Public SSH key。 > 如果需要 GUI 介面,可以加装[SourceTree](http://www.sourcetreeapp.com/)。 Windows 平台上还有一件要注意的事情,就是对于换行字元的处理与 Unix/Mac 平台不同,会让 Git 误判成有修改,因此需要多以下设定: ``` $ git config --global core.autocrlf true $ git config --global core.safecrlf true ``` > Github 上的安装文件[http://help.github.com/win-set-up-git/](http://help.github.com/win-set-up-git/) ### 安装步骤(Mac) Mac 内建就有 Git 了。如果需要安装最新版,可以用[Homebrew](http://brew.sh/): ``` $ brew install git ``` > Github 上的安装文件[http://help.github.com/mac-set-up-git/](http://help.github.com/mac-set-up-git/) ### 产生 SSH Key 因为 Git 的伺服器大多使用 SSH public/private key 来做认证,请用以下步骤产生 SSH Key。稍后会用[Github](http://github.com/)练习。 ``` ssh-keygen -t rsa -C "your_email@youremail.com" cat ~/.ssh/id_rsa.pub 複製下來貼到 Github 帳號 -> Account Settings -> SSH Keys 裡 這樣在 Github 開專案,就可以 push 和 pull 下來了。 ``` ### 其他参考步骤 一些好用的 git alias,请编辑~/.gitconfig ``` [alias] co = checkout ci = commit st = status br = branch -v rt = reset --hard unstage = reset HEAD uncommit = reset --soft HEAD^ l = log --pretty=oneline --abbrev-commit --graph --decorate amend = commit --amend who = shortlog -n -s --no-merges g = grep -n --color -E cp = cherry-pick -x nb = checkout -b # 'git add -u' handles deleted files, but not new files # 'git add .' handles any current and new files, but not deleted # 'git addall' now handles all changes addall = !sh -c 'git add . && git add -u' # Handy shortcuts for rebasing rc = rebase --continue rs = rebase --skip ra = rebase --abort ``` 命令列(Bash)提示,请编辑~/.bashrc ``` function git_branch { ref=$(git symbolic-ref HEAD 2> /dev/null) || return; echo "("${ref#refs/heads/}") "; } function git_since_last_commit { now=`date +%s`; last_commit=$(git log --pretty=format:%at -1 2> /dev/null) || return; seconds_since_last_commit=$((now-last_commit)); minutes_since_last_commit=$((seconds_since_last_commit/60)); hours_since_last_commit=$((minutes_since_last_commit/60)); minutes_since_last_commit=$((minutes_since_last_commit%60)); echo "${hours_since_last_commit}h${minutes_since_last_commit}m "; } PS1="[\[\033[1;32m\]\w\[\033[0m\]] \[\033[0m\]\[\033[1;36m\]\$(git_branch)\[\033[0;33m\]\$(git_since_last_commit)\[\033[0m\]$ " ```
追风者
2022年3月3日 00:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码