Git使用教程

git(github)版本控制

最近在學(xué)習(xí)git绩郎,在網(wǎng)上也看了很多教程潘鲫,也跳了很多坑,在這里給大家分享一下吧肋杖,希望我跳過的坑大家就不要跳了溉仑。。状植。

準(zhǔn)備Git

什么是git浊竟??津畸?

git是全世界最好用的分布式版本控制系統(tǒng)振定。那么什么又是版本控制,為什么要用版本控制呢肉拓?就是對于一個項目或者一段代碼后频,你改了又改,版本控制會幫你記錄你改過的東西并可以在你改過的任意版本之間自由穿梭暖途,是不是很酷呢卑惜?OK,Let‘s begin驻售!

安裝Git

Mac系統(tǒng):
先安裝homebrew露久,終端輸入

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  

等待大約1分鐘左右,下載完成芋浮,過程中需輸入密碼抱环,無需其他操作。
homebrew安裝完成后安裝git纸巷,終端輸入

brew install git  

還有一種安裝方法镇草,從AppStore中下載Xcode,Xcode中集成Git瘤旨,不過默認(rèn)為有安裝梯啤。選擇Xcode->preferences,在彈出窗口中找到Downloads,選擇Command Line Tools存哲,點Install就可以了因宇。

Windows系統(tǒng):
Windows用戶可以直接從Git官網(wǎng)上下載,或者可以從國內(nèi)鏡像下載祟偷。然后按照默認(rèn)安裝選項進(jìn)行安裝即可察滑。安裝完成后,在開始菜單中找到Git->Git Bash,會彈出一個命令行窗口修肠,代表安裝成功贺辰。

安裝完成后,要進(jìn)行設(shè)置,在命令行(終端)輸入:

$ git config --global user.name "Your Name"  
$ git config --global user.email "email@example.com"    

此處是設(shè)置用戶名饲化,和郵箱莽鸭。

Git初體驗

創(chuàng)建版本庫(repository)

版本庫本質(zhì)上就是一個目錄,只是在這個目錄中的文件都可以被Git所管理吃靠,即實現(xiàn)版本控制硫眨。
首先你需要選擇一個合適的位置新建一個文件夾,然后進(jìn)入該文件夾。

$mkdir testgit  
$ cd learngit  

然后通過以下代碼將這個目錄變成可以被git管理的版本庫

$git init  
Initialized empty Git repository in /usr/local/testgit/.git/  

版本庫已建好巢块,目錄中會多一個.git的隱藏文件礁阁,這個文件是包含一些git配置,不要亂改夕冲。(看隱藏文件命令:ls -a)

添加文件到版本庫

之前我們已經(jīng)建立好了版本庫氮兵,現(xiàn)在可以向版本庫中添加我們向管理的文件。在此我向版本庫中添加了一個helloworld.txt文件歹鱼,內(nèi)容為helloword泣栈。


我們已經(jīng)在目錄中添加一了一個文件,想當(dāng)與對版本庫進(jìn)行了“修改”弥姻,當(dāng)我們修改結(jié)束后南片,需要告訴git,我已經(jīng)修改好了庭敦,請將我的修改更新至版本庫疼进。此時需要進(jìn)行兩步操作:

$ git add helloworld.txt
$ git commit -m "wrote a file"

解釋一下,第一步“add”是將修改添加至版本庫秧廉,第二步“commit”提交這次修改伞广,其中-m參數(shù)代表此次提交的信息。提交成功后疼电,版本庫內(nèi)容進(jìn)行了更新嚼锄。

版本退回

在此首先我們先介紹一個命令git status,表示現(xiàn)在版本庫的狀態(tài)蔽豺。

$ git status  
On branch master
nothing to commit, working tree clean

現(xiàn)在的狀態(tài)代表沒有修改也沒有提交区丑。下面我們修改一下之前添加的helloworld.txt文件。在下面添加一行hellogit


然后我們再一次使用git status命令查看當(dāng)前狀態(tài)

$git status  
On branch master  
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:   helloworld.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

上面的意思就是我們修改了helloworld.txt文件修陡,但是沒有提交沧侥。我們怎么能看哪里修改了呢?魄鸦,就會用到git diff命令

diff --git a/helloworld.txt b/helloworld.txt
index 31e0fce..93c98ef 100644
--- a/helloworld.txt
+++ b/helloworld.txt
@@ -1 +1,2 @@
 helloworld
+hellogit  

上面顯示了我新加了一行hellogit宴杀。然后我就可以提交修改了,還是兩步拾因,我們先add一下旺罢,然后用git atatus命令看一下版本庫狀態(tài)斯棒。

$git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   helloworld.txt  

輸出信息提示我們helloworld.txt的修改將要被提交。然后我們就提交一下吧主经。

$git commit -m "add hellogit"
[master cf11128] add hellogit
1 file changed, 1 insertion(+)  

然后再git status一下

$git status
On branch master
nothing to commit, working tree clean

就又回到?jīng)]有修改的狀態(tài)了。然后我們可以使用git log查看我們提交的歷史庭惜。

$git log
commit cf111280924bce3c78b5abe3c80cbafa36b0c632 (HEAD -> master)
Author: Desire-zone <m15045588290@163.com>
Date:   Tue Oct 9 15:33:36 2018 +0800

    add hellogit

commit 8aad9f5dfb84eb6bff35f6cc012c93727c9cc416
Author: Desire-zone <m15045588290@163.com>
Date:   Tue Oct 9 15:11:36 2018 +0800

    init commit  

我們可以看到我們一共提交了兩次以及提交信息罩驻,(HEAD->master)代表當(dāng)前的版本,commit后面一串東西cf1112...代表版本號护赊。

下面重點來了惠遏,如果我們想回到之前也就是第一次提交的版本怎么辦呢?我們可以使用git reset命令骏啰,后面加上HEAD參數(shù)节吮,HEAD^ 或者HEAD~1表示上一版本,HEAD^^ 或者HEAD~2表示上兩個版本判耕,以此類推透绩。

$git reset --hard HEAD^
HEAD is now at 8aad9f5 init commit  

看一下我們的helloworld.txt


好了,現(xiàn)在我們已經(jīng)成功穿梭回過去的版本了壁熄。我們使用git log看一下

$git log
commit 8aad9f5dfb84eb6bff35f6cc012c93727c9cc416 (HEAD -> master)
Author: Desire-zone <m15045588290@163.com>
Date:   Tue Oct 9 15:11:36 2018 +0800

    init commit  

我們發(fā)現(xiàn)我們回到了過去的版本了帚豪,但是未來的版本不見了,我們怎么回到未來呢草丧?一種方法我們可以向上翻之前的命令狸臣,會找到未來版本的版本號,或者使用git reflog來查看歷史命令昌执,進(jìn)而可以找到版本號烛亦,使用git reset加上版本號可以穿梭回未來。

$git reset --hard cf11128
HEAD is now at cf11128 add hellogit  

我們成功穿梭回未來了懂拾,是不是很有趣~煤禽。(hard參數(shù)先不用知道是干什么的,注意--和hard之間沒有空格)

撤銷修改

當(dāng)我們修改了文件但是還沒提交委粉,我們怎樣撤銷修改呢呜师??贾节?我們需要使用git checkout -- <file>命令汁汗,我們來試一下。首先在helloworld.txt文件里加點東西


第三行是我新加的栗涂,使用git status看一下版本庫當(dāng)前狀態(tài)知牌。

$git status
On branch master
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:   helloworld.txt
no changes added to commit (use "git add" and/or "git commit -a")  

提示我們修改未提交,此時我們使用git checkout -- helloworld.txt進(jìn)行撤銷修改然后在用git status看一下狀態(tài)

$git checkout -- helloworld.txt
[wangzhiwen@wangzhiwendeMacBook-Air ~/Desktop/testgit]$git status
On branch master
nothing to commit, working tree clean  

信息提示我們沒有修改要提交斤程,再看一下hello world.txt文件


修改已經(jīng)被我們撤銷了角寸。下面介紹另一種情況菩混,如果我們修改了文件,并且已經(jīng)add了扁藕,然后我們想撤銷又能怎么辦呢沮峡?我們可以使用git reset HEAD <file>進(jìn)行撤銷。我們試一下亿柑,在helloworld.txt中再添加一行邢疙。

下面我們add一下。 然后使用git reset HEAD <file>進(jìn)行撤銷

git reset HEAD helloworld.txt
Unstaged changes after reset:
M   helloworld.txt  

此時用git status查看一下當(dāng)前狀態(tài)望薄。

$git status
On branch master
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:   helloworld.txt

no changes added to commit (use "git add" and/or "git commit -a")  

此時文件已變成修改未add狀態(tài)疟游,然后我們還需要使用git checkout -- <file>來進(jìn)行撤銷修改。

$git checkout -- helloworld.txt
$git status
On branch master
nothing to commit, working tree clean  

此時顯示工作區(qū)已經(jīng)干凈了痕支,變成了無修改狀態(tài)颁虐。再看下文件。


大功告成卧须。

Git進(jìn)階篇

關(guān)聯(lián)遠(yuǎn)程庫Github

至此我們已經(jīng)可以自由的在本地的管理庫中自由穿梭了另绩,但這還不夠,接下來要介紹Git的進(jìn)階功能——連接遠(yuǎn)程版本庫故慈。Git具有分布式的特點板熊,對于一個版本庫,可以分布到遠(yuǎn)程服務(wù)器上察绷,說到這里不得不說一下我們開園的天堂——GIthub干签,GIthub是一個代碼托管平臺,我們可以把本地的版本庫與Github關(guān)聯(lián)進(jìn)行版本控制拆撼。
想要關(guān)聯(lián)遠(yuǎn)程庫容劳,首選需要注冊一個GitHub賬號,這個自行完成闸度。注冊完成后竭贩,登陸GitHub,在右上角找到“new reposotory”按鈕創(chuàng)建一個想要關(guān)聯(lián)的遠(yuǎn)程版本庫莺禁,名字最好和本地版本庫一樣testgit留量。其他保持默認(rèn)設(shè)置就好,創(chuàng)建好如下圖:


遠(yuǎn)程庫創(chuàng)建好以后哟冬,我們開始進(jìn)行關(guān)聯(lián)楼熄。

首先要創(chuàng)建SSH KEY。打開終端(Windows下打開Git Bash)浩峡,用以下命令創(chuàng)建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"  

你需要郵箱換成你自己的郵箱可岂,然后一路回車即可。創(chuàng)建成功以后翰灾,你會在用戶主目錄里找到.ssh目錄(隱藏文件)缕粹,里面有id_rsa和id_rsa.pub兩個文件稚茅,其中id_rsa是私鑰,不能泄漏出去平斩。然后進(jìn)入GitHub亚享,打開“Personal settings”,進(jìn)入“SSH and GPG keys”頁面绘面,點擊“new SSH key”虹蒋,Tittle隨便寫,key里面粘貼你的id_rsa.pub文件里的內(nèi)容飒货。然后點擊“Add SSH key”就可以了。

接下來回到本地庫運行一下命令:

$ git remote add origin git@github.com:Desire-zone/testgit.git  

Desire-zone換成你的Github賬戶名峭竣。
接下來就可以把用git push命令把本地版本庫的所有內(nèi)容推送到Github上了塘辅。

$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 462 bytes | 462.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/Desire-zone/testgit/pull/new/master
remote:
To github.com:Desire-zone/testgit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.  

注意:由于我們新創(chuàng)建的遠(yuǎn)程庫是空的,我們第一次推送時皆撩,加上了-u參數(shù)扣墩,Git不但會把本地內(nèi)容推送到遠(yuǎn)程庫,還會把本地版本庫與遠(yuǎn)程版本庫進(jìn)行關(guān)聯(lián)扛吞,再以后推送的時候就不需要該參數(shù)了呻惕。

現(xiàn)在我們會發(fā)現(xiàn)Github遠(yuǎn)程庫的內(nèi)容和本地庫的內(nèi)容一樣了。以后每次在本地提交以后滥比,都可以通過一下命令進(jìn)行推送亚脆。

$ git push origin master  

從Github上克隆

之前我們已經(jīng)學(xué)會了如何講本地版本庫和遠(yuǎn)程庫關(guān)聯(lián)并從推送本地內(nèi)容到遠(yuǎn)程庫,現(xiàn)在我們要將一下如何從Github上克隆版本庫到本地盲泛。

首先我們新建一個倉庫濒持,為了讓倉庫里面有些文件,我們建的時候勾上Initialize this repository with a README寺滚,這樣就會自動為我們在倉庫里面創(chuàng)建一個文件柑营,倉庫名字可以叫做clonegit。

下面我們就可以使用git clone命令克隆一個本地庫出來村视。

$ git clone git@github.com:Desire-zone/clonegit.git
Cloning into 'clonegit'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.  

然后你會在當(dāng)前目錄下發(fā)下一個本地的clonegit代碼庫官套,打開后里面會有一個README文件。至此我們成功將GIthub上的倉庫克隆到了本地蚁孔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奶赔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勒虾,更是在濱河造成了極大的恐慌纺阔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修然,死亡現(xiàn)場離奇詭異笛钝,居然都是意外死亡质况,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門玻靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结榄,“玉大人,你說我怎么就攤上這事囤捻【世剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵蝎土,是天一觀的道長视哑。 經(jīng)常有香客問我,道長誊涯,這世上最難降的妖魔是什么挡毅? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮暴构,結(jié)果婚禮上跪呈,老公的妹妹穿的比我還像新娘。我一直安慰自己取逾,他們只是感情好耗绿,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砾隅,像睡著了一般误阻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晴埂,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天堕绩,我揣著相機與錄音,去河邊找鬼邑时。 笑死奴紧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晶丘。 我是一名探鬼主播黍氮,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浅浮!你這毒婦竟也來了沫浆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滚秩,失蹤者是張志新(化名)和其女友劉穎专执,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郁油,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡本股,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年攀痊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄显。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苟径,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躬审,到底是詐尸還是另有隱情棘街,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布承边,位于F島的核電站遭殉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏博助。R本人自食惡果不足惜恩沽,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔始。 院中可真熱鬧,春花似錦里伯、人聲如沸城瞎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脖镀。三九已至,卻和暖如春狼电,著一層夾襖步出監(jiān)牢的瞬間蜒灰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工肩碟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留强窖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓削祈,卻偏偏與公主長得像翅溺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子髓抑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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

  • Git使用教程:https://blog.csdn.net/tgbus18990140382/article/de...
    SkTj閱讀 2,793評論 1 11
  • (預(yù)警:因為詳細(xì)咙崎,所以行文有些長,新手邊看邊操作效果出乎你的預(yù)料) 一:Git是什么吨拍? Git是目前世界上最先進(jìn)的...
    axiaochao閱讀 1,932評論 1 8
  • 轉(zhuǎn)載自:http://www.open-open.com/lib/view/open1414396787325.h...
    Bbooo閱讀 421評論 0 3
  • 一:Git是什么褪猛? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 二:SVN與Git的最主要的區(qū)別羹饰? SVN是集...
    傲慢二鍋頭閱讀 416評論 0 0
  • 我想和你處對象 原本對你印象停留在那次吃飯 后來呢 打打招呼我比較悶騷所以稍微回應(yīng)一下 跳轉(zhuǎn)到運動會 一身紅衣馬尾...
    梔化閱讀 136評論 0 0