一、簡介
在介紹git操作命令之前,我們先來了解一段故事!
很多人都知道,Linus 在1991年 創建了開源的Linux操作系統,此后的三十多年里,Linux 系統不斷發展,已然成為全世界最大的服務器系統軟件了。
Linus 雖然創建了Linux操作系統,但是Linux操作系統的壯大是得益于全世界熱心的志愿者參與的,這么多人在世界各地為Linux操作系統編寫代碼,那Linux操作系統的代碼是如何管理的呢?
在 2002 年以前,世界各地的志愿者把源代碼文件通過diff的方式發給 Linus,然后由 Linus 本人通過手工方式合并代碼!
不過,到了 2002 年,Linux操作系統已經發展了十年了,代碼庫之大讓 Linus 很難繼續通過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿。
可能有的同學會發出疑問,不是有 CVS、SVN 這些免費的版本控制系統嗎?為什么不用它們來托管Linux操作系統代碼?
因為 Linus 本人堅定地反對 CVS 和 SVN,原因是這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。
于是 Linus 選擇了一個商業的版本控制系統 BitKeeper,BitKeeper 的東家 BitMover 公司出于人道主義精神,授權 Linux 社區免費使用這個版本控制系統。
隨著 Linux 社區對 BitKeeper 版本控制系統的深度了解,原本安定團結的大好局面在 2005 年被打破了,原因是 Linux 社區牛人眾多,一名叫 Andrew 的開發者把 BitKeeper 商業授權協議破解了(這么干的其實也不只他一個),之后被 BitMover 公司發現了(監控工作做得不錯!),于是 BitMover 公司怒了,要收回 Linux 社區的免費使用權。
Linus 向 BitMover 公司道了歉,保證以后嚴格管教弟兄們,嗯,想要別人不破解,這其實是不可能的。
之后,Linus 花了兩周時間自己用 C 寫了一個分布式版本控制系統,這就是我們今天要介紹的 Git!(牛人是怎么定義的,大家可以自行體會一下)
一個月之內,Linux 系統的源碼已經由 Git 管理了!
之后的事情,想必估計都知道,Git 迅速成為全世界最流行的分布式版本控制系統,在代碼托管方面,基本上是一騎絕塵!
尤其是 2008 年,GitHub 網站上線了,它為開源項目免費提供 Git 存儲,無數的開源項目開始遷移至 GitHub,包括 jQuery、PHP、Ruby等等!
說了這么多,Git 是一款什么樣的軟件?和 CVS、SVN 這些免費的版本控制系統有什么區別呢?
上文中我們也說到了,Git 其實是一款分布式的版本控制系統,可能你還是不太理解什么叫分布式,我們先聊聊什么是集中式!
集中方的版本控制系統,簡單的說,就是當你要干活的時候,用的一般都是自己的電腦,首先要從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。
集中式版本控制系統,好處就是統一管理,但是壞處也很明顯,必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可如果在互聯網上,遇到網速慢的話,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊。
分布式版本控制系統,與集中式版本控制系統最大的不同就是:沒有中央服務器這個東西。
每個人的電腦上都是一個完整的版本庫,可以說每個電腦都是中央服務器,當你工作的時候,不需要聯網,可以直接提交工作的內容,如果對方的電腦想要知道你的工作內容,你只需要把對應的工作文件推送過去就可以,對方就可以看到,其他不相關的文件不需要推送給對方!
和集中式版本控制系統相比,分布式版本控制系統的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那里復制一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法干活了。
既然git這么受歡迎,下面我們就開始git的學習之旅吧!
二、安裝 GIT
2.1、在 Linux 上安裝 Git
如果你當前的電腦操作系統是 Linux,安裝起來會非常簡單,首先試著輸入git,看看系統有沒有安裝Git:
$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git
像上面的命令,有很多 Linux 會友好地告訴你 Git 沒有安裝,還會告訴你如何安裝 Git。
按照提示,輸入如下命令,即可安裝git!
sudo apt-get install git
2.2、在 Mac OS X 上安裝 Git
如果你正在使用 Mac 做開發,有兩種安裝 Git 的方法!
一是安裝homebrew,然后通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,因為Xcode集成了Git,不過默認沒有安裝,你需要運行Xcode,選擇菜單Xcode->Preferences,在彈出窗口中找到Downloads,選擇Command Line Tools,點Install就可以完成安裝了。
Xcode是Apple官方IDE,功能非常強大,是開發Mac和iOS App的必選裝備,而且是免費的!
2.3、在 Windows 上安裝 Git
在Windows上使用Git,就比較傻瓜式了,可以從Git官網直接下載安裝程序,然后按默認選項安裝即可。
安裝完成后,在開始菜單里找到Git->Git Bash,蹦出一個類似命令行窗口的東西,就說明Git安裝成功!
以上全部安裝完成后,還需要最后一步設置,在命令行輸入:
#配置全局用戶名 git config --global user.name "Your Name" #配置全局郵箱 git config --global user.email "[email protected]"
配置的你用戶名和郵箱,因為Git是分布式版本控制系統,所以,每個機器都必須自報家門!
三、GIT 操作手冊
在上文中,我們對git的安裝進行了一些簡單的介紹,等環境準備完成之后,我們就可以開啟GIT之旅!
3.1、配置管理
在上文中,我們有介紹了全局配置用戶名和郵箱,假如你的用戶和郵箱輸入錯誤了,想修改,怎么辦呢?
同樣可以用如下的命令,進行修改!
#重新配置用戶名 git config --global user.name "zhangsan" #重新配置郵箱 git config --global user.email "[email protected]"
同時,還可以通過如下命令查詢配置
#查看當前配置
git config --list
如果你想針對某個庫,設置用戶名和郵箱,直接當前倉庫根路徑下,通過如下方式可以實現單獨配置!
#配置某個倉庫的用戶名、郵箱 git config user.name "Your Name" git config user.email "[email protected]"
如果你配置的倉庫,用戶和密碼填錯了,可以通過如下命令方式清除,然后重新配置!
git config --system --unset credential.helper
3.2、版本管理
版本庫管理是GIT最重要的核心模塊,具體操作如下!
當你想向GIT里面提交一個文件的時候,首先需要初始化一個版本庫
#初始化一個版本庫 git init
然后,可以通過如下命令,添加或者修改一個的指定文件!
#添加或者修改一個的指定文件 git add <文件名>
當然,你還可以通過如下命令,添加當前目錄下全部的文件!
#添加或者修改的所有文件
git add --all
添加完成之后,還需要提交文件,命令如下
#提交文件 git commit -m <注釋>
例如,提交所有的內容提交到版本庫!
#例如,提交所有的文件添加修改提交到版本庫 git commit -m "注釋內容"
有些時候,我們需要通過一下命令,查詢當前工作區的信息。
比如,查看當前工作區的狀態,這個基本上經常用到!
#查看當前工作區的狀態 git status
查詢當前版本庫的歷史提交日志紀錄,這個會在版本回滾的時候用到!
#查看歷史日志
git log
#查看精簡日志
git log --pretty=oneline
查看當前文件的內容!
#查看文件內容 cat <文件名>
查看歷史提交的命令!
#查看歷史提交的命令 git reflog
查看文件修改內容!
#查看當前文件修改內容 git diff <文件名>
查看工作區和版本庫里面最新版本的區別!
#查看當前文件和版本庫里面最新版本的區別
git diff HEAD -- <文件名>
如果你想將當前文件回滾到歷史上某個時間點提交的文件,可以通過如下命令!
#首先查詢你要回滾到歷史上某個時間點的版本ID git log --pretty=oneline #然后通過如下命令,進行回滾操作 git reset --hard <版本id>
當你修改了某個文件,但是沒有提交,想要回滾,怎么處理呢?可以通過如下命令進行撤回!
#撤銷某個文件的修改
git checkout -- <文件名>
如果你想全部撤銷,可以通過如下命令撤回全部!
#撤銷所有修改 git checkout .
當然,如果你不想要某個文件了,可以通過如下方式刪除!
#刪除指定文件 git rm <文件名>
3.3、分支管理
GIT的分支管理,非常強大,也是它遠勝 CVS、SVN 這些免費的版本控制系統一大神器!
GIT在初始化版本庫的時候,會默認創建一個master分支,也就是主干分支!
如果你想創建某個分支,可以通過如下命令創建!
#創建分支 git branch <分支名>
比如,創建一個develop分支!
git branch develop
當執行這個命令之后,GIT的develop分支指針會指向到當前分支當前位置!
怎么切換到分支呢?我們可以通過git checkout命令,實現分支的切換!
#切換分支 git checkout <分支名>
當然,你還可以一步到位,通過如下命令,創建并切換分支!
#創建分支+切換分支 git checkout -b <分支名>
通過下面這個命令,可以查詢當前分支!
#查看當前分支 git branch
如果分支切換失敗,可以通過git status命令查詢一下為什么會失敗,分支切換失敗多半是當前工作區的代碼沒有提交到版本庫里面導致,可以檢測一下是不是代碼都提交到本地版本庫!
在平時的開發過程中,我們會經常碰到需要合并分支,比如將develop分支合并到master分支,怎么處理呢?
可以通過如下命令,實現快速合并!
#快速合并分支 git merge <分支名>
在合并的時候,可能會出現文件發生沖突的情況,如果出現,就排查修改文件,然后提交!
當然,你還可以通過如下命令,來實現分支合并提交!
#普通模式合并分支+提交 git merge --no-ff -m "merge with no-ff" <分支名>
如果某個分支,你不想要了,想刪除,可以通過如下命令實現!
#刪除分支 git branch -d <分支名>
如果刪除過程中,出現報錯,可以下面這個命令,強行刪除!
#強行刪除分支 git branch -D <分支名>
最后,你可以通過下面這個命令,查詢當前版本分支的變動情況!
#查看分支合并圖
git log --graph
3.4、標簽管理
標簽管理,也是git最最核心的功能!通過標簽,我們可以很快的定位到倉庫中某個版本,并進行代碼回滾!
可以通過如下命令創建某個標簽,比如v1.0標簽。
#創建標簽
git tag v1.0
查看標簽情況
#查看所有的標簽 git tag
如果你想看某個標簽,具體的詳情,可以通過如下命令!
#查看標簽信息 git show <標簽名>
如果你不想要了,可以通過如下命令,刪除標簽!
#刪除標簽 git tag -d <標簽名>
當然,如果你想針對某個歷史版本,打標簽,可以通過如下方式實現!
#查看歷史版本id git log --pretty=oneline --abbrev-commit #對某個版本ID,打上標簽,名稱v0.9 git tag v0.9 <版本id>
我們還可以將標簽推送到遠程分支,命令如下:
#推送全部標簽到遠程庫
git push origin --tags
刪除遠程標簽庫
#刪除本地標簽 git tag -d v0.9 #推送到遠程分支 git push origin :refs/tags/<標簽名>
3.5、忽略文件管理
GIT還為我們提供了一個巨大的利器,我們可以通過配置忽略文件,將當前目錄中某些文件忽略掉,不提交到版本庫里面,具體怎么操作呢?
首先在當前版本庫根目錄下,創建一個.gitignore文件,內容自己定義,比如下面這個內容,就是小編定義的忽略文件,
/target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr *.class ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ /build/ ### mac ### .DS_Store file/ logs/ */target target/
然后,執行如下命令,讓忽略文件生效!
#清除緩存 git rm -r --cached . #添加所有文件 git add . #提交到版本庫 git commit -m "update .gitignore" #提交到遠程分支(如果有的話) git push
3.6、遠程倉庫管理
以上介紹的基本上都是本地倉庫的操作,如果我們需要與其他的電腦協助工作,怎么處理呢?
如果我們本地沒有倉庫,我們可以直接從遠程分支里面拉取一個版本庫同步到本地,命令如下。
#從遠端服務器創建主分支 git clone <url>
我們可以通過如下命令,查詢遠程分支的詳情
#查看遠程庫
git remote -v
如果你是通過git init方式初始化了本地倉庫,想與遠程分支關聯,可以通過如下命令實現!
#添加遠程地址 git remote add origin <url>
如果你填寫錯了,想刪除,可以通過如下命令刪除,再重新添加!
#刪除遠程提交地址 git remote rm origin
如果你之前沒有推送內容到遠程庫,可以通過如下命令推送
#首次推送到遠程庫并創建分支 git push -u origin <分支名> (第一次將內容推送到master分支)
后期推送到遠程分支,可以這樣操作
#后期推送到遠程分支 git push origin <分支名> #可以簡寫,快速推送 git push
有時候,我們還需要查詢遠程分支的情況,可以通過如下命令操作:
#查看遠程的所有分支
git branch -a
有時候,我們還需要從遠程服務器拉取某個指定的分支到本地,可以通過下面這個命令完成:
#從遠程服務器拉取某個指定的分支到本地,并創建分支 git checkout -b <分支名> origin/<分支名>
大部分的情況下,當遠程服務器更新了版本庫,通知我們也要更新時,通過如下方式,即可將遠程的版本庫最新的內容同步到我們本地電腦版本庫里面。
#拉取遠程分支內容,并同步到本地版本庫 git pull
有時候,需要設置本地分支與遠程分支的鏈接,可以通過下面這個命令完成:
#設置本地分支與遠程分支的鏈接
git branch --set-upstream dev origin/dev
有時候,我們需要刪除沒有untracked的文件,可以通過下面這個命令完成:
#刪除沒有untracked的文件 git clean -d -xf
3.6、遠程倉庫管理
以上介紹的基本上都是本地倉庫的操作,如果我們需要與其他的電腦協助工作,怎么處理呢?
如果我們本地沒有倉庫,我們可以直接從遠程分支里面拉取一個版本庫同步到本地,命令如下。
#從遠端服務器創建主分支 git clone <url>
我們可以通過如下命令,查詢遠程分支的詳情
#查看遠程庫
git remote -v
如果你是通過git init方式初始化了本地倉庫,想與遠程分支關聯,可以通過如下命令實現!
#添加遠程地址 git remote add origin <url>
如果你填寫錯了,想刪除,可以通過如下命令刪除,再重新添加!
#刪除遠程提交地址 git remote rm origin
如果你之前沒有推送內容到遠程庫,可以通過如下命令推送
#首次推送到遠程庫并創建分支 git push -u origin <分支名> (第一次將內容推送到master分支)
后期推送到遠程分支,可以這樣操作
#后期推送到遠程分支 git push origin <分支名> #可以簡寫,快速推送 git push
有時候,我們還需要查詢遠程分支的情況,可以通過如下命令操作:
#查看遠程的所有分支
git branch -a
有時候,我們還需要從遠程服務器拉取某個指定的分支到本地,可以通過下面這個命令完成:
#從遠程服務器拉取某個指定的分支到本地,并創建分支 git checkout -b <分支名> origin/<分支名>
大部分的情況下,當遠程服務器更新了版本庫,通知我們也要更新時,通過如下方式,即可將遠程的版本庫最新的內容同步到我們本地電腦版本庫里面。
#拉取遠程分支內容,并同步到本地版本庫 git pull
有時候,需要設置本地分支與遠程分支的鏈接,可以通過下面這個命令完成:
#設置本地分支與遠程分支的鏈接
git branch --set-upstream dev origin/dev
有時候,我們需要刪除沒有untracked的文件,可以通過下面這個命令完成:
#刪除沒有untracked的文件 git clean -d -xf
3.7、沖突處理
版本同步的時候,如果大家都修改了同一個文件,難免會發生沖突。
比如,當修改的文件未提交,直接遠程拉取代碼會發生沖突,改怎么辦呢?
可以這樣處理
#先將本地修改存儲起來 git stash #暫存了本地修改之后,就可以pull了 git pull #還原暫存的內容 git stash pop stash@{0}
此時系統會提示如下類似的信息:
Auto-merging c/environ.c CONFLICT (content): Merge conflict in c/environ.c
意思就是系統自動合并修改的內容,但是其中有沖突,需要解決其中的沖突。
然后打開沖突的文件,進行修改,修改完畢之后,執行如下命令進行提交!
git add . git commit -m "注釋" git push
當然,還可以進行強制更新操作,覆蓋本地代碼,命令如下!
#下載遠程庫內容 git fetch --all #不做任何的合并,git reset 會把HEAD指向剛剛下載的最新的版本 git reset --hard origin/master
四、與服務器建立 ssh 連接
git中電腦與電腦之前的連接,支持的模式有兩種:HTTP和SSH,其中HTTP的傳輸會比較慢,才能SSH方式進行互推,效率會非常高!
因此,在實際的使用過程總,推薦使用SSH模式與遠程服務器建立連接!
例如與GitHub的連接,具體的操作配置方式如下!
4.1、創建 SSH Key
在當前電腦用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經有了,可以直接跳過。
如果沒有,打開Shell(Windows下打開Git Bash),創建 SSH Key:
ssh-keygen -t rsa -C "[email protected]"
你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可,由于這個 Key 也不是用于軍事目的,所以也無需設置密碼。
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是 SSH Key 的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
4.2、將公鑰配置到服務端
登陸 GitHub,打開Account settings,SSH Keys頁面:
然后,點Add SSH Key,填上任意Title,在 Key 文本框里粘貼id_rsa.pub文件的內容:
點Add Key,你就應該看到已經添加的 Key !
至此,本地與遠程服務器的連接配置已經完成,剩下的就是直接遠程服務器拉取代碼,然后提交的時候git push就可以了!
五、小結
本文主要圍繞GIT的背景和常用的操作命令做了一些介紹,可能有些地方介紹的比較粗陋、不完美,希望老鐵們能批評指出!
原文地址:https://mp.weixin.qq.com/s/KTv9Ny3AGa67kwcFQIivlg