1. 版本控制
CVS及SVN都是集中式的版本控制系統(tǒng)而Git是分布式版本控制系統(tǒng)。
- 集中式版本控制系統(tǒng),版本庫(kù)是集中存放在中央服務(wù)器的,而干活的時(shí)候,用的都是自己的電腦,所以要先從中央服務(wù)器取得最新的版本,然后開(kāi)始干活,干完活了,再把自己的活推送給中央服務(wù)器。
- 分布式版本控制系統(tǒng)根本沒(méi)有“中央服務(wù)器”,每個(gè)人的電腦上都是一個(gè)完整的版本庫(kù)。分布式版本控制系統(tǒng)通常也有一臺(tái)充當(dāng)“中央服務(wù)器”的電腦,方便“交換”大家的修改。
2. 安裝Git
在Mac OS X上安裝Git,有兩種安裝Git的方法。
- 安裝homebrew,然后通過(guò)homebrew安裝Git,具體方法請(qǐng)參考homebrew的文檔:http://brew.sh/。
- 直接從AppStore安裝Xcode,Xcode集成了Git,不過(guò)默認(rèn)沒(méi)有安裝,你需要運(yùn)行Xcode,選擇菜單“Xcode”->“Preferences”,在彈出窗口中找到“Downloads”,選擇“Command Line Tools”,點(diǎn)“Install”就可以完成安裝了。安裝了 XCode 集成了 git, 就可以直接在終端使用。
git版本
git --versiongit 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ù),使用這個(gè)參數(shù)表示當(dāng)前使用的這臺(tái)機(jī)器上的 git 倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然可以對(duì)某個(gè)參數(shù)指定不同的username 和 email。
每個(gè)倉(cāng)庫(kù)的Git配置文件都放在.git/config文件中
cat .git/config 當(dāng)前倉(cāng)庫(kù)配置
cat .gitconfig 主目錄下 用戶配置
git config --global alias.st status 配置別名(刪除,進(jìn)入配置文件刪除)
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)建版本庫(kù)
版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里 面的所有文件都可以被Git管理起來(lái),每個(gè)文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來(lái)某個(gè)時(shí)刻可以“還原”。
1.創(chuàng)建一個(gè)目錄 并進(jìn)入到該目錄下
mkdir test
cd test
2.初始化這個(gè)目錄,變成可以管理的倉(cāng)庫(kù)
git init
3.添加文件到Git倉(cāng)庫(kù),分兩步:
第一步,使用命令git add <file>,注意,可反復(fù)多次使用,添加多個(gè)文件;
git add . ("."表示添加當(dāng)前目錄下所有的可提交的文件)
第二步,使用命令git commit,完成。
git commit命令,-m后面輸入的是本次提交的說(shuō)明,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。
4.工作區(qū)和暫存區(qū)
工作區(qū):電腦里能看到的目錄,比如我的git文件夾。
版本庫(kù)(Repository):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。
暫存區(qū):Git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)。
git add把要提交的所有修改添加到暫存區(qū)。
git commit把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
git status命令可以讓我們時(shí)刻掌握工作區(qū)當(dāng)前的狀態(tài),告訴你有文件被修改過(guò)。
git diff可以查看工作區(qū)的修改內(nèi)容。
5.日志記錄
- 查看提交歷史,以便確定要回退到哪個(gè)版本:
git log命令顯示從最近到最遠(yuǎn)的提交日志(當(dāng)前到最遠(yuǎn)的記錄,如重返過(guò)去)。
如果輸出的信息太多,可以加上 --pretty=oneline 參數(shù)。
顯示的 hash 值太長(zhǎng)可以加上 --abbrev-commit 。
需要查看歷史合并記錄 加上 --graph。
git log --abbrev-commit --pretty=oneline --graph - 查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本(重返未來(lái))
Git提供了一個(gè)命令用來(lái)記錄你的每一次命令:git reflog
6.版本回退穿梭
Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,上一個(gè)版本就是HEAD^, 上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫成HEAD~100。
Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id
commit id(版本號(hào)),和SVN不一樣,Git的commit id不是1,2,3……遞增的數(shù)字,而是一個(gè)SHA1計(jì)算出來(lái)的一個(gè)非常大的數(shù)字,用十六進(jìn)制表示。
7.撤銷修改
- git checkout -- file可以丟棄工作區(qū)的修改
一種是readme.txt自修改后還沒(méi)有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài);
一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。 - git checkout -- file命令中的--很重要,沒(méi)有--,就變成了“切換到另一個(gè)分支”的命令,(分支管理)。
- git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)
用命令git add告訴Git,把文件添加到倉(cāng)庫(kù): - 沒(méi)提交遠(yuǎn)程之前,版本回退。
4. 遠(yuǎn)程倉(cāng)庫(kù)
- GitHub倉(cāng)庫(kù)(免費(fèi)托管的Git倉(cāng)庫(kù),任何人都可以看)
1.本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是可以通過(guò)SSH加密的。
2.Https
第1步:創(chuàng)建SSH Key。ssh-keygen -t rsa -C "youremail@example.com"
順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第2步: 對(duì)接GitHub。 - Team Foundation Server(tfs)
本地Git倉(cāng)庫(kù)和tfs倉(cāng)庫(kù)之間的傳輸也是可以通過(guò)SSH加密的。 - 自己搭Git服務(wù)器
5. 添加遠(yuǎn)程倉(cāng)庫(kù)
在本地的xxx倉(cāng)庫(kù)下運(yùn)行命令:
https:
git remote add origin2 https://github.com/JinXiangHuang/xxx.git
SSH密鑰對(duì)(速度最快):
git remote add origin git@github.com:JinXiangHuang/xxx.git
branch.master.remote=origin 遠(yuǎn)程倉(cāng)庫(kù)名
branch.master.merge=refs/heads/master 支線
-
推:
關(guān)聯(lián)后,把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容到遠(yuǎn)程;由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。
拉:
默認(rèn)情況下 git pull 只會(huì)抓取遠(yuǎn)程最新的代碼,并不會(huì)合并到當(dāng)前分支。
我們希望每次 git pull如果有最新的希望直接幫我們合并到當(dāng)前的分支,打開(kāi)配置文件, vi .git/config 最后面添加branch "master"
remote = origin
merge = refs/heads/master
也可添加其他分支,但是即使添加多個(gè)分支,git 只會(huì)幫我們合并當(dāng)前分支,其他分支需要手動(dòng)合并git merge origin/develop從遠(yuǎn)程克隆
git clone git@github.com: JinXiangHuang/xxx.git
示例1:先創(chuàng)建遠(yuǎn)程庫(kù),然后,從遠(yuǎn)程庫(kù)克隆。
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:先有本地庫(kù)(是否有README.md),后有遠(yuǎn)程庫(kù)的時(shí)候,如何關(guān)聯(lián)遠(yuǎn)程庫(kù)。
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)前分支前面會(huì)標(biāo)一個(gè)*號(hào)
把dev分支的工作成果合并到master分支上:
合并指定分支到當(dāng)前分支:git merge dev
刪除dev分支:git branch -d dev
強(qiáng)行刪除:git branch -D <name>
重命名分支:git branch -m dev develop2
刪除遠(yuǎn)程分支:git push origin --delete develop2
解決沖突:Automatic merge failed; fix conflicts and then commit the result.!!!!!
Git告訴我們,xxx文件存在沖突,必須手動(dòng)解決沖突后再提交。git status也可以告訴我們沖突的文件。
用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容
切換分支,分支提交,切換主支主支提交后,存在沖突。
當(dāng)Git無(wú)法自動(dòng)合并分支時(shí),就必須首先解決沖突。解決沖突后,再提交,合并完成。
分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
git log --pretty=oneline --abbrev-commit
通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。 如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。
合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并表示禁用Fast forward,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并。
Bug分支:
修復(fù)bug時(shí),我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場(chǎng)。
git stash,把當(dāng)前工作區(qū)“儲(chǔ)藏”起來(lái)。
git stash list多次stash,恢復(fù)的時(shí)候,先用git stash list查看,然后恢復(fù)指定的stash
git stash apply恢復(fù)一恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來(lái)刪除;
git stash pop恢復(fù)的同時(shí)把stash內(nèi)容也刪了.
git push origin dev git push origin xxx
master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步;
dev分支是開(kāi)發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步;
bug分支只用于在本地修復(fù)bug,就沒(méi)必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;
feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開(kāi)發(fā)。
7. 標(biāo)簽
git tag v2切換到需要打標(biāo)簽的分支上,git tag xxx就可以打一個(gè)新標(biāo)簽.默認(rèn)標(biāo)簽是打在最新提交的commit上的。
git tag -a v0.1 -m "version 0.1 released" 3628164創(chuàng)建帶有說(shuō)明的標(biāo)簽,用-a指定標(biāo)簽名,-m指定說(shuō)明文字。
git tag查看所有標(biāo)簽.
git show v2查看標(biāo)簽信息。
git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽;
git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽;
git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。
相關(guān)
顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
不顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles No && killall Finder
建議用命令復(fù)制ssh key,用文本軟件打開(kāi)有可能出錯(cuò)!
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兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰
如何把項(xiàng)目托管到GitHub
在github上面建立空的倉(cāng)庫(kù)(repositories)
Initialize this repository with a README 表示在初始化倉(cāng)庫(kù)的時(shí)候,是否生成一個(gè)readMe文件。我們?cè)诓榭磩e人框架的時(shí)候,在框架主頁(yè)上會(huì)有對(duì)該框架版本信息,作用使用方法等等的介紹,這個(gè)文件就是readMe文件,在這里選擇勾上。
Add .gitignore按鈕,點(diǎn)擊之后會(huì)出現(xiàn)一個(gè)下拉框,問(wèn)你是否要設(shè)置倉(cāng)庫(kù)的忽略文件。這個(gè)看你自己的需要,通常如果你的倉(cāng)庫(kù)和代碼項(xiàng)目有關(guān)系,那么最好選擇相應(yīng)的忽略文件(如OC項(xiàng)目可以選擇Object-C,swift項(xiàng)目可以選擇Swift),至于為什么請(qǐng)參考GIT的基本使用。
Add a license按鈕,點(diǎn)擊之后會(huì)出現(xiàn)一個(gè)下拉框,需要你選擇一種開(kāi)源協(xié)議,開(kāi)源協(xié)議有很多種用的比較多的有MIT的或者是Apache的,不同的開(kāi)源協(xié)議對(duì)項(xiàng)目的使用方式等有不同的規(guī)定,詳情可以參考Choose an open source license。
廖雪峰的官方網(wǎng)站
Git官網(wǎng)
Git權(quán)威指南電子版下載地址
https://git-scm.com/book/zh/v2