在2005年的某一天,Linux之父Linus Torvalds 發佈了他的又一個里程碑做品——Git。它的出現改變了軟件開發流程,大大地提升了開發流暢度,直到如今仍十分流行,徹底沒有衰退的跡象。其實通常狀況下,只須要掌握git的幾個經常使用命令便可,可是在使用的過程當中不免會遇到各類複雜的需求,這時候常常須要搜索,很是麻煩,故總結了一下本身日常會用到的git操做。本文根據團隊實踐記錄Git入門指南和Git經常使用命令,文章中不只記錄了Git的搭建和使用教程,還參考了大量Git團隊使用規範上的經驗,但願你們能夠結合本身團隊的實際應用場景讓Git協做優雅的落地。html
Git是目前世界上最早進的分佈式版本控制系統git
2016年04月22日 - 初稿github
閱讀原文 - http://wsgzao.github.io/post/git/shell
擴展閱讀緩存
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/0013739516305929606dd18361248578c67b8067c8c017b000bash
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做,若是在局域網還能夠,帶寬夠大,速度夠快,若是在互聯網下,若是網速慢的話,就納悶了。服務器
Git是分佈式版本控制系統,那麼它就沒有中央服務器的,每一個人的電腦就是一個完整的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。既然每一個人的電腦都有一個完整的版本庫,那多我的如何協做呢?好比說本身在電腦上改了文件A,其餘人也在電腦上改了文件A,這時,大家兩之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。app
Git上手並不難,深刻學習仍是建議多實踐,能夠參考擴展閱讀中廖雪峯的Git教程ssh
服務端搭建Git很簡單,有更多需求不妨試試Gogs和Gitlab分佈式
使用Gogs輕鬆搭建可能比GitLab更好用的Git服務平臺 - http://wsgzao.github.io/post/gogs/
#安裝git sudo apt-get install git yum install git #建立一個git用戶,用來運行git服務 sudo adduser git #建立證書使用公鑰免密碼登陸(可選) 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/
管理權限推薦使用Gitolite
Gitolite - https://github.com/sitaramc/gitolite
Git客戶端能夠按我的習慣來選擇,遵照團隊協做中的Git規範標準纔是更重要的
Git - https://git-scm.com/
TortoiseGit - https://tortoisegit.org/
SourceTree - https://www.sourcetreeapp.com/
#以最基本的Git命令行爲例,先下載Git https://git-scm.com/download/ #配置git提交用戶名和郵箱,定義別名方便區分 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
符號約定
<xxx>
自定義內容
[xxx]
可選內容
[<xxx>]
自定義可選內容
#初始設置 git config --global user.name "<用戶名>" #設置用戶名 git config --global user.email "<電子郵件>" #設置電子郵件 #本地操做 git add [-i] #保存更新,-i爲逐個確認。 git status #檢查更新。 git commit [-a] -m "<更新說明>" #提交更新,-a爲包含內容修改和增刪,-m爲說明信息,也可使用 -am。 #遠端操做 git clone <git地址> #克隆到本地。 git fetch #遠端抓取。 git merge #與本地當前分支合併。 git pull [<遠端別名>] [<遠端branch>] #抓取併合並,至關於第二、3步 git push [-f] [<遠端別名>] [<遠端branch>] #推送到遠端,-f爲強制覆蓋 git remote add <別名> <git地址> #設置遠端別名 git remote [-v] #列出遠端,-v爲詳細信息 git remote show <遠端別名> #查看遠端信息 git remote rename <遠端別名> <新遠端別名> #重命名遠端 git remote rm <遠端別名> #刪除遠端 git remote update [<遠端別名>] #更新分支列表 #分支相關 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 <分支名> #合併某分支到當前分支
Git經常使用命令 - http://gityuan.com/2015/06/27/git-notes/
workspace: 本地的工做目錄。(記做A)
index:緩存區域,臨時保存本地改動。(記做B)
local repository: 本地倉庫,只想最後一次提交HEAD。(記做C)
remote repository:遠程倉庫。(記做D)
如下全部的命令的功能說明,都採用上述的標記的A、B、C、D的方式來闡述。
#初始化 git init //建立 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 //查看修改狀態 git diff//查看詳細修改內容 git show//顯示某次提交的內容 #撤銷操做 git reset <file>//某個文件索引會回滾到最後一次提交, C → B git reset//索引會回滾到最後一次提交, C → B git reset --hard // 索引會回滾到最後一次提交, C → B → A git checkout // 從index複製到workspace, B → A git checkout -- files // 文件從index複製到workspace, B → A git checkout HEAD -- files // 文件從local repository複製到workspace, C → A #分支相關 git checkout -b branch_name //建立名叫「branch_name」的分支,並切換過去 git checkout master //切換回主分支 git branch -d branch_name // 刪除名叫「branch_name」的分支 git push origin branch_name //推送分支到遠端倉庫 git merge branch_name // 合併分支branch_name到當前分支(如master) git rebase //衍合,線性化的自動, D → A #衝突處理 git diff //對比workspace與index git diff HEAD //對於workspace與最後一次commit git diff <source_branch> <target_branch> //對比差別 git add <filename> //修改完衝突,須要add以標記合併成功 #其餘 gitk //開燈圖形化git git config color.ui true //彩色的 git 輸出 git config format.pretty oneline //顯示歷史記錄時,每一個提交的信息只顯示一行 git add -i //交互式添加文件到暫存區
Git 使用規範流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
團隊中的 Git 實踐 - https://ourai.ws/posts/working-with-git-in-team/
構家網 git 團隊協做使用規範 v2 - http://wenku.baidu.com/view/e1430d1b7f1922791788e81e
Git使用規範提醒
使用Git過程當中,必須經過建立分支進行開發,堅定禁止在主幹分支上直接開發。review的同事有責任檢查其餘同事是否遵循分支規範。
在Git中,默認是不會提交空目錄的,若是想提交某個空目錄到版本庫中,須要在該目錄下新建一個 .gitignore 的空白文件,就能夠提交了
把外部文件歸入到本身的 Git 分支來的時候必定要記得是先比對,確認全部修改都是本身修改的,而後再歸入。否則,容易出現代碼回溯
多人協做時,不要各自在本身的 Git 分支開發,而後發文件合併。正確的方法應該是開一個遠程分支,而後一塊兒在遠程分支裏協做。否則,容易出現代碼回溯(即別人的代碼被覆蓋的狀況)
每一個人提交代碼是必定要 git diff 看提交的東西是否是都是本身修改的。若是有不是本身修改的內容,極可能就是代碼回溯
review 代碼的時候若是看到有被刪除掉的代碼,必定要確實是不是寫代碼的同事本身刪除的。若是不是,極可能就是代碼回溯