git & github 菜鳥筆記
1、概念:
最先進的分散式版本控制系統
檔案修改該提交的內容:---版本 檔名 使用者 說明 日期
GitHub網站上線了,它為開源專案免費提供Git儲存
--CVS及SVN都是集中式的版本控制系統,而Git是分散式版本控制系統
集中:程式碼在中央伺服器上,獲取最新,編輯,上傳;網際網路網速可能慢;
分佈:沒有“中央伺服器”,每人有完整的版本庫,有一臺充當“中央伺服器”的電腦,作用僅僅是用來“交換”修改。
2、安裝:
Linux上安裝Git
測試:$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
直接通過原始碼安裝。先從Git官網下載原始碼,然後解壓,依次輸入:./config,make,sudo make install這幾個命令安裝就好了。
Windows上使用Git,可以從Git官網直接下載安裝程式,(網速慢的同學請移步國內映象)
安裝完成後,在開始選單裡找到“Git”->“Git Bash”;
安裝完成後,還需要最後一步設定,在命令列輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
3、版本庫
倉庫,repository;簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
mkdir mygit 建立目錄;
pwd 顯示當前目錄;
git init命令把這個目錄變成Git可以管理的倉庫
--目錄預設是隱藏的,用ls -ah命令就可以看見。
把檔案新增到版本庫
--只能跟蹤文字檔案的改動 (Word格式是二進位制格式)
檔案放在倉庫目錄或子目錄下,
$ git add readme.txt 把檔案新增到倉庫
$ git commit -m "wrote a readme file" 把檔案提交到倉庫
-- -m後面輸入的是本次提交的說明,從歷史記錄裡方便地找到改動記錄。
-- 1 file changed:1個檔案被改動(我們新新增的readme.txt檔案);2 insertions:插入了兩行內容(readme.txt有兩行內容)。
可以add多個檔案,一次commit;
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
4、修改 回退
git status命令可以讓我們時刻掌握倉庫當前的狀態
git diff 看看具體修改了什麼內容 ,檢視difference
快照在Git中被稱為commit;
git log 歷史記錄
--pretty=oneline引數:
commit id(版本號)
HEAD表示當前版本
HEAD^,上上一個版本就是HEAD^^ ,HEAD~100;
$ git reset --hard HEAD^ 退回上個版本
cat 檢視;
$ git reset --hard 1094a 指定回到特定 id 的某個版本;
Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指標,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL:改為指向add distributed:
git reflog用來記錄你的每一次命令;
5、工作區、暫存區
工作區(Working Directory)
版本庫(Repository) 工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
Untracked files:從來沒有被新增過
6、管理修改
Git比其他版本控制系統設計得優秀,因為Git跟蹤並管理的是修改,而非檔案。
1.git diff commit_id_1 commit_id_2
用來比較2個commit之間區別
2.git diff
檢查的是工作區與暫存區的差異【沒add之前】
3.git diff --staged
暫存與倉庫的差異【add之後,commit之前】
4 git diff HEAD 工作區 與 版本庫
-----------------------版本庫--------------------------------------------
| |
git diff --cached |
| |
-------------暫存區---------------------- git diff HEAD
| |
git diff |
| |
-----工作區--------------------------------------------------------------
7、撤銷修改
git checkout -- file可以丟棄工作區的修改:
一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit或git add時的狀態。
git reset HEAD <file>可以把暫存區的修改撤銷掉(unstage),重新放回工作區:
8、刪除檔案
rm命令刪本地,
git add/rm 把本地的刪除 放到快取區;
git commit -m "..." 執行快取區內容;
--git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
9、遠端倉庫
GitHub,提供Git倉庫託管服務,本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的。
第1步:建立SSH Key; 開啟Shell(Windows下開啟Git Bash),
$ ssh-keygen -t rsa -C "[email protected]"
在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案;
第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容:
GitHub允許你新增多個Key。免費託管的Git倉庫,任何人都可以看到;
新增遠端庫
本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,並且讓這兩個倉庫進行遠端同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作,。
找到“Create a new repo”按鈕,建立一個新的倉庫:
接著有3種選擇: 1新建本地庫,關聯到github, 2已有本地庫關聯,3從別人那關聯
關聯一個遠端庫: git remote add origin https://github.com/oscarDacude/xx.git
推送master分支: git push -u origin master
由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
提示出錯資訊:fatal: remote origin already exists.
--刪除 $ git remote rm origin
克隆 $ git clone https://github.com/oscarDacude/hellogit.git
GitHub給出的地址不止一個,還可以用https://github.com/michaelliao/gitskills.git這樣的地址。實際上,Git支援多種協議,預設的git://使用ssh,但也可以使用https等其他協議。
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http埠的公司內部就無法使用ssh協議而只能用https。
10、分支管理
你建立了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工作。
Git鼓勵大量使用分支:
檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。
主分支,即master,HEAD嚴格來說不是指向提交,而是指向master,HEAD指向的就是當前分支。
建立新的分支,例如dev時,Git新建了一個指標叫dev,
刪除dev分支就是把dev指標給刪掉,
--Fast-forward資訊,這次合併是“快進模式”