前言
在2005年的某一天剑勾,Linux之父Linus Torvalds 發(fā)布了他的又一個里程碑作品——Git埃撵。它的出現(xiàn)改變了軟件開發(fā)流程,大大地提高了開發(fā)流暢度虽另,直到現(xiàn)在仍十分流行暂刘,完全沒有衰退的跡象。其實一般情況下捂刺,只需要掌握git的幾個常用命令即可鸳惯,但是在使用的過程中難免會遇到各種復(fù)雜的需求,這時候經(jīng)常需要搜索叠萍,非常麻煩芝发,故總結(jié)了一下自己平常會用到的git操作。本文根據(jù)團隊實踐記錄Git入門指南和Git常用命令苛谷,文章中不僅記錄了Git的搭建和使用教程辅鲸,還參考了大量Git團隊使用規(guī)范上的經(jīng)驗,希望大家可以結(jié)合自己團隊的實際應(yīng)用場景讓Git協(xié)作優(yōu)雅的落地腹殿。
Git是目前世界上最先進的分布式版本控制系統(tǒng)
更新記錄
2016年04月22日 - 初稿
閱讀原文 - http://wsgzao.github.io/post/git/
擴展閱讀
Git Book - https://git-scm.com/book/zh/
git簡明指南 - http://rogerdudler.github.io/git-guide/index.zh.html
常用 Git 命令清單 - http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
猴子都能懂的GIT入門 - http://backlogtool.com/git-guide/cn/
Git教程 - http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
SVN與Git的最主要的區(qū)別
SVN是集中式版本控制系統(tǒng)独悴,版本庫是集中放在中央服務(wù)器的,而干活的時候锣尉,用的都是自己的電腦刻炒,所以首先要從中央服務(wù)器哪里得到最新的版本,然后干活自沧,干完后坟奥,需要把自己做完的活推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作拇厢,如果在局域網(wǎng)還可以爱谁,帶寬夠大,速度夠快孝偎,如果在互聯(lián)網(wǎng)下访敌,如果網(wǎng)速慢的話,就納悶了衣盾。
Git是分布式版本控制系統(tǒng)寺旺,那么它就沒有中央服務(wù)器的爷抓,每個人的電腦就是一個完整的版本庫,這樣阻塑,工作的時候就不需要聯(lián)網(wǎng)了蓝撇,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫叮姑,那多個人如何協(xié)作呢?比如說自己在電腦上改了文件A据悔,其他人也在電腦上改了文件A传透,這時,你們兩之間只需把各自的修改推送給對方极颓,就可以互相看到對方的修改了朱盐。
Git搭建和使用
Git上手并不難,深入學(xué)習(xí)還是建議多實踐菠隆,可以參考擴展閱讀中廖雪峰的Git教程
Git服務(wù)端
服務(wù)端搭建Git很簡單兵琳,有更多需求不妨試試Gogs和Gitlab
使用Gogs輕松搭建可能比GitLab更好用的Git服務(wù)平臺 - http://wsgzao.github.io/post/gogs/
#安裝git
sudo apt-get install git
yum install git
#創(chuàng)建一個git用戶,用來運行g(shù)it服務(wù)
sudo adduser git
#創(chuàng)建證書使用公鑰免密碼登錄(可選)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys
#初始化Git倉庫
sudo git init --bare sample.git
sudo chown -R git:git sample.git
#禁用shell登錄
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
#在客戶端上克隆遠程倉庫
git clone git@server:/srv/sample.git
管理公鑰推薦使用Gitosis
Gitosis - https://github.com/res0nat0r/gitosis
Gitosis配置手記 - http://debugo.com/gitosis/
管理權(quán)限推薦使用Gitolite
Gitolite - https://github.com/sitaramc/gitolite
Git客戶端
Git客戶端可以按個人習(xí)慣來選擇骇径,遵守團隊協(xié)作中的Git規(guī)范標(biāo)準(zhǔn)才是更重要的
Git - https://git-scm.com/
TortoiseGit - https://tortoisegit.org/
SourceTree - https://www.sourcetreeapp.com/
#以最基本的Git命令行為例躯肌,先下載Git
https://git-scm.com/download/
#配置git提交用戶名和郵箱,定義別名方便區(qū)分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"
#克隆倉庫
git clone cap@172.28.70.243:/cap/cap.git
$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
#測試推送
touch README
git add README
git commit -m "add readme"
git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master
Git常用命令
符號約定
-
<xxx>
自定義內(nèi)容 -
[xxx]
可選內(nèi)容 -
[<xxx>]
自定義可選內(nèi)容
#初始設(shè)置
git config --global user.name "<用戶名>" #設(shè)置用戶名
git config --global user.email "<電子郵件>" #設(shè)置電子郵件
#本地操作
git add [-i] #保存更新破衔,-i為逐個確認(rèn)清女。
git status #檢查更新。
git commit [-a] -m "<更新說明>" #提交更新晰筛,-a為包含內(nèi)容修改和增刪嫡丙,-m為說明信息,也可以使用 -am读第。
#遠端操作
git clone <git地址> #克隆到本地曙博。
git fetch #遠端抓取。
git merge #與本地當(dāng)前分支合并怜瞒。
git pull [<遠端別名>] [<遠端branch>] #抓取并合并,相當(dāng)于第2父泳、3步
git push [-f] [<遠端別名>] [<遠端branch>] #推送到遠端,-f為強制覆蓋
git remote add <別名> <git地址> #設(shè)置遠端別名
git remote [-v] #列出遠端吴汪,-v為詳細信息
git remote show <遠端別名> #查看遠端信息
git remote rename <遠端別名> <新遠端別名> #重命名遠端
git remote rm <遠端別名> #刪除遠端
git remote update [<遠端別名>] #更新分支列表
#分支相關(guān)
git branch [-r] [-a] #列出分支尘吗,-r遠端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切換分支
git branch -d <分支名> #刪除分支
git checkout <分支名> #切換到分支
git checkout -b <本地branch> [-t <遠端別名>/<遠端分支>] #-b新建本地分支并切換到分支, -t綁定遠端分支
git merge <分支名> #合并某分支到當(dāng)前分支
Git常用命令 - http://gityuan.com/2015/06/27/git-notes/
- workspace: 本地的工作目錄。(記作A)
- index:緩存區(qū)域浇坐,臨時保存本地改動睬捶。(記作B)
- local repository: 本地倉庫,只想最后一次提交HEAD近刘。(記作C)
- remote repository:遠程倉庫擒贸。(記作D)
以下所有的命令的功能說明臀晃,都采用上述的標(biāo)記的A、B介劫、C徽惋、D的方式來闡述。
#初始化
git init //創(chuàng)建
git clone /path/to/repository //檢出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用戶名
#操作
git add <file> // 文件添加座韵,A → B
git add . // 所有文件添加险绘,A → B
git commit -m "代碼提交信息" //文件提交,B → C
git commit --amend //與上次commit合并, *B → C
git push origin master //推送至master分支, C → D
git pull //更新本地倉庫至最新改動誉碴, D → A
git fetch //抓取遠程倉庫更新宦棺, D → C
git log //查看提交記錄
git status //查看修改狀態(tài)
git diff//查看詳細修改內(nèi)容
git show//顯示某次提交的內(nèi)容
#撤銷操作
git reset <file>//某個文件索引會回滾到最后一次提交, C → B
git reset//索引會回滾到最后一次提交黔帕, C → B
git reset --hard // 索引會回滾到最后一次提交代咸, C → B → A
git checkout // 從index復(fù)制到workspace, B → A
git checkout -- files // 文件從index復(fù)制到workspace成黄, B → A
git checkout HEAD -- files // 文件從local repository復(fù)制到workspace呐芥, C → A
#分支相關(guān)
git checkout -b branch_name //創(chuàng)建名叫“branch_name”的分支,并切換過去
git checkout master //切換回主分支
git branch -d branch_name // 刪除名叫“branch_name”的分支
git push origin branch_name //推送分支到遠端倉庫
git merge branch_name // 合并分支branch_name到當(dāng)前分支(如master)
git rebase //衍合奋岁,線性化的自動思瘟, D → A
#沖突處理
git diff //對比workspace與index
git diff HEAD //對于workspace與最后一次commit
git diff <source_branch> <target_branch> //對比差異
git add <filename> //修改完沖突,需要add以標(biāo)記合并成功
#其他
gitk //開燈圖形化git
git config color.ui true //彩色的 git 輸出
git config format.pretty oneline //顯示歷史記錄時闻伶,每個提交的信息只顯示一行
git add -i //交互式添加文件到暫存區(qū)
Git使用規(guī)范
Git 使用規(guī)范流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
團隊中的 Git 實踐 - https://ourai.ws/posts/working-with-git-in-team/
構(gòu)家網(wǎng) git 團隊協(xié)作使用規(guī)范 v2 - http://wenku.baidu.com/view/e1430d1b7f1922791788e81e
Git使用規(guī)范提醒
- 使用Git過程中潮太,必須通過創(chuàng)建分支進行開發(fā),堅決禁止在主干分支上直接開發(fā)虾攻。review的同事有責(zé)任檢查其他同事是否遵循分支規(guī)范铡买。
- 在Git中,默認(rèn)是不會提交空目錄的霎箍,如果想提交某個空目錄到版本庫中奇钞,需要在該目錄下新建一個 .gitignore 的空白文件,就可以提交了
- 把外部文件納入到自己的 Git 分支來的時候一定要記得是先比對漂坏,確認(rèn)所有修改都是自己修改的景埃,然后再納入。不然顶别,容易出現(xiàn)代碼回溯
- 多人協(xié)作時谷徙,不要各自在自己的 Git 分支開發(fā),然后發(fā)文件合并驯绎。正確的方法應(yīng)該是開一個遠程分支完慧,然后一起在遠程分支里協(xié)作。不然剩失,容易出現(xiàn)代碼回溯(即別人的代碼被覆蓋的情況)
- 每個人提交代碼是一定要 git diff 看提交的東西是不是都是自己修改的屈尼。如果有不是自己修改的內(nèi)容册着,很可能就是代碼回溯
- review 代碼的時候如果看到有被刪除掉的代碼,一定要確實是否是寫代碼的同事自己刪除的脾歧。如果不是甲捏,很可能就是代碼回溯