git基礎用法(一)

一、版本控制系統(tǒng)對比

  • 先說集中式版本控制系統(tǒng)苟径,版本庫是集中存放在中央服務器的,而大家工作的時候躬审,用的都是自己的電腦棘街,所以要先從中央服務器取得最新的版本,然后開始工作承边,工作完成遭殉,再把自己的修訂推送給中央服務器。這類系統(tǒng)博助,都有一個單一的集中管理的服務器险污,保存所有文件的修訂版本,而協(xié)同工作的人們都通過客戶端連到這臺服務器翔始,取出最新的文件或者提交更新罗心。

  • 那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢?首先城瞎,分布式版本控制系統(tǒng)根本沒有“中央服務器”渤闷,每個人的電腦上都是一個完整的版本庫,這樣脖镀,你工作的時候飒箭,就不需要聯網了,因為版本庫就在你自己的電腦上蜒灰。既然每個人電腦上都有一個完整的版本庫弦蹂,那多個人如何協(xié)作呢?比方說你在自己電腦上改了文件A强窖,你的同事也在他的電腦上改了文件A凸椿,這時,你們倆之間只需把各自的修改推送給對方翅溺,就可以互相看到對方的修改了脑漫。

  • 和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多咙崎,因為每個人電腦里都有完整的版本庫优幸,某一個人的電腦壞掉了不要緊,隨便從其他人那里復制一個就可以了褪猛。而集中式版本控制系統(tǒng)的中央服務器要是出了問題网杆,所有人都沒法干活了。

  • 在實際使用分布式版本控制系統(tǒng)的時候,其實很少在兩人之間的電腦上推送版本庫的修改碳却,因為可能你們倆不在一個局域網內队秩,兩臺電腦互相訪問不了,也可能今天你的同事病了追城,他的電腦壓根沒有開機刹碾。因此,分布式版本控制系統(tǒng)通常也有一臺充當“中央服務器”的電腦座柱,但這個服務器的作用僅僅是用來方便“交換”大家的修改迷帜,沒有它大家也一樣干活,只是交換修改不方便而已色洞。

二戏锹、git基礎命令應用(配置)

  1. Git 配置
    配置個人名稱和郵箱,每次提交時將附帶這些信息:使用**git config ** 命令配置

     $ git config --global user.name = '******'
     $ git config --global user.email = '******'
    

然后會在當前用戶的家目錄創(chuàng)建一個.gitconfig文件火诸,如下:
$ ls -l ~/.gitconfig
-rw-r--r-- 1 user staff 28 12 14 11:25 .gitconfig
$ cat ~/.gitconfig
[user]
name = ******
email = ******
上面的配置文件就是Git全局配置的文件锦针,一般配置方法是git config --global <配置名稱> <配置的值>
如果你想使項目里的某個值與前面的全局設置有區(qū)別(例如把私人郵箱地址改為工作郵箱),你可以在項目中使用git config命令不帶 --global 選項來設置. 這會在你當前的項目目錄下創(chuàng)建 .git/config置蜀,從而使用針對當前項目的配置奈搜。

  1. 獲得一個git倉庫
  • Clone 一個倉庫
    為了得一個項目的拷貝(copy),我們需要知道這個項目倉庫的地址(Git URL). Git能在許多協(xié)議下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些倉庫可以通過不只一種協(xié)議來訪問盯荤。

      $ git clone https://git.oschina.net/minasia/GitTest.git
    

clone操作完成后馋吗,會發(fā)現當前目錄下多了一個GitTest
文件夾,這個文件夾里的內容就是我們剛剛clone下來的代碼秋秤。由于當前`gitproject僅是測試項目宏粤,里面僅有一個README.md文件。
$ cd GitTest/(master)
$ ls README.md
可以發(fā)現在命令提示符$前面多了個(master)灼卢。這是由于當前Shell使用的是zsh Shell绍哎,zsh會判斷當前的目錄是否有Git倉庫,如果是的話則自動把目前所在的git分支顯示在提示符中鞋真。Git 分支的概念我們會在稍后介紹崇堰。

  • 初始化一個新倉庫
    可以對一個已存在的文件夾用下面的命令讓它置于Git的版本控制管理之下。
    創(chuàng)建一個文件夾涩咖,進入赶袄,并執(zhí)行初始化命令** git init**
    $ mkdir GitInit
    $ cd GitInit
    $ git init
    Initialized empty Git repository in /Users/****/****/GitInit/.git/
    通過ls -la命令會發(fā)現project目錄下會有一個名叫.git 的目錄被創(chuàng)建,這意味著一個倉庫被初始化了抠藕。可以進入到.git目錄查看下有哪些內容蒋困。

三盾似、git基礎命令應用(工作流程)

git的基本流程如下:
  • 創(chuàng)建或修改文件
  • 使用git add命令添加新創(chuàng)建或修改的文件到本地的緩存區(qū)(Index)
  • 使用git commit命令提交到本地代碼庫(可選,有的時候并沒有可以同步的遠端代碼庫)使用git push命令將本地代碼庫同步到遠端代碼庫

進入我們剛才從git上clone的GitTest目錄,分別創(chuàng)建文件file1零院,file2溉跃,file3:

 ~/Test/GitTest  ?master? $ touch file1 file2 file3
 ~/Test/GitTest  ?master*? $ echo "content1" >> file1
 ~/Test/GitTest  ?master*?$ echo "content2" >> file2
 ~/Test/GitTest  ?master*?$ echo "content3" >> file3
 ~/Test/GitTest  ?master*?$ ###使用** git status ** 命令查看當前git倉庫的狀態(tài)
 ~/Test/GitTest  ?master*?$ git status
  On branch master
  Initial commit
  Untracked files:
    (use "git add <file>..." to include in what will be committed)
   file1
   file2
   file3
  nothing added to commit but untracked files present (use "git add" to track)

 ~/Test/GitTest  ?master*?$ ### 可以發(fā)現有三個文件處于untracked狀態(tài),下一步用** git add ** 命令將這些文件加入到緩存區(qū)中
 ~/Test/GitTest  ?master*?$ git add file1 file2 file3
 ~/Test/GitTest  ?master*?$ ### 再次執(zhí)行** git status ** 查看git狀態(tài)告抄,發(fā)現變化
 ~/Test/GitTest  ?master*?$ git status
  On branch master
  Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
 new file:   file1
 new file:   file2
 new file:   file3

 ~/Test/GitTest  ?master*?$ ### 提示已經為commit做好準備撰茎,此時可以使用** git diff --cached** 命令查看緩存區(qū)中哪些文件被修改了,進去到git diff --cached 頁面后需要輸入q才可以退出                     
 ~/Test/GitTest  ?master*?$ git diff --cached                                                             
 ~/Test/GitTest  ?master*?$ ## 通過命令** git commit -m 'comment: 提交文件' 提交已處理的文件
 ~/Test/GitTest  ?master*?$ git commit -m "update file" 
  [master (root-commit) 7bcd6cf] update file
   3 files changed, 3 insertions(+)
   create mode 100644 file1
   create mode 100644 file2
   create mode 100644 file3
 ~/Test/GitTest  ?master?$ ## 需要使用-m添加本次修改的注釋打洼,完成后就會記錄一個新的項目版本龄糊。除了用git add 命令,我們還可以用下面的命令將所有沒有加到緩存區(qū)的修改也一起提交募疮,但-a命令不會添加新建的文件  
 ~/Test/GitTest  ?master?$ git commit -a -m 'add files'
    On branch master
    nothing to commit, working tree clean
 ~/Test/GitTest  ?master?$ git status                                                                          
    On branch master
    nothing to commit, working tree clean
 ~/Test/GitTest  ?master?$ ## 至此炫惩,我們完成了第一次代碼提交,這次提交的代碼中我們創(chuàng)建了三個新文件阿浓。需要注意的是如果是修改文件他嚷,也需要使用git add命令添加到緩存區(qū)才可以提交。如果是刪除文件芭毙,則直接使用git rm命令刪除后會自動將已刪除文件的信息添加到緩存區(qū)筋蓖,git commit提交后就會將本地倉庫中的對應文件刪除  
 ~/Test/GitTest  ?master?$ ## 如果本地倉庫連接到了遠程Git服務器,可以使用下面的命令將本地倉庫同步到遠程服務器
 ~/Test/GitTest  ?master?$ git push origin master
    Counting objects: 5, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (5/5), 346 bytes | 0 bytes/s, done.
    Total 5 (delta 0), reused 0 (delta 0)
    To https://git.oschina.net/minasia/GitTest.git
    f8f87cf..a4b1acb  master -> master

三退敦、git基礎命令應用(分支與合并)

Git的分支可以讓你在主線(master分支)之外進行代碼提交粘咖,同時又不會影響代碼庫主線。分支的作用體現在多人協(xié)作開發(fā)中苛聘,比如一個團隊開發(fā)軟件涂炎,你負責獨立的一個功能需要一個月的時間來完成,你就可以創(chuàng)建一個分支设哗,只把該功能的代碼提交到這個分支唱捣,而其他同事仍然可以繼續(xù)使用主線開發(fā),你每天的提交不會對他們造成任何影響网梢。當你完成功能后震缭,測試通過再把你的功能分支合并到主線。

一個Git倉庫可以維護很多開發(fā)分支≌铰玻現在我們來創(chuàng)建一個新的叫 branchTest的分支:

 $ git branch branchTest

運行git branch命令可以查看當前的分支列表拣宰,已經目前的開發(fā)環(huán)境處在哪個分支上:

 $ git branch 
   branchTest
   * master

master 是系統(tǒng)創(chuàng)建的, branchTest 是你剛剛穿件的烦感。切換分支到branchTest中

$ git branch branchTest

且換到新分支后巡社,編輯file1文件,然后添加并提交

$ vi file1
~/Test/GitTest  ?branchTest*? $ git status
  On branch branchTest
  Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  modified:   file1
  no changes added to commit (use "git add" and/or "git commit -a")
~/Test/GitTest  ?branchTest*? $ git add file1 
~/Test/GitTest  ?branchTest*? $ git commit -m 'update branchTest file1'  
  [branchTest c5bc27a] update branchTest file1
   1 file changed, 4 insertions(+)
~/Test/GitTest  ?branchTest? $ git status
  On branch branchTest
  nothing to commit, working tree clean
 ~/Test/GitTest  ?branchTest?$  git checkout master

切換到master分支下手趣,查看剛才編輯的文件晌该,發(fā)現剛才的修改已經不見了,因為剛才的修改是在branchTest分支下操作的,現在切換回了master
分支朝群,目錄下的文件都是master分支上的文件了燕耿。

現在可以在master分支下再作一些不同的修改:

## 編輯file2 
~/Test/GitTest  ?master? $ echo 'edit file2' >> file2
~/Test/GitTest  ?master*? $ cat file2                                                                                                                                                                   
  file2
  edit file2
~/Test/GitTest  ?master*? $ git add file2 
~/Test/GitTest  ?master*? $ git commit -m '提交file2'
[master 73568ca] 提交file2
 1 file changed, 1 insertion(+)

這時,兩個分支就有了各自不同的修改姜胖,分支的內容都已經不同誉帅,如何將多個分支進行合并呢?

可以通過下面的git merge命令來合并branchTest到主線分支master:

## 在master分支上執(zhí)行
$ git merge -m 'merge master' branchTest

-m參數仍然是需要填寫合并的注釋信息右莱。
由于兩個branch修改了兩個不同的文件蚜锨,所以合并時不會有沖突,執(zhí)行上面的命令后合并就完成了隧出。

如果有沖突踏志,比如兩個分支都改了一個文件file3,則合并時會失敗胀瞪。如下:

~/Test/GitTest  ?master?$ ## 編輯file3
~/Test/GitTest  ?master?$ echo "abc" >> file3 
~/Test/GitTest  ?master*?$ cat file3 
  file3
  abc
~/Test/GitTest  ?master*?$ git add file3 
~/Test/GitTest  ?master*?$ git commit -m 'update file3'
[master 1e9e80a] update file3
   1 file changed, 1 insertion(+)
~/Test/GitTest  ?master?$ git status
  On branch master
  Your branch is ahead of 'origin/master' by 4 commits.
    (use "git push" to publish your local commits)
  nothing to commit, working tree clean
~/Test/GitTest  ?master?$ git checkout branchTest
  Switched to branch 'branchTest'
~/Test/GitTest  ?branchTest?$ ls
  README.md file1     file2     file3
~/Test/GitTest  ?branchTest?$ cat file3 
  file3
~/Test/GitTest  ?branchTest?$ echo 'aaaa' >> file3
~/Test/GitTest  ?branchTest*?$ git add file3 
~/Test/GitTest  ?branchTest*?$ git commit -m 'update file3'
  [branchTest e817b05] update file3
   1 file changed, 1 insertion(+)
~/Test/GitTest  ?branchTest?$ git checkout master
  Switched to branch 'master'
  Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)
~/Test/GitTest  ?master?$ ## 合并分支
~/Test/GitTest  ?master?$ git merage -m '合并分支' branchTest 
  Auto-merging file3
  CONFLICT (content): Merge conflict in file3
  Automatic merge failed; fix conflicts and then commit the result.
~/Test/GitTest  ?master*?$ ## 提示合并沖突针余,失敗                                                                                                                                                   
~/Test/GitTest  ?master*?$ ## 合并失敗后,通過 git status 查看狀態(tài)凄诞,會發(fā)現file3 顯示為both modified , 查看file3的內容                                                                          
~/Test/GitTest  ?master*?$ cat file3                                                                                                                                                                    
  file3
  <<<<<<< HEAD
  abc
  =======
  aaaa
  >>>>>>> branchTest
~/Test/GitTest  ?master*?$ ## 可以看到沖突的內容都被添加到了file3中圆雁,我們使用vim編輯這個文件,去掉git自動產生標志沖突的<<<<<<等符號后帆谍,根據需要只保留我們需要的內容后保存伪朽,然后使用git add file3和git commit命令來提交合并后的file3內容,這個過程是手動解決沖突的流程汛蝙。
~/Test/GitTest  ?master*?$ vim file3
~/Test/GitTest  ?master*?$ git add file3 
~/Test/GitTest  ?master*?$ git commit    
    [master 1f4e771] 合并分支
~/Test/GitTest  ?master?$ git commit -m 'merge file3'
  On branch master
  Your branch is ahead of 'origin/master' by 6 commits.
  (use "git push" to publish your local commits)
  nothing to commit, working tree clean
~/Test/GitTest  ?master?$ ## 完成合并后烈涮,通過如下命令可以刪掉分支                                                                                                                              
~/Test/GitTest  ?master?$ git branch -d branchTest                                                                                                                                                    
  Deleted branch branchTest (was e817b05).

撒銷一個合并
如果你覺得你合并后的狀態(tài)是一團亂麻,想把當前的修改都放棄窖剑,你可以用下面的命令回到合并之前的狀態(tài):

  $ git reset --hard HEAD^# 查看file3的內容坚洽,已經恢復到合并前的master上的文件內容$ cat file3

三、git基礎命令應用(日志)

~/Test/GitTest  ?master? $ ## git log 命令顯示所有提交日志
~/Test/GitTest  ?master? $ git log
~/Test/GitTest  ?master? $ ## 如果日志記錄較長西土,可通過按鍵q退出  
~/Test/GitTest  ?master? $ ## git log 有很多參數讶舰,可以使用git help log 查看  
~/Test/GitTest  ?master? $ ## 日志統(tǒng)計 git log --stat
~/Test/GitTest  ?master? $ ## 如果用--stat選項使用'git log',它會顯示在每個提交(commit)中哪些文件被修改了, 這些文件分別添加或刪除了多少行內容,這個命令相當于打印詳細的提交記錄:
~/Test/GitTest  ?master? $ git log --stat
~/Test/GitTest  ?master? $ ## 格式化日志需了, --pretty 參數可以使用n多表現形式跳昼,如oneline, short, medium, full, fuller, email 或raw。也可以通過--pretty=format參數定義格式肋乍。--graph 選項可以可視化你的提交圖(commit graph)鹅颊,會用ASCII字符來畫出一個很漂亮的提交歷史(commit history)線: 
~/Test/GitTest  ?master? $ git log --pretty=oneline
~/Test/GitTest  ?master? $ git log --graph --pretty=oneline
~/Test/GitTest  ?master? $ $ git log --pretty=format:'%h : %s' --topo-order --graph
~/Test/GitTest  ?master? $ git log --pretty=format:'%h : %s' --topo-order --graph            
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市墓造,隨后出現的幾起案子堪伍,更是在濱河造成了極大的恐慌历帚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠娱,死亡現場離奇詭異,居然都是意外死亡谱煤,警方通過查閱死者的電腦和手機摊求,發(fā)現死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刘离,“玉大人室叉,你說我怎么就攤上這事×蛱瑁” “怎么了茧痕?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恼除。 經常有香客問我踪旷,道長,這世上最難降的妖魔是什么豁辉? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任令野,我火速辦了婚禮,結果婚禮上徽级,老公的妹妹穿的比我還像新娘气破。我一直安慰自己,他們只是感情好餐抢,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布现使。 她就那樣靜靜地躺著,像睡著了一般旷痕。 火紅的嫁衣襯著肌膚如雪碳锈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天苦蒿,我揣著相機與錄音殴胧,去河邊找鬼。 笑死佩迟,一個胖子當著我的面吹牛团滥,可吹牛的內容都是我干的。 我是一名探鬼主播报强,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼灸姊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秉溉?” 一聲冷哼從身側響起力惯,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤碗誉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后父晶,有當地人在樹林里發(fā)現了一具尸體哮缺,經...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年甲喝,在試婚紗的時候發(fā)現自己被綠了尝苇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡埠胖,死狀恐怖糠溜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情直撤,我是刑警寧澤非竿,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站谋竖,受9級特大地震影響红柱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜圈盔,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一豹芯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驱敲,春花似錦铁蹈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娩梨,卻和暖如春沿腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狈定。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工颂龙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纽什。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓措嵌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芦缰。 傳聞我的和親對象是個殘疾皇子企巢,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,665評論 9 163
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,668評論 4 54
  • 2017年5月28日 星期日 晴 今天的讀經班在茹茹奶奶家舉行让蕾,今天也是小湉湉外婆的生日浪规。小湉湉外婆帶了一個蛋糕...
    Q兒閱讀 213評論 0 1
  • 最近兩周或听,我借了參加運動會的一個名義(剛確認,我落選了)笋婿,開始讓自己走出舒適圈誉裆,嘗試去室外晨跑跑步。我不跑步...
    拆擁閱讀 199評論 0 0
  • 方正繼續(xù)怒不可遏地說道 :“羅琳你想想看缸濒,那些腦滿腸肥的大老板吃的是什么找御?是一個個無辜失去生命的胎兒,這些可憐的孩...
    長白居士閱讀 204評論 0 0