1. 版本控制
CVS及SVN都是集中式的版本控制系統而Git是分布式版本控制系統。
- 集中式版本控制系統,版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。
- 分布式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫。分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,方便“交換”大家的修改。
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
注意: 當前路徑的git配置-
在終端配置,安裝完成之后需要在終端中配置一下
$git config --global user.name "your name" $git config --global user.email "your email"
注意: git config 命令的--global 參數,使用這個參數表示當前使用的這臺機器上的 git 倉庫都會使用這個配置,當然可以對某個參數指定不同的username 和 email。
每個倉庫的Git配置文件都放在.git/config文件中
cat .git/config 當前倉庫配置
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. 創建版本庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里 面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
1.創建一個目錄 并進入到該目錄下
mkdir test
cd test
2.初始化這個目錄,變成可以管理的倉庫
git init
3.添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反復多次使用,添加多個文件;
git add .
("."表示添加當前目錄下所有的可提交的文件)
第二步,使用命令git commit,完成。
git commit
命令,-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。
4.工作區和暫存區
工作區:電腦里能看到的目錄,比如我的git文件夾。
版本庫(Repository):工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
暫存區:Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)。
git add
把要提交的所有修改添加到暫存區。
git commit
把暫存區的所有內容提交到當前分支。
git status
命令可以讓我們時刻掌握工作區當前的狀態,告訴你有文件被修改過。
git diff
可以查看工作區的修改內容。
5.日志記錄
- 查看提交歷史,以便確定要回退到哪個版本:
git log
命令顯示從最近到最遠的提交日志(當前到最遠的記錄,如重返過去)。
如果輸出的信息太多,可以加上 --pretty=oneline 參數。
顯示的 hash 值太長可以加上 --abbrev-commit 。
需要查看歷史合并記錄 加上 --graph。
git log --abbrev-commit --pretty=oneline --graph
- 查看命令歷史,以便確定要回到未來的哪個版本(重返未來)
Git提供了一個命令用來記錄你的每一次命令:git reflog
6.版本回退穿梭
Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,上一個版本就是HEAD^, 上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
commit id(版本號),和SVN不一樣,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個非常大的數字,用十六進制表示。
7.撤銷修改
- git checkout -- file可以丟棄工作區的修改
一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。 - git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,(分支管理)。
- git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區
用命令git add告訴Git,把文件添加到倉庫: - 沒提交遠程之前,版本回退。
4. 遠程倉庫
- GitHub倉庫(免費托管的Git倉庫,任何人都可以看)
1.本地Git倉庫和GitHub倉庫之間的傳輸是可以通過SSH加密的。
2.Https
第1步:創建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服務器
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 支線
-
推:
關聯后,把本地庫的內容推送到遠程,使用命令git push -u origin master第一次推送master分支的所有內容到遠程;由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。
拉:
默認情況下 git pull 只會抓取遠程最新的代碼,并不會合并到當前分支。
我們希望每次 git pull如果有最新的希望直接幫我們合并到當前的分支,打開配置文件, vi .git/config 最后面添加branch "master"
remote = origin
merge = refs/heads/master
也可添加其他分支,但是即使添加多個分支,git 只會幫我們合并當前分支,其他分支需要手動合并git merge origin/develop
從遠程克隆
git clone git@github.com: JinXiangHuang/xxx.git
示例1:先創建遠程庫,然后,從遠程庫克隆。
1.git clone git@github.com:JinXiangHuang/someFiles.git
2.add commit ...
3.命令git push -u origin master第一次推送master分支的所有內容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
示例2:先有本地庫(是否有README.md),后有遠程庫的時候,如何關聯遠程庫。
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. 創建與合并分支
git checkout命令加上-b參數git checkout -b dev
表示創建并切換,相當于以下兩條命令:
創建:git branch dev
切換:git checkout dev
查看分支:git branch
,列出所有分支,當前分支前面會標一個*號
把dev分支的工作成果合并到master分支上:
合并指定分支到當前分支: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也可以告訴我們沖突的文件。
用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
切換分支,分支提交,切換主支主支提交后,存在沖突。
當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。
分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
git log --pretty=oneline --abbrev-commit
通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。 如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
合并分支時,加上--no-ff參數就可以用普通模式合并表示禁用Fast forward,合并后的歷史有分支,能看出來曾經做過合并,而fast forward合并就看不出來曾經做過合并。
Bug分支:
修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,回到工作現場。
git stash
,把當前工作區“儲藏”起來。
git stash list
多次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash
git stash apply
恢復一恢復后,stash內容并不刪除,你需要用git stash drop
來刪除;
git stash pop
恢復的同時把stash內容也刪了.
git push origin dev
git push origin xxx
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
bug分支只用于在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
feature分支是否推到遠程,取決于你是否和你的小伙伴合作在上面開發。
7. 標簽
git tag v2
切換到需要打標簽的分支上,git tag xxx就可以打一個新標簽.默認標簽是打在最新提交的commit上的。
git tag -a v0.1 -m "version 0.1 released" 3628164
創建帶有說明的標簽,用-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>
可以刪除一個遠程標簽。
相關
顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
不顯示隱藏文件 defaults write com.apple.finder AppleShowAllFiles No && killall Finder
建議用命令復制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 創建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按鈕,點擊之后會出現一個下拉框,問你是否要設置倉庫的忽略文件。這個看你自己的需要,通常如果你的倉庫和代碼項目有關系,那么最好選擇相應的忽略文件(如OC項目可以選擇Object-C,swift項目可以選擇Swift),至于為什么請參考GIT的基本使用。
Add a license按鈕,點擊之后會出現一個下拉框,需要你選擇一種開源協議,開源協議有很多種用的比較多的有MIT的或者是Apache的,不同的開源協議對項目的使用方式等有不同的規定,詳情可以參考Choose an open source license。
廖雪峰的官方網站
Git官網
Git權威指南電子版下載地址
https://git-scm.com/book/zh/v2