Git常用命令和Git團隊使用規(guī)范指南

前言

在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是目前世界上最先進(jìn)的分布式版本控制系統(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

#在客戶端上克隆遠(yuǎn)程倉庫
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。

#遠(yuǎn)端操作
git clone <git地址> #克隆到本地。
git fetch #遠(yuǎn)端抓取。
git merge #與本地當(dāng)前分支合并。
git pull [<遠(yuǎn)端別名>] [<遠(yuǎn)端branch>] #抓取并合并,相當(dāng)于第2、3步
git push [-f] [<遠(yuǎn)端別名>] [<遠(yuǎn)端branch>] #推送到遠(yuǎn)端,-f為強制覆蓋
git remote add <別名> <git地址> #設(shè)置遠(yuǎn)端別名
git remote [-v] #列出遠(yuǎn)端,-v為詳細(xì)信息
git remote show <遠(yuǎn)端別名> #查看遠(yuǎn)端信息
git remote rename <遠(yuǎn)端別名> <新遠(yuǎn)端別名> #重命名遠(yuǎn)端
git remote rm <遠(yuǎn)端別名> #刪除遠(yuǎn)端
git remote update [<遠(yuǎn)端別名>] #更新分支列表

#分支相關(guān)
git branch [-r] [-a] #列出分支,-r遠(yuǎn)端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切換分支
git branch -d <分支名> #刪除分支
git checkout <分支名> #切換到分支
git checkout -b <本地branch> [-t <遠(yuǎn)端別名>/<遠(yuǎn)端分支>] #-b新建本地分支并切換到分支, -t綁定遠(yuǎn)端分支
git merge <分支名> #合并某分支到當(dāng)前分支

Git常用命令 - http://gityuan.com/2015/06/27/git-notes/

  • workspace: 本地的工作目錄。(記作A)
  • index:緩存區(qū)域,臨時保存本地改動。(記作B)
  • local repository: 本地倉庫,只想最后一次提交HEAD。(記作C)
  • remote repository:遠(yuǎn)程倉庫。(記作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 //抓取遠(yuǎn)程倉庫更新, D → C

git log //查看提交記錄
git status //查看修改狀態(tài)
git diff//查看詳細(xì)修改內(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 //推送分支到遠(yuǎn)端倉庫
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)建分支進(jìn)行開發(fā),堅決禁止在主干分支上直接開發(fā)。review的同事有責(zé)任檢查其他同事是否遵循分支規(guī)范。
  • 在Git中,默認(rèn)是不會提交空目錄的,如果想提交某個空目錄到版本庫中,需要在該目錄下新建一個 .gitignore 的空白文件,就可以提交了
  • 把外部文件納入到自己的 Git 分支來的時候一定要記得是先比對,確認(rèn)所有修改都是自己修改的,然后再納入。不然,容易出現(xiàn)代碼回溯
  • 多人協(xié)作時,不要各自在自己的 Git 分支開發(fā),然后發(fā)文件合并。正確的方法應(yīng)該是開一個遠(yuǎn)程分支,然后一起在遠(yuǎn)程分支里協(xié)作。不然,容易出現(xiàn)代碼回溯(即別人的代碼被覆蓋的情況)
  • 每個人提交代碼是一定要 git diff 看提交的東西是不是都是自己修改的。如果有不是自己修改的內(nèi)容,很可能就是代碼回溯
  • review 代碼的時候如果看到有被刪除掉的代碼,一定要確實是否是寫代碼的同事自己刪除的。如果不是,很可能就是代碼回溯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,689評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,807評論 18 139
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,692評論 9 163
  • 起:現(xiàn)如今人們喜歡舉行聚會,一些人認(rèn)為舉行聚會是對金錢的浪費,另一些人認(rèn)為這對人們與社會都有利。 立:我認(rèn)為對個人...
    IMN閱讀 328評論 0 0
  • 第三章:有情人互訴衷腸吳總尋機接近鐘教授 01 “奇了怪了,明明聽到那么急促的腳步聲,人呢?這么快就走遠(yuǎn)了?”袁兵...
    藍(lán)夢奇閱讀 633評論 18 17