基礎命令
用戶設置
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
初始化倉庫
$ git init Initialized empty Git repository in /Users/learngit/.git/
把文件添加到倉庫
git add filename
把文件提交到倉庫
git commit -m "comment message"
初始化一個Git倉庫,使用git init命令。
添加文件到Git倉庫,分兩步:
-
第一步,使用命令git add ,注意,可反復多次使用,添加多個文件;
-
第二步,使用命令git commit,完成。
運行git status命令看看結果
git status
但如果能看看具體修改了什么內容
git diff filename
-
要隨時掌握工作區的狀態,使用git status命令。
-
如果git status告訴你有文件被修改過,用git diff可以查看修改內容
版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看
git log
git log --pretty=oneline
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100.
git reset --hard HEAD^ git reset --hard 3628164
Git提供了一個命令git reflog用來查看歷史
git reflog
-
HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。
-
穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
-
要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。
工作區(Working Directory):就是你在電腦里能看到的目錄,比如我的learngit文件夾就是一個工作區。
版本庫(Repository):工作區有一個隱藏目錄“.git”,這個不算工作區,而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
前面講了我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用“git add”把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用“git commit”提交更改,實際上就是把暫存區的所有內容提交到當前分支。
git checkout -- file可以丟棄工作區的修改
git checkout -- filename
git checkout -- file命令中的“--”很重要,沒有“--”,就變成了“創建一個新分支”的命令.
用命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區
git reset HEAD filename
git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
確實要從版本庫中刪除該文件,那就用命令git rm刪掉,並且commit
git rm test.txt git commit -m "remove test.txt"
另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本
git checkout -- test.txt
git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
命令git rm用於刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容。
遠程倉庫
要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git;
關聯后,使用命令git push -u origin master第一次推送master分支的所有內容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
用命令git clone克隆一個本地庫
//Git本身的源代碼你既可以用 git:// 協議來訪問: git clone git://git.kernel.org/pub/scm/git/git.git //也可以通過http 協議來訪問: git clone http://www.kernel.org/pub/scm/git/git.git
git 分支
查看分支:git branch
創建分支:git branch name
切換分支:git checkout name
創建+切換分支:git checkout -b name
合並某分支到當前分支:git merge name
刪除分支:git branch -d name
在 當前分支下,要把dev分支的內容合並
git merge dev
當Git無法自動合並分支時,就必須首先解決沖突。解決沖突后,再提交,合並完成。
用git log --graph命令可以看到分支合並圖。
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合並到master上,在master分支發布1.0版本;
你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合並就可以了。
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作:
git stash
現在,用git status查看工作區,就是干凈的(除非有沒有被Git管理的文件),因此可以放心地創建分支來修復bug。
首先確定要在哪個分支上修復bug,假定需要在master分支上修復,就從master創建臨時分支:
//轉換到master分支 git checkout master //創建並轉換到的名字為 issue-101 的分支 git checkout -b issue-101
查看存儲的工作 用git stash list
git stash list
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復后,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
修復bug時,我們會通過創建新的bug分支進行修復,然后合並,最后刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,回到工作現場.
如果要丟棄一個沒有被合並過的分支,可以通過git branch -D name強行刪除。
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin。
要查看遠程庫的信息,用git remote或者用git remote -v顯示更詳細的信息:
git remote
git remote -v
推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上.
git push origin master //如果要推送其他分支,比如dev,就改成 git push origin dev
但是,並不是一定要把本地分支往遠程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master分支是主分支,因此要時刻與遠程同步;
-
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
-
bug分支只用於在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
-
feature分支是否推到遠程,取決於你是否和你的小伙伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,視你的心情而定!
抓取分支
多人協作時,大家都會往master和dev分支上推送各自的修改。
現在,模擬一個你的小伙伴,可以在另一台電腦(注意要把SSH Key添加到GitHub)或者同一台電腦的另一個目錄下克隆:
git clone git://git.kernel.org/pub/scm/git/git.git
指定本地dev分支與遠程origin/dev分支的鏈接
git branch --set-upstream dev origin/dev git pull
因此,多人協作的工作模式通常是這樣:
-
首先,可以試圖用git push origin branch-name推送自己的修改;
-
如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合並;
-
如果合並有沖突,則解決沖突,並在本地提交;
-
沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream 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,如果有沖突,要先處理沖突。
tag 標簽
命令git tag name就可以打一個新標簽,可以用命令git tag查看所有標簽
//新建標簽 git tag v1.0 //給commit id 為25656e2的歷史版本打標簽 git tag v1.0 25656e2 //查看標簽 git tag
用git show tagname查看標簽信息
git show v1.0
-
命令git tag name用於新建一個標簽,默認為HEAD,也可以指定一個commit id;
-
-a tagname -m "blablabla..."可以指定標簽信息;
-
-s tagname -m "blablabla..."可以用PGP簽名標簽;
-
命令git tag可以查看所有標簽;
推送某個標簽到遠程,使用命令git push origin tagname,或者,一次性推送全部尚未推送到遠程的本地標簽
git push origin v1.0 git push origin --tags
刪除標簽
分兩步,1、刪除本地;2、刪除遠程。
//刪除本地 git tag -d v0.9 //刪除遠程 git push origin :refs/tags/v0.9
-
命令git push origin tagname可以推送一個本地標簽;
-
命令git push origin --tags可以推送全部未推送過的本地標簽;
-
命令git tag -d tagname可以刪除一個本地標簽;
-
命令git push origin :refs/tags/tagname可以刪除一個遠程標簽。
ignore 文件
不需要從頭寫.gitignore文件,GitHub已經為我們准備了各種配置文件,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
- 忽略操作系統自動生成的文件,比如縮略圖等;
- 忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
- 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
配置別名
如果敲git st就表示git status
git config --global alias.st status git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'