Git的使用
首先登錄https://git.oschina.net,如沒有賬號進行注冊.
Git簡單介紹
Git是一款免費,開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大得項目.
理解分支的概念:
分支像開發(fā)中的有向圖,每個開發(fā)人員都是一個分支,這樣不影響別人的開發(fā),也安全.
Git與SVN的區(qū)別
SVN是集中式版本控制系統(tǒng),版本庫值集中放在中央服務器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務器那里得到最新的版本,然后干湖,干完后,需要把自己做完的活推送到中央服務器.集中式版本控制系統(tǒng)必須聯(lián)網(wǎng)才能正常工作,如果在局域網(wǎng)還可以,寬帶夠大,速度夠快.如果在互聯(lián)網(wǎng)下,如果網(wǎng)速慢的話,就納悶了.
Git是分布式版本控制系統(tǒng),那么它就沒有中央服務器,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯(lián)網(wǎng)了,因為版本都是在自己的電腦上,既然每個人都有一個完整的版本庫,那么多個人如何協(xié)作?比如說自己在電腦上修改了文件A,其他人也在電腦上修改了文件A,這時候,你們兩個只需把各自修改的推送個對方,就可以看到對方的修改了.
常用命令
pwd顯示當前目錄的路徑
git status 本地狀態(tài)查詢
git add 提交修改文件
git commit -m "message" ? message換成你修改的信息,中英文都可以
注意: 這一點必須要寫清楚本次修改及增加的內(nèi)容
git config --global user.email ?"shenying@m14.cn" ?"換成你的郵箱"
git config --global user.name "shenying" ? "換成你的名字"
git branch 查看當前所有的分支
git branch -a 查看所有分支
拉去代碼時用git fetch + git rebase 不要用git pull
git fetch 從遠程git庫拉去代碼
git rebase origin
git push origin?
git fetch :相當于是從遠程獲取最新版本到本地,不會自動merge
git pull: 相當于是從遠程獲取最新版本并merge到本地
git pull origin master
上述命令其實相當于git fetch 和 git merge
在實際使用中,git fetch 更安全些
因為merge前,我們可以查看更新情況,然后在決定是否合并
Git 基本常用命令
Mkdir ? ? ? ? ? ? ? ? ? ?: XX(創(chuàng)建一個空目錄 XX指目錄名)
pwd ? ? ? ? ? ? ? ? ? ? ?: 顯示當前目錄的路徑
git init ? ? ? ? ? ? ? ? ? : 把當前的目錄變?yōu)榭梢怨芾淼膅it倉庫生成隱藏的.git文件
git add XX ? ? ? ? ? : 把文件添加到暫存區(qū)去.
git commit -m "XX" ? ? : 提交文件-m后面的的是注釋.
git status ? ? ? ? ? ? ? ? ? ? ?:查看倉庫狀態(tài)
git diff XX ? ? ? ? ? ? ? ? ? ? : 查看XX文件修改了哪些內(nèi)容
git log ? ? ? ? ? ? ? ? ? ? ? ? ? : 查看歷史記錄
git reset --hard HEAD^^ 或者git reset --hard HEAD~ ? ? 回退到上一個版本
git reset --hard HEAD~2 回退到第二個版本
cat XX ? ? ? ? ? ? ? ? ? ? ? ?: 查看XX文件內(nèi)容
git reflog ? ? ? ? ? ? ? ? ? ?: 查看歷史記錄的版本號id
git checkout XX ? ? ? ? :把文件在工作區(qū)的修改全部撤銷.
git rm XX ? ? ? ? ? ? ? ? ? ? : 刪除XX文件
git remote add origin https://github.com/RainbowWait/Swift_Class_3-.git 關聯(lián)一個遠程庫
git push -u (第一次使用-u,以后不需要) origin master ? ? ? ?: ?把當master分支推送到遠程庫
git clone https://github.com/RainbowWait/Swift_Class_3-.git 從遠程庫中克隆
git checkout -b dev ? ? ? ? ? ? ? : 創(chuàng)建dev分支,并切換到dev分支上
git branch ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :查看當前所有的分支
git checkout master ? ? ? ? ? ? ?:切換回master分支?
git merge dev ? ? ? ? ? ? ? ? ? ? ? ? : 在當前的分支上合并dev分支
git branch -d dev ? ? ? ? ? ? ? ? ? : 刪除dev分支
git branch name ? ? ? ? ? ? ? ? ? ? : 創(chuàng)建分支
git stash ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: 把單錢的工作隱藏起來,等以后恢復現(xiàn)場后繼續(xù)工作
git stash list ? ? ? ? ? ? ? ? ? ? ? ? ? ?: 查看所有被隱藏的文件列表
git stash apply ? ? ? ? ? ? ? ? ? ? ? ?: 恢復被隱藏的文件,但是內(nèi)容不刪除
git stash drop ? ? ? ? ? ? ? ? ? ? ? ? : ?刪除文件
git stash pop ? ? ? ? ? ? ? ? ? ? ? ? ?: 恢復文件的同時也刪除文件
git remote ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :查看遠程庫的信息
git remote -v ? ? ? ? ? ? ? ? ? ? ? ? ?:查看遠程庫的詳細信息
git push origin master ? ? ? ? ? :Git會把master分支推送到遠程庫對應的遠程分支
git add . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : 提交修改的所有文件
git tag ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: 顯示 標簽
git tag v1.4-lw ? ? ? ? ? ? ? ? ? ? ? ?: 輕量級標簽
git tag -a v1.4 -m "my version 1.4" ?:附注標簽
git tag -v v1.4.2.1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : 驗證 標簽
git tag -a v1.2 9fceb02 ? ? ? ? ? ? ? ? ? ? : 加注標簽
git push origin v1.5 ? ? ? ??
git push origin --tags ? ? ? ? ? ? ? ? ? ? ? :分享標簽
工作區(qū),倉庫,和暫存區(qū)
什么是工作區(qū)?工作區(qū)就是我們磁盤上的一個工作目錄
什么是倉庫?就是工作區(qū)中的一個隱藏目錄.git(這個隱藏文件),這個不算是工作區(qū)部分,而是Git倉庫.
暫存區(qū)是一個文件,保存了下次將提交的文件列表信息,一般在Git倉庫目錄中.有時候也被稱作"索引",不過一般說法還是叫暫存區(qū)域.
用戶信息配置
git config --global user.name zxy
git config --global user.email 1126200379@qq.com
日志中文顯示
當我們在命令行中使用git status,git log 等輸出的時候.如果操作目錄是中文名稱,就會產(chǎn)生亂碼.可以通過配置支持中文的顯示來正常顯示中文
git config core.quotepath false
日志顏色配置
git config --global color.ui false 表示開啟 跟終端的顏色一樣
git config --global color.ui true 表示關閉 顏色為紅色
檢查配置信息
如果想要檢查你的配置,可以使用git config --list命令,來列出所有Git當前環(huán)境能夠找到的配置信息.
可能會看到重復的變量,因為Git會從不同級別的文件中讀取同一個配置.
可以通過git config <key> : 來檢查Git的某一項的最終配置
創(chuàng)建本地倉庫 ? ? ? ?git init
該命令將創(chuàng)建一個名為.git的子目錄(隱藏目錄,可以用ls -a查看,.git的目錄結構如圖),這個目錄含有初始化的Git倉庫中所有的必須文件,這些文件是Git倉庫的骨干.但是,此時我們僅僅是做了一個初始化的操作,項目的文件還沒有被跟蹤.
添加到暫存區(qū),提交到本地倉庫
這里在 test 目錄下執(zhí)行git init命令,所以該工程下的所有文件可以執(zhí)行版本操作了.可以通過git add 命令來指定文件或所有的文件添加到暫存區(qū),然后執(zhí)行git commit 提交到本地倉庫.
git add . ?
?'.'表示添加當前目錄及及其子目錄的所有修改到暫存區(qū).這種寫法在實際開發(fā)中非常實用,尤其有很多文件要提交的時候,不必 git add ?文件名 ? 這樣逐一地列出來.另一個常用的方式是,遞歸添加符合格式的文件,如 git add \*.docx,如果不帶有'\'僅是當前目錄
git commit -m "備注"
GitHub的SSH公鑰配置
1磷杏、首先需要檢查你電腦是否已經(jīng)有 SSH key
cd ~/.ssh
ls
這兩個命令就是檢查是否已經(jīng)存在 id_rsa.pub 或 id_dsa.pub 文件剑勾,如果文件已經(jīng)存在,那么你可以跳過步驟2黍少,直接進入步驟3蛋欣。如果一切順利的話,可以在用戶主目錄找到~/.ssh目錄,里面有id_rsa 和id_rsa.pub兩個文件.這兩個就是SSK Key的密鑰對,id_rsa是私鑰,不能泄露出去,id_rsa_public是公約,可以放心地告訴任何人.你需要把郵件地址換成自己的郵件地址,然后直接按Enter鍵,使用默認值即可,由于Key并不是用于機密目的,所以不用設置密碼.
2航徙、創(chuàng)建一個 SSH key
ssh-keygen -t rsa -C"your_email@example.com"
代碼參數(shù)含義:
-t 指定密鑰類型,默認是 rsa 陷虎,可以省略到踏。
-C 設置注釋文字,比如郵箱泻红。
-f 指定密鑰文件存儲文件名夭禽。
以上代碼省略了 -f 參數(shù),因此谊路,運行上面那條命令后會讓你輸入一個文件名讹躯,用于保存剛才生成的 SSH key 代碼,如:
Generatingpublic/privatersa key pair.
# Enter fileinwhich to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
當然缠劝,你也可以不輸入文件名潮梯,使用默認文件名(推薦),那么就會生成 id_rsa 和 id_rsa.pub 兩個秘鑰文件惨恭。
接著又會提示你輸入兩次密碼(該密碼是你push文件的時候要輸入的密碼秉馏,而不是github管理者的密碼),
當然脱羡,你也可以不輸入密碼萝究,直接按回車。那么push的時候就不需要輸入密碼锉罐,直接提交到github上了帆竹,如:
Enter passphrase (emptyforno passphrase):
# Enter same passphrase again:
接下來,就會顯示如下代碼提示脓规,如:
Your identification has been savedin/c/Users/you/.ssh/id_rsa.
# Yourpublickey has been savedin/c/Users/you/.ssh/id_rsa.pub.
# The key fingerprintis:
#01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com
當你看到上面這段代碼的收栽连,那就說明,你的 SSH key 已經(jīng)創(chuàng)建成功,你只需要添加到github的SSH key上就可以了秒紧。
3绢陌、添加你的 SSH key 到 github上面去
a、首先你需要拷貝 id_rsa.pub 文件的內(nèi)容熔恢,你可以用編輯器打開文件復制脐湾,也可以用git命令復制該文件的內(nèi)容,如:
cat ~/.ssh/id_rsa.pub
b绩聘、登錄你的github賬號沥割,從又上角的設置(Account Settings)進入,然后點擊菜單欄的 SSH key 進入頁面添加 SSH key凿菩。
c机杜、點擊 Add SSH key 按鈕添加一個 SSH key 。把你復制的 SSH key 代碼粘貼到 key 所對應的輸入框中衅谷,記得 SSH key 代碼的前后不要留有空格或者回車椒拗。當然,上面的 Title 所對應的輸入框你也可以輸入一個該 SSH key 顯示在 github 上的一個別名获黔。默認的會使用你的郵件名稱蚀苛。
關聯(lián)遠程倉庫
上一步的Github的配置是基礎.截止目前,你已經(jīng)在本地倉庫創(chuàng)建了一個Git倉庫,接著需要把本地的倉庫與Github的倉庫關聯(lián).如果這兩個倉庫進行了遠程同步,Github上的倉庫就可以作為本地備份,又可以讓其他人通過該倉庫來協(xié)作,真是一舉多得.
1.創(chuàng)建一個遠程倉庫
2.在Repository name 填入 Swift_Class_3集合,其他保持默認設置,點擊Create repository按鈕,就成功地創(chuàng)建了一個新的Git倉庫.
3.目前在Github上的這個Swift_Class_3集合倉庫是空的.Github告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯(lián),把本地倉庫的內(nèi)容推送到Github倉庫.在工作區(qū)test中執(zhí)行下面的命令,注意地址要正確,地址可以在文本中復制.
git remote add origin https://github.com/RainbowWait/Swift_Class_3-.git?
git config --list //查看所有配置的結果
git push -u origin master ?//第一次使用
git push origin master //后面使用
由于遠程是空的,第一次推送master分支時,加上-u參數(shù).Git不但會把本地master分支內(nèi)容推送到遠程新的master分支上,還會把本地的maser分支和遠程的master分支關聯(lián)起來,以后的推送或者拉取時就可以使用簡化的命令:git push origin master ? ??
查看當前工作區(qū)的文件狀態(tài)
要查看哪些文件處于什么狀態(tài),可以使用git status命令.如果在克隆倉庫后立即使用此命令,會查看到類似這樣的輸出,
在master的分支上,你的分支和服務器上的分支一樣新,工作區(qū)也是干凈的.現(xiàn)在修改一下ViewController.swift文件,再次執(zhí)行git status命令,如圖
說明已跟蹤文件的內(nèi)容發(fā)生了變化,并用紅色標記了正處于修改狀態(tài),但還沒有放到暫存區(qū).要暫存這次更新,需要執(zhí)行git add命令
放到暫存區(qū)后執(zhí)行git status命令,變?yōu)榫G色狀態(tài)
然后在運行提交命令git commit ?-m "注釋內(nèi)容"
再執(zhí)行git status命令,查看結果是沒有可提價的文件
查看提交歷史
在提交了若干更新,或者克隆了某個項目之后,你也許想回顧一下提交的歷史記錄.完成這個任務最簡單而又最有效的工具是git log命令
默認不適用任何參數(shù)的話,git log會按提交的時間列出所有的更新,最近的更新排在最上面.這個命令會列出每個提交的SHA-1校驗,作者的名字,電子郵件,提交時間以及提交說明.
git log 有許多選項可以幫助你搜尋所有要找的提交,一些常用的選項如下所示:
git log -p ? ? ? ?表示按補丁格式顯示每個提交之間的差異
git log -數(shù)字 ? 表示顯示最近幾次提交
git log --stat ?表示顯示每次更新的文件修改統(tǒng)計信息
git log --shortstat 表示只顯示--stat中最后行數(shù)修改添加移除統(tǒng)計
git log --name-only 表示僅在提交信息后顯示已修改的文件清單
git log --abbrev-commit 表示僅顯示SHA-1前幾個字符,而非所有的40個字符
git log --relative-date 表示使用較短的相對時間顯示(比如,"2 week ago")
git log --graph 表示顯示ASCII圖形表示分支合并歷史
git log --pretty 表示使用其他格式顯示歷史提交信息.可用的選項包括oneline,short,full,fuller和format(后跟格式)
git log X-height 基線至非突出的小寫字母(如a,x,e等)最高點的距離
git log Cap height 基線至大寫字母最高點的距離
撤銷操作
1.修正上次的提交
有時候我們提交完了才發(fā)現(xiàn)漏掉了姐文件沒有添加,或者提交信息寫錯了,此時可以運行帶有--amend選項的提交命令,嘗試合并到上一次提交:
git commit -m "修改"
git add 文件
git commit --amend -m "打印測試日志"
最終你只會有一個提交,第二次提交將會合并到第一次提交的結果中,如圖第一次提交為修改,第二次合并了第一次,為打印測試日志
2.撤銷工作區(qū)中的文件修改
git checkout 文件名 //撤銷某個文件
git checkout . ? ? ? ? ?//撤銷修改的全部內(nèi)容
第一次我修改了AppDelegate.swif 和 ViewController.swift這兩個文件,然后我執(zhí)行git checkout .全部指令,查看狀態(tài)git status 沒有可提交的內(nèi)容,撤銷成功
第二次我修改了 ViewController.swift 這個文件,然后執(zhí)行git checkout Swift_Class_3集合/Swift_Class_3集合/ViewController.swift ?git status 查看狀態(tài),沒有可提交的內(nèi)容,撤銷成功
3.撤銷暫存區(qū)中的文件的修改
這里的操作是把暫存區(qū)的修改撤銷到工作區(qū)中,? git reset HEAD 文件名 ?(或者git reset 文件名) ? 來取消暫存.還可以按照上邊的步驟繼續(xù)從工作區(qū)中撤銷 git reset 用來撤銷最后一次的git add files
4.撤銷倉庫區(qū)
撤銷倉庫區(qū)就是git commit 后的操作撤銷到指定的版本,使用(git reset ?版本號) 指令,查看版本號使用git reflog 指令,前面變色的就是版本號
1、git reset命令后面需要加2種參數(shù):"--hard"和"--soft"玷氏,如果不加堵未,默認情況下是"--soft"。
2盏触、--soft表示該條commit號之后(時間作為參考點)的所有commit的修改都會退回到git緩沖區(qū)中渗蟹。所以使用git status命令可以在緩沖區(qū)中看到這些修改。
3赞辩、"--hard"則表示緩沖區(qū)中不會存儲這些修改雌芽,git會直接丟棄這部分內(nèi)容棚蓄,但需要注意的一個問題是:這樣的重置是直接在本地的修改曙博,無法提交到遠程服務器,如果直接丟棄的內(nèi)容已經(jīng)被推到遠程服務器上了昌犹,則會造成本地和服務器無法同步的問題糟需,即git reset --hard只能針對本地操作屉佳,不能針對遠程服務器進行同樣操作。如果從本地刪掉的內(nèi)容沒有推到服務器上洲押,則不會有副作用武花,如果被推到服務器,則下次本地和服務器進行同步時诅诱,這
部分刪掉的內(nèi)容仍然會回來髓堪。
(其實這個問題則可以很好的被git revert 命令解決送朱,使用git revert + commit號娘荡,該命令撤銷對某個commit的提交干旁,這一撤銷動作會作為一個新的修改存儲起來,這樣炮沐,當你和服務器同步時争群,就不會產(chǎn)生什么副作用。)