1. 版本控制
CVS及SVN都是集中式的版本控制系統(tǒng)而Git是分布式版本控制系統(tǒng)瘪匿。
- 集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的,而干活的時候蛤育,用的都是自己的電腦,所以要先從中央服務(wù)器取得最新的版本葫松,然后開始干活瓦糕,干完活了,再把自己的活推送給中央服務(wù)器进宝。
- 分布式版本控制系統(tǒng)根本沒有“中央服務(wù)器”刻坊,每個人的電腦上都是一個完整的版本庫。分布式版本控制系統(tǒng)通常也有一臺充當(dāng)“中央服務(wù)器”的電腦党晋,方便“交換”大家的修改谭胚。
2. 安裝Git
在Mac OS X上安裝Git,有兩種安裝Git的方法徐块。
- 安裝homebrew,然后通過homebrew安裝Git灾而,具體方法請參考homebrew的文檔:http://brew.sh/胡控。
- 直接從AppStore安裝Xcode,Xcode集成了Git旁趟,不過默認沒有安裝昼激,你需要運行Xcode,選擇菜單“Xcode”->“Preferences”锡搜,在彈出窗口中找到“Downloads”橙困,選擇“Command Line Tools”,點“Install”就可以完成安裝了耕餐。安裝了 XCode 集成了 git, 就可以直接在終端使用凡傅。
git版本
git --version
git version 2.11.0 (Apple Git-81)配置列表:
git config --list
注意: 當(dāng)前路徑的git配置-
在終端配置,安裝完成之后需要在終端中配置一下
$git config --global user.name "your name" $git config --global user.email "your email"
注意: git config 命令的--global 參數(shù),使用這個參數(shù)表示當(dāng)前使用的這臺機器上的 git 倉庫都會使用這個配置,當(dāng)然可以對某個參數(shù)指定不同的username 和 email。
每個倉庫的Git配置文件都放在.git/config文件中
cat .git/config 當(dāng)前倉庫配置
cat .gitconfig 主目錄下 用戶配置
git config --global alias.st status
配置別名(刪除肠缔,進入配置文件刪除)
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
3. 創(chuàng)建版本庫
版本庫又名倉庫夏跷,英文名repository,你可以簡單理解成一個目錄明未,這個目錄里 面的所有文件都可以被Git管理起來槽华,每個文件的修改、刪除趟妥,Git都能跟蹤猫态,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”披摄。
1.創(chuàng)建一個目錄 并進入到該目錄下
mkdir test
cd test
2.初始化這個目錄,變成可以管理的倉庫
git init
3.添加文件到Git倉庫懂鸵,分兩步:
第一步,使用命令git add <file>行疏,注意,可反復(fù)多次使用套像,添加多個文件酿联;
git add .
("."表示添加當(dāng)前目錄下所有的可提交的文件)
第二步,使用命令git commit夺巩,完成贞让。
git commit
命令,-m后面輸入的是本次提交的說明柳譬,可以輸入任意內(nèi)容喳张,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄美澳。
4.工作區(qū)和暫存區(qū)
工作區(qū):電腦里能看到的目錄销部,比如我的git文件夾摸航。
版本庫(Repository):工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū)舅桩,而是Git的版本庫酱虎。
暫存區(qū):Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)擂涛。
git add
把要提交的所有修改添加到暫存區(qū)读串。
git commit
把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
git status
命令可以讓我們時刻掌握工作區(qū)當(dāng)前的狀態(tài),告訴你有文件被修改過撒妈。
git diff
可以查看工作區(qū)的修改內(nèi)容恢暖。
5.日志記錄
- 查看提交歷史,以便確定要回退到哪個版本:
git log
命令顯示從最近到最遠的提交日志(當(dāng)前到最遠的記錄狰右,如重返過去)杰捂。
如果輸出的信息太多,可以加上 --pretty=oneline 參數(shù)。
顯示的 hash 值太長可以加上 --abbrev-commit 挟阻。
需要查看歷史合并記錄 加上 --graph琼娘。
git log --abbrev-commit --pretty=oneline --graph
- 查看命令歷史,以便確定要回到未來的哪個版本(重返未來)
Git提供了一個命令用來記錄你的每一次命令:git reflog
6.版本回退穿梭
Git必須知道當(dāng)前版本是哪個版本附鸽,在Git中脱拼,用HEAD表示當(dāng)前版本,上一個版本就是HEAD^, 上上一個版本就是HEAD^^,當(dāng)然往上100個版本寫100個^比較容易數(shù)不過來,所以寫成HEAD~100坷备。
Git允許我們在版本的歷史之間穿梭熄浓,使用命令git reset --hard commit_id
commit id(版本號),和SVN不一樣省撑,Git的commit id不是1赌蔑,2,3……遞增的數(shù)字竟秫,而是一個SHA1計算出來的一個非常大的數(shù)字娃惯,用十六進制表示。
7.撤銷修改
- git checkout -- file可以丟棄工作區(qū)的修改
一種是readme.txt自修改后還沒有被放到暫存區(qū)肥败,現(xiàn)在趾浅,撤銷修改就回到和版本庫一模一樣的狀態(tài);
一種是readme.txt已經(jīng)添加到暫存區(qū)后馒稍,又作了修改皿哨,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)纽谒。 - git checkout -- file命令中的--很重要证膨,沒有--,就變成了“切換到另一個分支”的命令鼓黔,(分支管理)央勒。
- git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage)不见,重新放回工作區(qū)
用命令git add告訴Git,把文件添加到倉庫: - 沒提交遠程之前订歪,版本回退脖祈。
4. 遠程倉庫
- GitHub倉庫(免費托管的Git倉庫,任何人都可以看)
1.本地Git倉庫和GitHub倉庫之間的傳輸是可以通過SSH加密的刷晋。
2.Https
第1步:創(chuàng)建SSH Key盖高。ssh-keygen -t rsa -C "youremail@example.com"
順利的話,可以在用戶主目錄里找到.ssh目錄眼虱,里面有id_rsa和id_rsa.pub兩個文件喻奥,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰捏悬,不能泄露出去撞蚕,id_rsa.pub是公鑰,可以放心地告訴任何人过牙。
第2步: 對接GitHub甥厦。 - Team Foundation Server(tfs)
本地Git倉庫和tfs倉庫之間的傳輸也是可以通過SSH加密的。 - 自己搭Git服務(wù)器
5. 添加遠程倉庫
在本地的xxx倉庫下運行命令:
https:
git remote add origin2 https://github.com/JinXiangHuang/xxx.git
SSH密鑰對(速度最快):
git remote add origin git@github.com:JinXiangHuang/xxx.git
branch.master.remote=origin 遠程倉庫名
branch.master.merge=refs/heads/master 支線
-
推:
關(guān)聯(lián)后寇钉,把本地庫的內(nèi)容推送到遠程刀疙,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容到遠程;由于遠程庫是空的扫倡,我們第一次推送master分支時谦秧,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支撵溃,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來疚鲤,在以后的推送或者拉取時就可以簡化命令。
此后缘挑,每次本地提交后集歇,只要有必要,就可以使用命令git push origin master推送最新修改语淘。
拉:
默認情況下 git pull 只會抓取遠程最新的代碼,并不會合并到當(dāng)前分支鬼悠。
我們希望每次 git pull如果有最新的希望直接幫我們合并到當(dāng)前的分支,打開配置文件, vi .git/config 最后面添加branch "master"
remote = origin
merge = refs/heads/master
也可添加其他分支,但是即使添加多個分支,git 只會幫我們合并當(dāng)前分支,其他分支需要手動合并git merge origin/develop
從遠程克隆
git clone git@github.com: JinXiangHuang/xxx.git
示例1:先創(chuàng)建遠程庫,然后亏娜,從遠程庫克隆。
1.git clone git@github.com:JinXiangHuang/someFiles.git
2.add commit ...
3.命令git push -u origin master第一次推送master分支的所有內(nèi)容蹬挺;此后维贺,每次本地提交后,只要有必要巴帮,就可以使用命令git push origin master推送最新修改溯泣;
示例2:先有本地庫(是否有README.md)虐秋,后有遠程庫的時候,如何關(guān)聯(lián)遠程庫垃沦。
error: failed to push some refs to 'git@github.com:JinXiangHuang/someFiles.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
需要echo客给,add README.md
echo "# someFiles" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/JinXiangHuang/someFiles.git
git push -u origin master
6. 創(chuàng)建與合并分支
git checkout命令加上-b參數(shù)git checkout -b dev
表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:
創(chuàng)建:git branch dev
切換:git checkout dev
查看分支:git branch
,列出所有分支肢簿,當(dāng)前分支前面會標一個*號
把dev分支的工作成果合并到master分支上:
合并指定分支到當(dāng)前分支:git merge dev
刪除dev分支:git branch -d dev
強行刪除:git branch -D <name>
重命名分支:git branch -m dev develop2
刪除遠程分支:git push origin --delete develop2
解決沖突:Automatic merge failed; fix conflicts and then commit the result.!!!!!
Git告訴我們,xxx文件存在沖突,必須手動解決沖突后再提交掐场。git status也可以告訴我們沖突的文件飞苇。
用<<<<<<<,=======收夸,>>>>>>>標記出不同分支的內(nèi)容
切換分支坑匠,分支提交,切換主支主支提交后卧惜,存在沖突厘灼。
當(dāng)Git無法自動合并分支時,就必須首先解決沖突咽瓷。解決沖突后设凹,再提交,合并完成忱详。
分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
git log --pretty=oneline --abbrev-commit
通常围来,合并分支時,如果可能匈睁,Git會用Fast forward模式监透,但這種模式下,刪除分支后航唆,會丟掉分支信息胀蛮。 如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit糯钙,這樣粪狼,從分支歷史上就可以看出分支信息。
合并分支時任岸,加上--no-ff參數(shù)就可以用普通模式合并表示禁用Fast forward再榄,合并后的歷史有分支,能看出來曾經(jīng)做過合并享潜,而fast forward合并就看不出來曾經(jīng)做過合并困鸥。
Bug分支:
修復(fù)bug時,我們會通過創(chuàng)建新的bug分支進行修復(fù)剑按,然后合并疾就,最后刪除澜术;
當(dāng)手頭工作沒有完成時,先把工作現(xiàn)場git stash一下猬腰,然后去修復(fù)bug鸟废,修復(fù)后,再git stash pop姑荷,回到工作現(xiàn)場盒延。
git stash
,把當(dāng)前工作區(qū)“儲藏”起來。
git stash list
多次stash厢拭,恢復(fù)的時候兰英,先用git stash list查看,然后恢復(fù)指定的stash
git stash apply
恢復(fù)一恢復(fù)后供鸠,stash內(nèi)容并不刪除畦贸,你需要用git stash drop
來刪除;
git stash pop
恢復(fù)的同時把stash內(nèi)容也刪了.
git push origin dev
git push origin xxx
master分支是主分支楞捂,因此要時刻與遠程同步薄坏;
dev分支是開發(fā)分支,團隊所有成員都需要在上面工作寨闹,所以也需要與遠程同步胶坠;
bug分支只用于在本地修復(fù)bug,就沒必要推到遠程了繁堡,除非老板要看看你每周到底修復(fù)了幾個bug沈善;
feature分支是否推到遠程,取決于你是否和你的小伙伴合作在上面開發(fā)椭蹄。
7. 標簽
git tag v2
切換到需要打標簽的分支上,git tag xxx就可以打一個新標簽.默認標簽是打在最新提交的commit上的闻牡。
git tag -a v0.1 -m "version 0.1 released" 3628164
創(chuàng)建帶有說明的標簽,用-a指定標簽名绳矩,-m指定說明文字罩润。
git tag
查看所有標簽.
git show v2
查看標簽信息。
git push origin <tagname>
可以推送一個本地標簽翼馆;
git push origin --tags
可以推送全部未推送過的本地標簽割以;
git tag -d <tagname>
可以刪除一個本地標簽;
git push origin :refs/tags/<tagname>
可以刪除一個遠程標簽应媚。
相關(guān)
顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
不顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles No && killall Finder
建議用命令復(fù)制ssh key,用文本軟件打開有可能出錯!
mac
pbcopy < ~/.ssh/id_rsa.pub
windows
clip < ~/.ssh/id_rsa.pub
linux
sudo apt-get install xclip
xclip -sel clip < ~/.ssh/id_rsa.pub
No such file or directory 創(chuàng)建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
用戶主目錄里找到.ssh目錄严沥,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對中姜,id_rsa是私鑰消玄,不能泄露出去,id_rsa.pub是公鑰
如何把項目托管到GitHub
在github上面建立空的倉庫(repositories)
Initialize this repository with a README 表示在初始化倉庫的時候,是否生成一個readMe文件莱找。我們在查看別人框架的時候,在框架主頁上會有對該框架版本信息嗜桌,作用使用方法等等的介紹奥溺,這個文件就是readMe文件,在這里選擇勾上骨宠。
Add .gitignore按鈕浮定,點擊之后會出現(xiàn)一個下拉框,問你是否要設(shè)置倉庫的忽略文件层亿。這個看你自己的需要桦卒,通常如果你的倉庫和代碼項目有關(guān)系,那么最好選擇相應(yīng)的忽略文件(如OC項目可以選擇Object-C,swift項目可以選擇Swift)匿又,至于為什么請參考GIT的基本使用方灾。
Add a license按鈕,點擊之后會出現(xiàn)一個下拉框碌更,需要你選擇一種開源協(xié)議裕偿,開源協(xié)議有很多種用的比較多的有MIT的或者是Apache的,不同的開源協(xié)議對項目的使用方式等有不同的規(guī)定痛单,詳情可以參考Choose an open source license嘿棘。
廖雪峰的官方網(wǎng)站
Git官網(wǎng)
Git權(quán)威指南電子版下載地址
https://git-scm.com/book/zh/v2