1. 程式人生 > >Git記錄

Git記錄

好久沒寫部落格了,自己變得懶了>_<,以前雖然用過Git但是理解沒那麼深刻,所以自己抽了兩天時間仔細學習並實踐了下。結果發現還是實踐給自己的回報很多,在這裡記錄下…

推薦下面兩篇文章:

廖雪峰的官方網站:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

阿里雲搭建自己的git伺服器:http://www.tangshuang.net/1693.html

自己實踐遇到的問題的解決方法(谷歌出來的,百度是真不好找答案,這裡抱怨下)

1.遠端推送(git push)的時候,有問題
許可權導致的,解決方式在git對應的資料夾給許可權

http://www.cnblogs.com/abeen/archive/2010/06/17/1759496.html

2.git push成功,但是遠端伺服器啥都沒變
在這裡先先提一下 遠端倉庫建立的時候有個可選引數--bare 一般要加上,如 git init --bare testgit.git,一般是這種方式 ;還有一種git init testnobaregit.git

git遠端倉庫建立的兩種方式

上圖中的testgit.git 即是帶--bare引數,testnobaregit.git就是不帶--bare引數,可以明顯看到兩者的區別

3.對git clone [email protected]:/data/www/git/testgit.git

的理解錯誤(這裡瞎寫的外網ip)

很明顯這是克隆一份遠端原始碼,後面的@之前的git代表的是遠端伺服器的git使用者,如果遠端是root就寫成[email protected]; 8.8.8.8:後面跟的是在伺服器上的實際路徑。在這裡說下,在廖雪峰git教程中搭建Git伺服器一節中,我耽誤些時間,因為在第三步,建立證書登入:收集所有需要登入的使用者的公鑰,就是他們自己的id_rsa.pub檔案,把所有公鑰匯入到/home/git/.ssh/authorized_keys檔案裡,一行一個自己(用root使用者登入)傻呵呵的去root家目錄下的.ssh/authorized_keys,接著去吧自己本地電腦上的.ssh/id_rsa.pub

開啟,發現好多行,然後百度一步一步更往誤區走,這裡不說了,全是淚。其實很簡單,因為教程中少寫一個步驟 自己在建立git使用者後,還有幾步操作cd /home/git; mkdir .ssh;touch authorized_keys,接著上面複製的東西,貼上進來就行

自己的理解

git命令分三塊管理,即是 檔案管理,版本管理, 分支管理,遠端倉庫管理(不一定對).git本地分為工作區和暫存區

1.檔案管理的命令

git add <file>
git status
git commit -m "self message" // 
/** 假設有一種情況,你本地取完程式碼,修改 了readme.txt檔案,此時並沒有git add readme.tx(即所說的還沒提交到暫存區),突然你發現你不想修改這個檔案,想回復原來的狀態,怎麼辦呢? 沒事,你可以執行下面的命令 */
git checkout -- readme.txt // 可以丟棄工作區readme.txt的修改
/** 假設有一種情況,你本地取完程式碼,修改 了readme.txt檔案,此時你又有git add readme.tx(即所說的提交到了暫存區),突然你發現你不想提交這個檔案,想回復版本中的狀態,怎麼辦呢? 沒事,你可以執行下面的命令 */
git reset HEAD readme.txt // 這裡對應修改readme.txt檔名就行
/** 刪除了一個git中的檔案,即運行了rm readme.txt,如果git提交,如何辦呢? 按下面的命令就行 */
git rm readme.txt
git commit -m "remove readme.txt"
// 如果是發現刪除了的話 怎麼辦呢?如上面一樣,沒執行git rm之前的話,只要執行git checkout -- readme.txt 運行了git rm之後的話,只需git reset --hard HEAD

2.版本管理

git log
git log --pretty=oneline
git log --graph --pretty=oneline --abbrev-commit
git reset --hard HEAD^
git reset --hard 3628164 // 3628164指的是commit id
/** 這裡假設程式碼現在已經是版本A->B->C->D->E,你通過上面方式回退到了D,但是第二天你想重新到E,但是這時你git log並不能看到E的commit id,這怎麼辦呢?沒事,有下面的命令。找到對應的commit id就可以reset 回去 */
git reflog 
//上面會輸出
//$ git reflog
//ea34578 [email protected]{0}: reset: moving to HEAD^
//3628164 [email protected]{1}: commit: append GPL
//ea34578 [email protected]{2}: commit: add distributed
//cb926e7 [email protected]{3}: commit (initial): wrote a readme file

3.分支管理

一般是master發線上版本, dev進行開發迭代

git checkout -b dev //建立dev分支,然後切換到dev分支,相當於git branch dev;git checkout dev
git branch  //檢視所有分支和當前分支
git checkout master //切換到master
git merge dev //合併dev分支,這種是預設的FF(Fast-Forward)模式
git branch -d dev //刪除dev分支,注意這個-d命令實在merge以後才好使,如果實在merge之前想刪除的話yinga該用-D 
/** 用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支資訊,master提交路線圖上看不到。如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊 */
git merge --no-ff -m "merge with no-ff" dev

/** 假設有一種情況:當你接到一個修復一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交。並不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎麼辦? 木有問題,有git stash命令,下面的一系列命令,模擬所說的業務 */
git stash //儲存當時狀態
git checkout master
git checkout -b issue-101
git add readme.txt 
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101 //merge bug分支
git checkout dev //切換回dev
git status //工作區是乾淨的
git stash list  //可以看到[email protected]{0}: WIP on dev: 6224937 add merge
git stash pop //這裡說明下,可以用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;git stash pop不需要drop

/** 間隔線 */
git branch -D <name>  //要丟棄一個沒有被合併過的分支

4.遠端倉庫管理

/** 當你從遠端倉庫克隆時,實際上Git自動把本地的master分支和遠端的master分支對應起來了,並且,遠端倉庫的預設名稱是origin */

git remote //輸出origin
git remote -v //顯示更詳細的資訊origin  [email protected]:michaelliao/learngit.git (fetch);origin  [email protected]:michaelliao/learngit.git (push)

git push origin master //推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支

/** 如果要推送其他分支如dev */
git push origin dev

git checkout -b dev origin/dev // dev對應遠端dev分支

/** 如果git pull提示“no tracking information”,則說明本地分支和遠端分支的連結關係沒有建立 */
git branch --set-upstream dev origin/dev //指定本地dev分支與遠端origin/dev分支的連結

git pull


git init testnobaregit.git

git init --bare testgit.git // 遠端伺服器推薦這種

git忽略某些檔案或者資料夾

在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。.gitignore檔案本身要放到版本庫裡,並且可以對.gitignore做版本管理!