廖雪峰Git教程學習記錄。
0、常用指令總結:
pwd
指令用于顯示目前目錄
git init
指令把這個目錄(自己建的檔案夾)變成Git可以管理的倉庫(必須切換到目前檔案夾下面執行這個指令)
ls -ah 或者 ls -a
指令可以看見預設隐藏的目錄(比如git init之後有個.git目錄,如果看不到,就可以執行這個指令,可能.git目錄是隐藏狀态)
cat readme.txt //在指令行中打開readme.txt檔案,隻是檢視,不能修改
vi readme.txt
1、檢視電腦是否安裝git
直接在指令行輸入git,然後回車。如下圖(Mac系統部分截圖):
2、在Mac OS X上安裝Git
如果你正在使用Mac做開發,有兩種安裝Git的方法。
一是安裝homebrew,然後通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode內建了Git,不過預設沒有安裝,你需要運作Xcode,選擇菜單“Xcode”->“Preferences”,在彈出視窗中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了。
Xcode是Apple官方IDE,功能非常強大,是開發Mac和iOS App的必選裝備,而且是免費的!
備注:我自己在Mac上安裝時下載下傳的git安裝軟體。
3、在Windows上安裝Git
在Windows上使用Git,可以從Git官網直接下載下傳安裝程式,(網速慢的同學請移步國内鏡像),然後按預設選項安裝即可。
安裝完成後,在開始菜單裡找到“Git”->“Git Bash”,蹦出一個類似指令行視窗的東西,就說明Git安裝成功
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
因為Git是分布式版本控制系統,是以,每個機器都必須自報家門:你的名字和Email位址。你也許會擔心,如果有人故意冒充别人怎麼辦?這個不必擔心,首先我們相信大家都是善良無知的群衆,其次,真的有冒充的也是有辦法可查的。
注意
git config
指令的
--global
參數,用了這個參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名和Email位址。
4、建議用UTF-8編碼
Microsoft的Word格式是二進制格式,是以,版本控制系統是沒法跟蹤Word檔案的改動的,如果要真正使用版本控制系統,就要以純文字方式編寫檔案。
因為文本是有編碼的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒有曆史遺留問題,強烈建議使用标準的UTF-8編碼,所有語言使用同一種編碼,既沒有沖突,又被所有平台所支援。
5、初始化git倉庫 和 添加檔案
初始化一個Git倉庫,使用
git init
指令。(注意要在我們建的檔案夾下面,把目錄變為Git可以管理的倉庫)
添加檔案到Git倉庫,分兩步:
1. 使用指令
git add <fil
e>
,注意,可反複多次使用,添加多個檔案;
2.使用指令
git commit -m <message>
,完成。
6、檢視送出曆史記錄
git log
指令可以告訴我們曆史記錄
git log --pretty=oneline 指令檢視簡潔的送出曆史記錄
7、回退到某個版本 和 回到未來的版本
git reset --hard HEAD^ //回退到上一個版本
cat <fileName> //檢視檔案内容,即檢視是否回退到了檔案的上個版本
git log //檢視現在版本庫的狀态,此指令可以幫我們确定要回退到哪個版本
git reflog //
用來記錄你的每一次送出的指令曆史,以便确定要回到未來的哪個版本
8、.git目錄檔案是什麼
我們檔案夾裡面的代碼部分算是工作區。
.git檔案的目錄不算是工作區,而是Git的版本庫。
9、撤銷修改
如果修改的檔案在工作區,還沒放到暫存區:
git checkout -- readme.txt //丢棄工作區的修改
如果修改的檔案在暫存區:
git reset HEAD readme.txt //把暫存區的修改撤銷掉
git status //檢視一下,暫存區沒有修改了,本地工作區有修改
git checkout -- readme.txt //繼續撤銷工作區修改(然後 git status 檢視)
10、删除檔案
rm test.txt //删除工作區的檔案(檔案如果沒有做commit送出,隻在工作區,用此指令删除即可)
git status //檢視下狀态,如果版本倉庫裡面有的話,删除了本地的,倉庫裡面還存在。
git rm test.txt //工作區檔案删除,但是版本庫裡面還有,就用此指令删除。
git commit -m "remove test.txt" //删除版本倉庫以後,再做個送出。
11、添加遠端庫
登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,建立一個新的倉庫。
在Repository name填入
learngit
,其他保持預設設定,點選“Create repository”按鈕,就成功地建立了一個新的Git倉庫:
git remote add origin git@server-name:path/repo-name.git //關聯一個遠端庫(注意server-name為自己的github賬戶名)
git push -u origin master //關聯後,第一次推送master分支所有内容
git push origin master //第一次推送後,以後的每次本地送出後,可以用此指令推送最新修改
備注:由于遠端庫是空的,我們第一次推送
master
分支時,加上了
-u
參數,Git不但會把本地的
master
分支内容推送的遠端新的
master
分支,還會把本地的
master
分支和遠端的
master
分支關聯起來,在以後的推送或者拉取時就可以簡化指令。
12、從遠端庫克隆
git clone <url> //要知道倉庫位址,用git clone 後面跟位址的方式克隆遠端倉庫的代碼到本地檔案夾
備注:
要克隆一個倉庫,首先必須知道倉庫的位址,然後使用
git clone
指令克隆。
Git支援多種協定,包括
https
,但通過
ssh
支援的原生
git
協定速度最快。
13、建立與合并分支(Git鼓勵大量使用分支)
檢視分支:
git branch
建立分支:
git branch <name>
切換分支:
git checkout <name>
建立+切換分支:
git checkout -b <name>
合并某分支到目前分支:
git merge <name>
删除分支:
git branch -d <name>
14、合并分支時的沖突解決
當Git無法自動合并分支時,就必須首先解決沖突。解決沖突後,再送出,合并完成。
解決沖突就是把Git合并失敗的檔案手動編輯為我們希望的内容,再送出。
用
git log --graph
指令可以看到分支合并圖。
15、分支管理政策(不用Fast-forward模式,即不用快進模式)
Fast-forward模式見 分支管理/建立與合并分支 一節
首先,仍然建立并切換
dev
分支:
git checkout -b dev
修改readme.txt檔案,并送出一個新的commit:
git add readme.txt
git commit -m "add merge"
現在切回master分支:
git checkout master
準備合并dev分支,請注意--no-ff 參數,表示禁用Fast forward(本次合并要建立一個新的commit,是以加上
-m
參數,把commit描述寫進去)
git merge --on-ff -m "merge with no-ff" dev
合并後,我們用git log檢視分支曆史
git log --graph --pretty=oneline --abbrev-commit
備注:合并分支時,加上
--no-ff
參數就可以用普通模式合并,合并後的曆史有分支,能看出來曾經做過合并,而
fast forward
合并就看不出來曾經做過合并。
16、Bug分支的修複
修複bug時,我們會通過建立新的bug分支進行修複,然後合并,最後删除;
當手頭工作沒有完成時,先把工作現場
git stash
一下,然後去修複bug,修複後,再
git stash pop
,回到工作現場。
17、多人協作 && 推送分支
git remote 檢視遠端倉庫的資訊
git remote -v 檢視遠端倉庫更詳細的資訊
推送分支,就是把該分支上的所有本地送出推送到遠端庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠端庫對應的遠端分支上:
git push origin master 推送本地master分支的所有送出到遠端倉庫
如果要推送其他分支,比如 dev 分支,就改成:
git push origin dev 推送本地dev分支的所有送出到遠端倉庫
多人協作的工作模式通常是這樣:
- 首先,可以試圖用
推送自己的修改;git push origin <branch-name>
- 如果推送失敗,則因為遠端分支比你的本地更新,需要先用
試圖合并;git pull
- 如果合并有沖突,則解決沖突,并在本地送出;
- 沒有沖突或者解決掉沖突後,再用
推送就能成功!git push origin <branch-name>
如果
git pull
提示
no tracking information
,則說明本地分支和遠端分支的連結關系沒有建立,用指令
git branch --set-upstream-to <branch-name> origin/<branch-name>
。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
小結:
- 檢視遠端庫資訊,使用
;git remote -v
- 本地建立的分支如果不推送到遠端,對其他人就是不可見的;
- 從本地推送分支,使用
,如果推送失敗,先用git push origin branch-name
抓取遠端的新送出;git pull
- 在本地建立和遠端分支對應的分支,使用
,本地和遠端分支的名稱最好一緻;git checkout -b branch-name origin/branch-name
- 建立本地分支和遠端分支的關聯,使用
;git branch --set-upstream branch-name origin/branch-name
- 從遠端抓取分支,使用
,如果有沖突,要先處理沖突。git pull
18、Rebase 操作
- rebase操作可以把本地未push的分叉送出曆史整理成直線;
- rebase的目的是使得我們在檢視曆史送出的變化時更容易,因為分叉的送出需要三方對比。