git介紹
Git是一個分佈式的版本控制工具,大家應該對git有概念,之前使用幾次git,但有段時間沒用了,現在權當筆記 記錄下來方便以後溫習。
Git最初被Linus Torvalds開發出來用於管理Linux內核的開發。每一個Git的工作目錄都是一個完全獨立的代碼庫,並擁有完整的歷史記錄和版本追蹤能力,
不依賴 於網絡和中心服務器。
git工作機理
Git 和其他版本控制系統的主要差別在於,Git 只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異如CVS。Git 並不保存
這些前後變化的差異數據。實際上,Git 更像是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信
息並對文件作一快照,然後保存一個指向這次快照的索引,這是 Git 同其他系統的重要區別。如圖
Git 使用 SHA-1 算法計算數據的校驗和,通過對文件的內容或目錄的結構計算出一個 SHA-1 哈希值,作爲指紋字符串,並將此結果作爲數據的唯一標識和索引。
Git 的工作完全依賴於這類指紋字串,所以你會經常看到這樣的哈希值。實際上,所有保存在 Git 數據庫中的東西都是用此哈希值來作索引的,而不是靠文件名。
git的所有操作都可以是本地的,僅僅在將新版本的內容上傳到服務器上時才需要連接網絡。
對於任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged).
已提交表示數據已經安全存儲在本地數據庫,已修改表示已經修改了文件,但還沒有提交到數據庫,已暫存表示已經在當前版本標記了一個更改的文件,以便進入
下一次提交的快照(即把已經修改的文件放在下次提交時要保存的清單中)。參看下圖:
可見Git管理項目時,文件流轉的三個工作區域:Git 的本地數據目錄,工作目錄以及暫存區域。
Git directory(Git 的本地數據目錄):是Git保存元數據和對象數據庫的地方。這也是Git最重要的部分。
working directory(工作目錄):是項目某個版本的內容。
staging area(暫存區域):是一個簡單的文件,通常包含在Git目錄中。其中存儲了將要進入下一次提交的信息。
基本的 Git 工作流程如下:
- 在工作目錄(working directory)中修改某些文件。
- 對修改後的文件進行快照,然後保存到暫存區域(staging area)。
- 提交更新(commit),將保存在暫存區域(staging area)的文件快照永久轉儲到 Git 目錄中。
我們可以從文件所處的位置來判斷狀態:如果是 Git 目錄中保存着的特定版本文件,就屬於已提交狀態;如果作了修改並已放入暫存區域,就屬於已暫存狀態;
如果自上次取出後,作了修改但還沒有放到暫存區域,就是已修改狀態。
一張描述git數據遷移的示意圖,很清晰,對於理解git的命令很有幫助.
git使用簡單舉例:
1,創建項目 在github 用戶名旁邊有一個 create a new repo 的小圖標,假設新建項目名爲project。
2,創建本地新項目 並提交
$ mkdir project//創建推送目錄
$ cd project //進入推送目錄
$ git init //設置該目錄爲推送
$ touch README //生成readme
$ git add README //加入修改列表
$ git commit -m 'first commit' //遞交修改聲明
$ git remote add origin [email protected]:username/project.git //爲遠程Git更名爲origin, origin 在這裏就是[email protected]:username/project.git的一個別名
// git remote add origin 若出現錯誤 fatal:remote origin already exists 則可以通過命令git remote rm origin刪除 已存在的origin。
$ git push -u origin master //推送此次修改 本地和遠程合併,本地默認分支爲master
git操作常見錯誤
1,git push代碼時提示"Permission denied (publickey)"
提交項目到github 當輸入 git push origin master 時出現如下錯誤:
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
解決方法:
這個錯誤說明 需要我們設置一個 ssh key
stackoverflow上找到了解決方法,點這裏, 或者到官網 也有 Generating SSH Keys的教程,點這裏。
2, git push出現 Repository not found.
ERROR: Repository not found.
fatal: The remote end hung up unexpectedly
個問題是因爲在你推送的github賬戶中,並沒有這個Repository。
解決方法:
檢查自己的github中的Repository,檢查自己創建的目錄,必須要兩者一致(如果沒有項目 則需要創建項目 在用戶名旁邊有一個 create a new repo 的小圖標);
或者先git clone下github中的Repository,然後再進行更改,這樣就一定一致了。
3,好吧上面的問題解決了又出現問題
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ...
通過錯誤提示:your current branch is behind its remote counterpart. merge th remote changes(e.g. ‘git pull’).
可知原因在於:git倉庫中已經有一部分代碼,所以它不允許你直接把你的代碼覆蓋上去。
解決方法:
有2個選擇方式:
A,git pull
先把git的東西fetch到你本地然後merge後再push。
git fetch
git merge
這2句命令等價於
git pull (' 如git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝)
但是在 使用命令 pull之前需要指定branch與merge可以通過修改 .git/config文件中的下列內容:
[branch "master"]
remote = origin
merge = refs/heads/master
也可以直接命令行修改
git config branch.master.remote origin
git config branch.master.merge ref/heads/master
上面config修改後,鍵入命令 git pull origin master, 然後執行 git add,git commit, git push命令即可把需要新增的文件添加到github.
B,強制推送(不建議使用,會覆蓋remote的內容)
使用命令 git push -f 即可。
4, push的時候出現如下錯誤:
fatal: remote error:
You can't push to git://github.com/user_name/user_repo.git
Use [email protected]:user_name/user_repo.git
解決方法:
注意提示,You can't push to git://github.com/user_name/user_repo.git
如果在git clone的時 用的是git://github.com:xx/xxx.git的形式, 那麼就會出現這個問題,因爲這個protocol(git://)是不支持push的.
所以clone使用這種形式 :git clone [email protected]:user_name/user_repo.git.(然後git remote rm origin,git remote add ....)
統計一下搜到的資料:
怎樣使用 GitHub ?http://www.zhihu.com/question/20070065
寫給Git初學者的7個建議
http://www.open-open.com/news/view/b7227e
Git使用基礎篇
http://www.open-open.com/lib/view/open1332904495999.html
Ubuntu 使用Git 使用舉例 http://www.cnblogs.com/yourihua/archive/2012/07/07/2580147.html
Pro Git 不錯的中文網站 http://iissnan.com/progit/html/zh/ch1_0.html
參考:
http://iissnan.com/progit/html/zh/ch1_0.html
http://blog.csdn.net/chain2012/article/details/7476493