簡書不維護了赫舒,歡迎關注我的知乎:波羅學的個人主頁
GIT的上一篇文章比較枯燥無味蚤霞,理論性較強镣煮,也是難以引起共鳴!今天從實在操作方面說一下GIT使用中悉盆,使用最多的流程-提交到倉庫盯荤。
開始說明提交流程之前,先看一下上篇提到的GIT整體架構圖焕盟。
對秋秤!還是這張畫的比較丑的圖![捂臉]京髓!
本章說的內容是上面這張圖的前面部分航缀,如下:
只有提交本地倉庫的流程商架,并沒有涉及到遠程倉庫堰怨。關于提交流程,常用的命令:add和commit蛇摸,add負責提交到暫存區(qū)备图,commit提交到倉庫。但并不是只有這兩個命令就足夠了赶袄。下面開始正文揽涮。
一 準備你的環(huán)境
操作系統(tǒng):centos7
GIT版本:git version 1.8.3.1
在開始之前,我們先需要做一些初始化工作饿肺。
1. 配置環(huán)境
提交git倉庫蒋困,需要做兩個基本的配置操作:
$ git config --global user.name poloxue
$ git config --global user.email peitiang@163.com
配置你的姓名與郵箱地址。關于git配置還有很多內容敬辣,本章內容重點不在于此雪标,就不作過多詳解。
2. 準備倉庫
首先我們需要一個git倉庫溉跃,兩個命令可以實現(xiàn): init 和 clone村刨。
a. git init
init是通過初始化本地目錄的方式創(chuàng)建倉庫。
首先撰茎,創(chuàng)建一個測試的文件夾嵌牺。
執(zhí)行初始化操作,查看文件夾變化
此時倉庫文件夾下多出了一個.git的文件龄糊,上面一節(jié)對.git有過簡單說明逆粹。我們的暫存區(qū)和本地倉庫就是存在于這個文件下面。
b. git clone
clone通過遠程克隆方式獲取版本庫炫惩。本人剛開始使用git的時候枯饿,以為git像svn一樣需要依賴遠程,獲取倉庫首先想到的是去github上面clone诡必。clone使用很簡單: git clone 倉庫地址奢方。
二 提交流程
文章標題為從文件生命周期看提交流程搔扁,首先一個文件在整個生命周期可能存在哪些狀態(tài),如下:
1.未追蹤 untracked file
2.已暫存 staged file
3.未更新 no updated file
4.已更新 updated file
還是先動手畫個圖蟋字,如下:
上面的圖以文件狀態(tài)的角度出發(fā)稿蹲,指出了一個文件從創(chuàng)建到提交文件倉庫再到脫離倉庫追蹤的整個過程可能經歷的各種狀態(tài)。
在開始正文之前先介紹一下GIT查看倉庫中文件狀態(tài)的命令:git status鹊奖。如果倉庫文件有所變化苛聘,執(zhí)行此命令可以查看各個變化文件狀態(tài)。
1. 未追蹤
在工作目錄下新創(chuàng)建的一個文件初始狀態(tài)處于未追蹤忠聚。此時文件不受版本系統(tǒng)的控制设哗。
下面在我們之前初始化為git倉庫的experiment的工作目錄,新建一個README.md两蟀。然后隨意輸入一些內容网梢。使用git status查看一下當前倉庫狀態(tài),如下:
此時READM.md為untracked file赂毯,下面提示 Use "git add <file>..." to include in what will be committed战虏,即為使用git add命令去添加將被提交的文件。似乎沒有說明怎么追蹤文件党涕,繼續(xù)看烦感,如需要被追蹤 use "git add" to track, 意為使用git add追蹤文件。
2. 已更新
為了下面的內容更方便講解膛堤,先來說說文件的已更新狀態(tài)手趣。
啥叫已更新呢?個人總結肥荔,上圖中把文件的三種情況都歸于已更新:編輯更新绿渣,沖突更新,刪除更新次企。下面從這三種更新的角度來談談怯晕,看看這些更新狀態(tài)如何產生。
a. 編輯更新
編輯更新就是因我們修改文件而導致的更新缸棵。下面看下如何產生一個編輯更新狀態(tài)的文件舟茶。
首先,快速通過以下三步添加一個新文件modify.php到版本庫中堵第。
$ touch modify.php
$ git add modify.php
$ git commit -m "new file modify.php"
下面我們修改文件modify.php吧凉,添加任意內容修改,git status查看狀態(tài):
可以看到此時踏志,modify文件處于modified狀態(tài)阀捅。我們使用git時,大多數更新都是屬于這種類型针余。
b. 沖突更新
沖突更新是怎么產生的呢饲鄙?我們知道GIT支持強大的分支功能凄诞,前面說明GIT的優(yōu)點也提到了這個問題。但是分支就會有一個問題忍级,兩個分支同時修改同一文件的同一部分內容帆谍,沖突就產生了。下面演示這種類型的更新如何產生轴咱?
首先汛蝙,快速通過以下三步添加一個新文件conflict.php到版本庫中。
$ touch conflict.php
$ git add conflict.php
$ git commit -m "new file conflict.php"
創(chuàng)建兩個分支:feature
$ git branch feature
在master上conflict.php添加內容: master
在feature上conflict.php添加內容: feature
在master執(zhí)行合并操作:
$ git merge feature
可以看到朴肺,沖突就是這么容易就產生了窖剑。團隊合作開發(fā)時,沖突更新也是我們平時最不喜歡遇到的戈稿,如果沖突的內容都是自己的西土,那還好處理。如果涉及了大量的人員器瘪,這其中就會有大量的溝通成本翠储。
c. 刪除更新
刪除也算更新绘雁,這個邏輯理解起來有點怪橡疼。但刪除畢竟改變了文件內容,讓文件不存在了庐舟,所以也算更新[苦笑不得]欣除。這種更新如何產生呢?
首先挪略,快速通過以下三步添加一個新文件delete.php到版本庫中历帚。
$ touch delete.php
$ git add delete.php
$ git commit -m "new file delete.php"
提交之后,手動刪除delete.php文件
$ rm delete.php
此時杠娱,delete.php文件狀態(tài)便是刪除更新的狀態(tài)挽牢。
3. 已暫存
在上面的1、2兩段摊求,關于未追蹤和已更新禽拔,總結的是工作區(qū)文件存在的各種狀態(tài)。但是在把文件提交到版本之前室叉,還需要中間的一個過渡階段:暫存區(qū)睹栖。文件提交到暫存區(qū)便是已暫存狀態(tài)〖牒郏看上面文件各個狀態(tài)之間的轉化圖野来,我們知道文件可以由未跟蹤和已更新兩種狀態(tài)轉化而來。
由之前的操作踪旷,現(xiàn)在已經有了各種狀態(tài)的文件:
1. 未追蹤文件:README.md
2. 編輯更新文件:modify.php
3. 沖突更新文件:conflict.php
4. 刪除更新文件:delete.php
下面如何使用git add將這些文件添加到暫存區(qū):
git add -A 最省事曼氛,所有文件添加到暫存區(qū)豁辉;
git add -u 已更新文件添加暫存區(qū),即modify.php conflict.php delete.php舀患;
git add . 將除刪除更新的其他文件加到暫存區(qū)秋忙,即README.md modify.php conflict.php;
git add * 會忽略.gitignore規(guī)則构舟,把本來應忽略文件添加暫存區(qū)灰追,慎用;
當不確定時狗超,可直接添加某文件git add filepath;
$ git add modify.php;
刪除更新也可以使用git rm命令弹澎,直接將刪除文件提交到暫存區(qū)同時刪除文件,如需刪除提交暫存區(qū)但工作區(qū)文件保留可使用選項--cached:
$ git rm delete.php
$ git rm delete.php --cached
好努咐!下面把所有文件提交到暫存區(qū):
$ git add -A
此時苦蒿,git status查看文件狀態(tài):
因為同時存在刪除和新建,delete.php被認為rename為README.md渗稍,不深究了佩迟,正常情況工作區(qū)文件狀態(tài)與暫存區(qū)的對應關系如下:
工作區(qū) | 暫存區(qū) |
---|---|
untracked | new file |
modified | modified |
both modified | modified |
deleted | deleted |
4. 未更新
怎么讓文件轉化為未更新狀態(tài)呢?提交倉庫竿屹!我們已經把所有內容提交暫存报强,下面可以借助于commit命令進行倉庫提交:
a. 常用方式
提交倉庫的常用,執(zhí)行如下命令:
$ git commit -m "feat: new function"
再查看文件狀態(tài)拱燃,發(fā)現(xiàn)已經沒有內容可以提交秉溉,此時倉庫處于未更新的狀態(tài)。
b. 編輯更新直接提交到倉庫
git commit -am "message"可以將編輯更新直接從工作區(qū)提交倉庫碗誉,即跨過暫存區(qū)召嘶。不支持刪除與沖突更新和新文件的提交。
c. 提交修訂
如提交有誤哮缺,支持對當前提交進行修訂弄跌。
$ git commit --amend
一是可用來修改提交日志;
二是用來提交漏掉文件尝苇,仍保持為一個提交铛只。
本文主要從GIT文件的生命周期來看整個提交流程。為了便于理解茎匠,自己總結了編輯更新格仲、刪除更新、沖突更新幾個新詞诵冒,希望不會造成誤解凯肋。