Git 教程
寫在前面
一點小歷史,不喜歡的請 點我跳過
到了 2002 年,Linux 系統已經發展了十年了,程式碼庫之大讓 Linus 很難繼續通過手工方式管理了,社群的弟兄們也對這種方式表達了強烈不滿,於是 Linus 選擇了一個商業的版本控制系統 BitKeeper,BitKeeper 的東家 BitMover 公司出於人道主義精神,授權 Linux 社群免費使用這個版本控制系統。
安定團結的大好局面在 2005 年就被打破了,原因是 Linux 社群牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發 Samba 的 Andrew 試圖破解 BitKeeper 的協議(這麼幹的其實也不只他一個),被 BitMover 公司發現了(監控工作做得不錯!),於是 BitMover 公司怒了,要收回 Linux 社群的免費使用權。
Linus 可以向 BitMover 公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:
Linus 花了兩週時間自己用 C 寫了一個分散式版本控制系統,這就是 Git!一個月之內,Linux 系統的原始碼已經由 Git 管理了!牛是怎麼定義的呢?大家可以體會一下。
Git 迅速成為最流行的分散式版本控制系統,尤其是 2008 年,GitHub 網站上線了,它為開源專案免費提供 Git 儲存,無數開源專案開始遷移至 GitHub,包括 jQuery,PHP,Ruby 等等。
零。額外的問題
1.vim 顯示中文亂碼
命令列直接用 vim 編輯會出現漢字亂碼,而且用 QQ 拼音輸入法在 vim 裡面 wu 法輸入某些漢字,比如中 wen 的 wen、還有 wu 法的 wu 會變成 1 utf8 亂碼問題還沒有解決(找到的解決方案皆無法破之),建議不要用 vim 直接編輯
2.MINGW32 預設不支援複製貼上,需要手動設定
-
右擊標題列,選擇【屬性】
-
選擇【選項】
-
勾選【快速編輯模式 Q】
-
【確定】-【確定】
設定立即生效,支援複製/貼上:
-
複製:左鍵拖選,然後右擊即完成複製
-
貼上:在視窗內右擊即可
如有疑問請檢視 ChinaUnix 部落格:windows 下 mingw 的複製貼上
一。安裝 git
在 Windows/Mac/Linux 上安裝 git 的方法請檢視 廖雪峰的官方網站:安裝 Git
P.S.廖雪峰前輩的 git 教程非常不錯,但你肯定沒耐心從頭看到尾,不過沒關係,因為我看過了,而且會盡量沒有廢話地總結出來
二。本地操作
1.建立版本庫
- 先找一個順眼的資料夾,
cd過去,準備在裡面建立版本庫(Repository)
P.S.因為 git 命令列工具其實就是一個簡版 Linux 虛擬機器,支援 Shell 命令,如果記得一些 Linux 命令的話會用得比較順手,常用 Shell 命令請檢視 部落格園:常用的檔案和目錄操作命令 (轉)
- 初始化一個 Git 倉庫,使用
git init命令
可以把當前目錄初始化為 git 倉庫,其實也就是在目錄下自動生成一些 git 管理資訊
- 新建檔案
在該目錄下新建檔案,命令列 touch 或者資源管理器右鍵建立都可以
-
新增檔案到 Git 倉庫,分兩步:
-
使用命令
git add <file>把檔案放進暫存區,注意,可反覆多次使用,新增多個檔案; -
使用命令
git commit提交暫存區的修改,完成。
-
P.S.在資料夾下建立的檔案以及對檔案內容的增刪改不是像同步網盤一樣自動同步的,需要 add-commit 才能建立一個新版本
2.日常工作
- 檢視狀態
要隨時掌握工作區的狀態,使用 git status 命令。
如果 git status 告訴你有檔案被修改過,用 git diff 可以檢視修改內容。
- 版本後退與前進
HEAD 指向的版本就是當前版本,因此,Git 允許我們在版本的歷史之間穿梭,使用命令 git reset --hard commit_id。
穿梭前,用 git log 可以檢視提交歷史,以便確定要回退到哪個版本。
要重返未來,用 git reflog 檢視命令歷���,以便確定要回到未來的哪個版本。
-
撤銷修改
-
場景 1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令
git checkout -- file。 -
場景 2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令
git reset HEAD file,就回到了場景 1,第二步按場景 1 操作。 -
場景 3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。
-
-
刪除檔案
命令 git rm 用於刪除一個檔案。如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容。
- 操作分支
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master 分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在 dev 分支上,也就是說,dev 分支是不穩定的,到某個時候,比如 1.0 版本發布時,再把 dev 分支合併到 master 上,在 master 分支發布 1.0 版本;
你和你的小夥伴們每個人都在 dev 分支上幹活,每個人都有自己的分支,時不時地往 dev 分支上合併就可以了。
合併分支時,加上 --no-ff 參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而 fast forward 合併就看不出來曾經做過合併。例如:git merge --no-ff -m "merge with no-ff" dev
具體命令:
- 檢視分支:`git branch`
- 建立分支:`git branch <name>`
- 切換分支:`git checkout <name>`
- 建立 + 切換分支:`git checkout -b <name>`
- 合併某分支到當前分支:`git merge <name>`
- 刪除分支:`git branch -d <name>`
當 Git 無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
Git 用 <<<<<<<,=======,>>>>>>> 標記出不同分支的內容,手動修改消除衝突後再 add-commit 就好了
用 git log --graph 命令可以看到分支合併圖
- 處理 bug
修復 bug 時,我們會通過建立新的 bug 分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場 git stash 一下,然後去修復 bug,修復後,再 git stash pop,回到工作現場。
- 開發新功能
開發一個新 feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過 git branch -D <name> 強行刪除。
3.人性化配置選項
- 忽略特殊檔案
忽略某些檔案時,需要編寫.gitignore;
.gitignore 檔案本身要放到版本庫裡,並且可以對.gitignore 做版本管理
- 設定命令別名
普遍接受的別名(類似於巨集一樣的東西,用來保護手指):
- st 就表示 status,命令 `git config --global alias.st status`
- 用 co 表示 checkout,命令 `git config --global alias.co checkout`
- ci 表示 commit,命令 `git config --global alias.ci commit`
- br 表示 branch,命令 `git config --global alias.br branch`
3. 刪除別名
每個倉庫的 Git 配置檔案都放在 .git/config 檔案中,別名就在 [alias] 後面,要刪除別名,直接把對應的行刪掉即可
全域 Git 配置檔案放在 ~/gitconfig 檔案中,可以直接編輯
- 其它配置選項
可以自定義的部分比較多,比如命令輸出結果顏色方案(檔案名稱高亮什麼的)
4.搭建 git 伺服器
詳細步驟請檢視 廖雪峰的官方網站:搭建 Git 伺服器
三。遠端操作
遠端操作是指本地專案與 github 上的專案時不時地同步一下
0.準備工作
需要註冊 github 帳號,建立版本庫,設定公鑰等等,具體請檢視 廖雪峰的官方網站:新增遠端庫
1.關聯遠端庫
要關聯一個遠端庫,使用命令 git remote add origin git@server-name:path/repo-name.git;
關聯後,使用命令 git push -u origin master 第一次推送 master 分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令 git push origin master 推送最新修改;
分散式版本系統的最大好處之一是在本地工作完全不需要考慮遠端庫的存在,也就是有沒有聯網都可以正常工作,而 SVN 在沒有聯網的時候是拒絕幹活的!當有網路的時候,再把本地提交推送一下就完成了同步,真是太方便了!
2.克隆遠端庫
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用 git clone 命令克隆。
Git 支援多種協議,包括 https,但通過 ssh 支援的原生 git 協議速度最快。
3.多人協作
檢視遠端庫資訊,使用 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,如果有衝突,要先處理衝突。
4.使用標籤
標籤是版本庫的一個快照,常用在新版本發布前標記當前版本
- 建立標籤
命令 git tag <name> 用於新建一個標籤,預設為 HEAD,也可以指定一個 commit id;
git tag -a <tagname> -m "blablabla..." 可以指定標籤資訊;
git tag -s <tagname> -m "blablabla..." 可以用 PGP 簽名標籤;
命令 git tag 可以檢視所有標籤。
- 操作標籤
命令 git push origin <tagname> 可以推送一個本地標籤;
命令 git push origin --tags 可以推送全部未推送過的本地標籤;
命令 git tag -d <tagname> 可以刪除一個本地標籤;
命令 git push origin :refs/tags/<tagname> 可以刪除一個遠端標籤。
5.fork sb on github
P.S.fork 應該取自 Linux 的 Shell 命令 fork(複製當前程序,得到的子程序與父程序互不影響),用來把別人的專案版本庫轉存到自己的 github,之後就相互獨立了
在 GitHub 上,可以任意 Fork 開源倉庫;
自己擁有 Fork 後的倉庫的讀寫權限;
可以推送 pull request 給官方倉庫來貢獻程式碼。
6.常用遠端操作
-
獲取遠端專案
git clone git@github.com:ayqy/git-helloworld.git,會在當前目錄下建立專案資料夾 -
線上修改,通過
git pull origin master拿到本地來 -
本地修改,通過
git push -u origin master上傳同步(要注意先 add-commit)
四。常用命令
-
mkdir:XX(建立一個空目錄 XX 指目錄名) -
pwd:顯示當前目錄的路徑。 -
cat XX:檢視 XX 檔案內容 -
git init:把當前的目錄變成可以管理的 git 倉庫,生成隱藏.git 檔案。 -
git add XX:把 xx 檔案新增到暫存區去。 -
git commit –m "XX":提交檔案 –m 後面的是註釋。 -
git status:檢視倉庫狀態 -
git diff XX:檢視 XX 檔案修改了那些內容 -
git log:檢視歷史記錄 -
git reset--hard HEAD^ 或者 git reset --hard HEAD~:回退到上一個版本
P.S.如果想回退到 100 個版本,使用 git reset --hard HEAD~100
-
git reflog:檢視歷史記錄的版本號 id -
git checkout -- XX:把 XX 檔案在工作區的修改全部撤銷。 -
git rm XX:刪除 XX 檔案 -
git remote add origin https://github.com/ayqy/test.git:關聯一個遠端庫 -
git push –u(第一次要用-u 以後不需要) origin master:把當前 master 分支推送到遠端庫 -
git clone https://github.com/ayqy/test.git:從遠端庫中克隆 -
git checkout –b dev:建立 dev 分支 並切換到 dev 分支上 -
git branch:檢視當前所有的分支 -
git checkout master:切換回 master 分支 -
git merge dev:在當前的分支上合併 dev 分支 -
git branch –d dev:刪除 dev 分支 -
git branch name:建立分支 -
git stash:把當前的工作隱藏起來 等以後恢復現場後繼續工作 -
git stash list:檢視所有被隱藏的檔案列表 -
git stash apply:恢復被隱藏的檔案,但是內容不刪除 -
git stash drop:刪除檔案 -
git stash pop:恢復檔案的同時 也刪除檔案 -
git remote:檢視遠端庫的資訊 -
git remote –v:檢視遠端庫的詳細資訊 -
git push origin master:Git 會把 master 分支推送到遠端庫對應的遠端分支上 -
git push origin :branch-name:冒號前面的空格不能少,原理是把一個空分支 push 到 server 上,相當於刪除該分支 -
git push --force origin master:版本回退時希望本地舊版本覆蓋最新版本時使用,會刪除新版本的 log 記錄,沒有任何痕跡
五。命令大全
1.CREATE
-
Clone an existing repository
git clone ssh://user@domain.com/repo.git -
Create a new local repository
git init
2.LOCAL CHANGES
-
Changed files in your working directory
git status -
Changes to tracked files
git diff -
Add all current changes to the next commit
git add . -
Add some changes in to the next commit
git add -p <file> -
Commit all local changes in tracked files
git commit -a -
Commit previously staged changes
git commit -
Change the last commit Don't amend published commits!
git commit --amend
3.COMMIT HISTORY
-
Show all commits, starting with newest
git log -
Show changes over time for a specific file
git log -p <file> -
Who changed what and when in
git blame <file>
4.BRANCHES & TAGS
-
List all existing branches
git branch -av -
Switch HEAD branch
git checkout <branch> -
Create a new branch based on your current HEAD
git branch <new-branch> -
Create a new tracking branch based on a remote branch
git checkout --track <remote/branch> -
Delete a local branch
git branch -d <branch> -
Mark the current commit with a tag
git tag <tag-name>
5.UPDATE & PUBLISH
-
List all currently configured remotes
git remote -v -
Show information about a remote
git remote show <remote> -
Add new remote repository, named
git remote add <shortname> <url> -
Download all changes from , but don't integrate into HEAD
git fetch <remote> -
Download changes and directly merge/integrate into HEAD
git pull <remote> <branch> -
Publish local changes on a remote
git push <remote> <branch> -
Delete a branch on the remote
git branch -dr <remote/branch> -
Publish your tags
git push --tags
6.MERGE & REBASE
-
Merge into your current HEAD
git merge <branch> -
Rebase your current HEAD onto Don't rebase published commits!
git rebase <branch> -
Abort a rebase
git rebase --abort -
Continue a rebase after resolving conflicts
git rebase --continue -
Use your configured merge tool to solve conflicts
git mergetool -
Use your editor to manually solve conflicts and (after resolving) mark file as resolved
git add <resolved-file>git rm <resolved-file>
7.UNDO
-
Discard all local changes in your working directory
git reset --hard HEAD -
Discard local changes in a specific file
git checkout HEAD <file> -
Revert a commit (by producing a new commit with contrary changes)
git revert <commit> -
Reset your HEAD pointer to a previous commit
…and discard all changes since then:
git reset --hard <commit>…and preserve all changes as unstaged changes:
git reset <commit>…and preserve uncommitted local changes:
git reset --keep <commit>
暫無評論,快來發表你的看法吧