Git 是近年來(lái)被廣泛采用的版本控制系統(tǒng)工具,主要因?yàn)?Git 可以同時(shí)處理本地和遠(yuǎn)程源代碼管理,而且非常適合團(tuán)隊(duì)協(xié)作開(kāi)發(fā)。使用 Git,用戶可以輕松地跟蹤文件的變化、回退到歷史版本、分支管理、合并代碼等操作,非常方便。Debian 能夠提供免費(fèi)的 Git 服務(wù),本文將介紹一些Debian的Git相關(guān)配置。
一、Git軟件包
git 相關(guān)包和命令列表:
軟件包 | 流行度 | 大小 | 命令 | 說(shuō)明 |
git | V:345, I:547 | 46734 | git(7) | Git 快速、可擴(kuò)展、分布式的版本控制系統(tǒng) |
gitk | V:5, I:34 | 1838 | gitk(1) | 有歷史功能的 Git 圖形倉(cāng)庫(kù)瀏覽器 |
git-gui | V:1, I:18 | 2429 | git-gui(1) | Git 圖形界面(無(wú)歷史功能) |
git-email | V:0, I:10 | 1087 | git-send-email(1) | 從 Git 用電子郵件發(fā)送收集到的補(bǔ)丁 |
git-buildpackage | V:1, I:9 | 1988 | git-buildpackage(1) | 用 Git 自動(dòng)制作 Debian 包 |
dgit | V:0, I:1 | 484 | dgit(1) | Debian 檔案庫(kù)的 git 交互操作 |
imediff | V:0, I:0 | 169 | git-ime(1) | 交互式的分開(kāi) git 提交的輔助工具 |
stgit | V:0, I:0 | 601 | stg(1) | 封裝的 git (Python) |
git-doc | I:12 | 13208 | N/A | Git 官方文檔 |
gitmagic | I:0 | 721 | N/A | Git 魔術(shù),易于理解的 Git 手冊(cè) |
二、配置Git客戶端
可以在 “~/.gitconfig” 里面設(shè)置幾個(gè) Git 接下來(lái)需要使用的全局配置,比如說(shuō)名字和電子郵件地址。
$ git config --global user.name "Name Surname" $ git config --global user.email yourname@example.com
也可以按如下所示定制 Git 的默認(rèn)行為。
$ git config --global init.defaultBranch main $ git config --global pull.rebase true $ git config --global push.default current
如果習(xí)慣使用 CVS 或 Subversion 命令,也許希望設(shè)置如下幾個(gè)命令別名。
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
能夠通過(guò)如下方式檢查全局配置:
$ git config --global --list
三、基本Git命令
Git 操作涉及以下幾個(gè)數(shù)據(jù):
1、工作樹(shù)目錄保持面向用戶的文件,可以對(duì)這些文件做修改。需要被記錄的改變,必須明確的被選擇并暫存到索引。這是 git add 和 git rm 命令。
2、索引保持暫存文件。在接下來(lái)的請(qǐng)求之前,暫存文件將被提交到本地倉(cāng)庫(kù)。這個(gè)是 git commit 命令。
3、本地倉(cāng)庫(kù)保持已經(jīng)提交的的文件。
- Git 記錄提交數(shù)據(jù)的鏈接歷史并在倉(cāng)庫(kù)里面將它們作為分支組織;
- 本地倉(cāng)庫(kù)通過(guò) git push 命令發(fā)送數(shù)據(jù)到遠(yuǎn)程倉(cāng)庫(kù);
- 本地倉(cāng)庫(kù)能夠通過(guò) git fetch 和 git pull 命令從遠(yuǎn)程倉(cāng)庫(kù)接收數(shù)據(jù);
- git pull 命令在 git fetch 后執(zhí)行 git merge 或 git rebase 命令;
- 這里,git merge 聯(lián)合兩個(gè)獨(dú)立分支的歷史結(jié)尾到一個(gè)點(diǎn);(在沒(méi)有定制的 git pull ,這個(gè)是默認(rèn)的,同時(shí)對(duì)上游作者發(fā)布分支到許多人時(shí),也是好的 )
- 這里,git rebase 創(chuàng)建一個(gè)遠(yuǎn)程分支的序列歷史的單個(gè)分支,跟著本地分支。(這是定制 pull.rebase true 的情況,對(duì)我們其余的用途有用。)
4、遠(yuǎn)程倉(cāng)庫(kù)保持已經(jīng)提交的文件。到遠(yuǎn)程倉(cāng)庫(kù)的通信,使用安全的通信協(xié)議,比如 SSH 或 HTTPS。
工作樹(shù)是在 .git/ 目錄之外的文件。在 .git/ 目錄里面的文件,包括索引、本地倉(cāng)庫(kù)數(shù)據(jù)和一些 git 配置的文本文件。
這里是主要的 Git 命令概覽:
Git 命令 | 功能 |
---|---|
git init |
創(chuàng)建(本地)存儲(chǔ)庫(kù) |
git clone URL |
克隆遠(yuǎn)程存儲(chǔ)庫(kù)到本地倉(cāng)庫(kù)工作目錄樹(shù) |
git pull origin main |
通過(guò)遠(yuǎn)程倉(cāng)庫(kù)?origin ?更新本地?main ?分支 |
git add . |
增加工作樹(shù)里面的文件僅作為預(yù)先存在的索引文件 |
git add -A . |
增加工作樹(shù)里面的所有文件到索引(包括已經(jīng)刪除的) |
git rm filename |
從工作樹(shù)和索引中刪除文件 |
git commit |
提交在索引中的暫存改變到本地存儲(chǔ)庫(kù) |
git commit -a |
添加工作樹(shù)里的所有的改變到索引并提交它們到本地倉(cāng)庫(kù)(添加 + 提交) |
git push -u origin branch_name |
使用本地?branch_name ?分支更新遠(yuǎn)程倉(cāng)庫(kù)?origin (初始啟用) |
git push origin branch_name |
使用本地?branch_name ?分支更新遠(yuǎn)程倉(cāng)庫(kù)?origin (隨后調(diào)用) |
git diff treeish1 treeish2 |
顯示?treeish1?提交和?treeish2?提交的不同 |
gitk |
VCS 存儲(chǔ)庫(kù)分支歷史樹(shù)的圖形界面顯示 |
四、Git技巧
下面是一些 Git 技巧:
Git 命令行 | 功能 |
---|---|
gitk --all |
參看完整的 Git 歷史和操作,比如重置 HEAD 到另外一個(gè)提交、挑選補(bǔ)丁、創(chuàng)建標(biāo)簽和分支…… |
git stash |
得到一個(gè)干凈的工作樹(shù),不會(huì)丟失數(shù)據(jù) |
git remote -v |
檢查遠(yuǎn)程設(shè)置 |
git branch -vv |
檢查分支設(shè)置 |
git status |
顯示工作樹(shù)狀態(tài) |
git config -l |
列出 git 設(shè)置 |
git reset --hard HEAD; git clean -x -d -f |
反轉(zhuǎn)所有工作樹(shù)的改變并完全清理它們 |
git rm --cached filename |
反轉(zhuǎn)由?git add filename ?改變的暫存索引 |
git reflog |
獲取參考日志(對(duì)從刪除的分支中恢復(fù)提交有用) |
git branch new_branch_name HEAD@{6} |
從 reflog 信息創(chuàng)建一個(gè)新的分支 |
git remote add new_remote URL |
增加一個(gè)由 URL 指向的遠(yuǎn)程倉(cāng)庫(kù)?new_remote |
git remote rename origin upstream |
遠(yuǎn)程倉(cāng)庫(kù)的名字從?origin ?重命名到?upstream |
git branch -u upstream/branch_name |
設(shè)置遠(yuǎn)程跟蹤到遠(yuǎn)程倉(cāng)庫(kù)?upstream ?和它的分支名?branch_name 。 |
git remote set-url origin https://foo/bar.git |
改變?origin ?的 URL |
git remote set-url --push upstream DISABLED |
禁止推送到?upstream (編輯?.git/config ?來(lái)重新啟用) |
git remote update upstream |
獲取?upstream ?倉(cāng)庫(kù)中所有遠(yuǎn)程分支更新 |
git fetch upstream foo:upstream-foo |
創(chuàng)建本地(可能是孤立的)upstream-foo ?分支,作為upstream ?倉(cāng)庫(kù)中?foo ?分支的一個(gè)拷貝 |
git checkout -b topic_branch ; git push -u topic_branch origin |
制作一個(gè)新的?topic_branch ?并把它推送到?origin |
git branch -m oldname newname |
本地分支改名 |
git push -d origin branch_to_be_removed |
刪除遠(yuǎn)程分支(新的方式) |
git push origin :branch_to_be_removed |
刪除遠(yuǎn)程分支(老的方式) |
git checkout --orphan unconnected |
創(chuàng)建一個(gè)新的?unconnected ?分支 |
git rebase -i origin/main |
從?origin/main ?重新排序、刪除、壓縮提交到一個(gè)干凈的分支歷史 |
git reset HEAD^; git commit --amend |
壓縮最后兩個(gè)提交為一個(gè) |
git checkout topic_branch ; git merge --squash topic_branch |
壓縮整個(gè)?topic_branch ?到一個(gè)提交 |
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' |
反轉(zhuǎn)一個(gè)淺克隆到一個(gè)所有分支的完整克隆 |
git ime |
分開(kāi)最后的提交到一系列單個(gè)逐一文件的小提交。(要求?imediff ) |
git repack -a -d; git prune |
本地倉(cāng)庫(kù)重新打包到一個(gè)單獨(dú)的包中(這可能限制從刪除分支里面恢復(fù)丟失數(shù)據(jù)等機(jī)會(huì)) |
注意:
- 不要使用帶空格的標(biāo)簽字符串。即使一些工具,如 gitk(1) 允許使用它,但會(huì)阻礙其它 git 命令;
- 如果一個(gè)本地分支推送到一個(gè)已經(jīng)變基或者壓縮過(guò)的倉(cāng)庫(kù),推送這樣的分支有風(fēng)險(xiǎn),并要求 –force 選項(xiàng)。這通常對(duì) main 分支來(lái)說(shuō)不可接受,但對(duì)于一個(gè)移植到 main 分支前的特定分支,是可以接受的;
- 從命令行通過(guò) “git-xyz” 直接調(diào)用 git 子命令的方式,從 2006 年早期開(kāi)始就被取消。
如果有一個(gè)可執(zhí)行文件 git-foo 在路徑環(huán)境變量 $PATH 里面,在命令行輸入沒(méi)有中劃線的 “git foo”,則將調(diào)用 git-foo.這是 git 命令的一個(gè)特性。
五、其它的版本控制系統(tǒng)
版本控制系統(tǒng)(VCS )有時(shí)被認(rèn)為是修訂控制系統(tǒng) (RCS), 或者是軟件配置管理程序 (SCM)。
這里是 Debian 系統(tǒng)上著名的其它非 Git 的 VCS 匯總:
軟件包 | 流行度 | 大小 | 工具 | VCS 類(lèi)型 | 描述 |
mercurial | V:4, I:33 | 2019 | Mercurial | 分布式 | mercurial 主要是用 Python 寫(xiě)的還有一部分是 C 寫(xiě)的 |
darcs | V:0, I:5 | 34070 | Darcs | 分布式 | 有智能代數(shù)補(bǔ)丁的 DVCS(慢) |
bzr | I:8 | 28 | GNU Bazaar | 分布式 | 受 tla 啟發(fā)并且是用 Python 寫(xiě)的 DVCS (歷史) |
tla | V:0, I:1 | 1022 | GNU arch | 分布式 | 主要由 Tom Lord 寫(xiě)的 DVCS (成為歷史的) |
subversion | V:12, I:74 | 4837 | Subversion | 遠(yuǎn)程 | ”比 CVS 做的好“,遠(yuǎn)程 VCS 的新標(biāo)準(zhǔn)(歷史) |
cvs | V:4, I:30 | 4753 | CVS | 遠(yuǎn)程 | 以前的遠(yuǎn)程 VCS 標(biāo)準(zhǔn)(歷史) |
tkcvs | V:0, I:1 | 1498 | CVS, … | 遠(yuǎn)程 | VCS (CVS,Subversion,RCS) 存儲(chǔ)庫(kù)樹(shù)的圖形界面顯示 |
rcs | V:2, I:13 | 564 | RCS | 本地 | 比 Unix SCCS 做的好(歷史) |
cssc | V:0, I:1 | 2044 | CSSC | 本地 | Unix SCCS 的克隆(歷史) |