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上的倉庫克隆到了本地蚁孔。