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

前言

在2005年的某一天,Linux之父Linus Torvalds 發(fā)布了他的又一個里程碑作品——Git。它的出現(xiàn)改變了軟件開發(fā)流程,大大地提高了開發(fā)流暢度,直到現(xiàn)在仍十分流行,完全沒有衰退的跡象。其實一般情況下,只需要掌握git的幾個常用命令即可,但是在使用的過程中難免會遇到各種復(fù)雜的需求,這時候經(jīng)常需要搜索,非常麻煩,故總結(jié)了一下自己平常會用到的git操作。本文根據(jù)團(tuán)隊實踐記錄Git入門指南和Git常用命令,文章中不僅記錄了Git的搭建和使用教程,還參考了大量Git團(tuán)隊使用規(guī)范上的經(jīng)驗,希望大家可以結(jié)合自己團(tuán)隊的實際應(yīng)用場景讓Git協(xié)作優(yōu)雅的落地。

Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)

更新記錄

2016年04月22日 - 初稿

閱讀原文 - http://wsgzao.github.io/post/git/

擴(kuò)展閱讀

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í)還是建議多實踐,可以參考擴(kuò)展閱讀中廖雪峰的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用戶,用來運(yùn)行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í)慣來選擇,遵守團(tuán)隊協(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為強(qiáng)制覆蓋
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
團(tuán)隊中的 Git 實踐 - https://ourai.ws/posts/working-with-git-in-team/
構(gòu)家網(wǎng) git 團(tuán)隊協(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ù)。

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

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