Git學習筆記
Git 與 Github對接:
cd?到當前文檔
git init初始化git
git add -A?將所有文件提交到暫存區(qū)
git commit -m "xxx"將所有暫存區(qū)文件提交倉庫
git remote add origin git@github.com:xiucode/font-end-beginner.git對接遠程庫
git clone git@github.com:xiuocde/gitskills.git直接把遠程倉庫克隆到本地
git fetch origin從遠程庫拉取內(nèi)容到本地梁厉,不合并
git pull從遠程庫拉取內(nèi)容到本地劈彪,并且合并
git push origin master將本地倉庫推送到遠程倉庫
git pull根據(jù)遠程倉庫更新本地倉庫
基本概念
對于任何一個文件,在 Git 內(nèi)都只有三種狀態(tài):已提交 (committed),已修改(modified)和已暫存(staged)陪毡。
已提交表示該文件已經(jīng)被安全地保存在本地數(shù)據(jù)庫中了;
已修改表示修改了某個文件,但還沒有提交保存;
已暫存表示把已修改的文件放在下次提交時要保存的清單中串慰。
由此我們看到 Git 管理項目時,文件流轉的三個工作區(qū)域:Git 的本地數(shù)據(jù)目錄,工作目錄以及暫存區(qū)域。
請記住,工作目錄下面的所有文件都不外乎這兩種狀態(tài):已跟蹤或未跟蹤吆你。
已跟蹤的文件是指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄,工作一段時間后,它們的狀態(tài)可能是未更新,已修改或者已放入暫存區(qū)胧后。而所有其他文件都屬于未跟蹤文件。它們既沒有上次更新時的快照,也不在當前的暫存區(qū)域科盛。
初次克隆某個倉庫時,工作目錄中的所有文件都屬于已跟蹤文件,且狀態(tài)為未修改帽衙。在編輯過某些文件之后,Git 將這些文件標為已修改。我們逐步把這些修改過的文件放到暫存區(qū)域,然后等 最后一次性提交暫存區(qū)域的所有文件更新,如此重復贞绵。
基本的 Git 工作流程如下所示:
在工作目錄中修改某些文件厉萝。
對這些修改了的文件作快照,并保存到暫存區(qū)域。
提交更新,將保存在暫存區(qū)域的文件快照轉儲到 git 目錄中榨崩。
add負責將單個文件一次加入暫存區(qū)谴垫,commit負責將暫存區(qū)的文件“一股腦”全都存進倉庫之中。
初次運行 Git 前的配置
Git 提供了一個叫做 git config 的工具(譯注:實際是 git-config 命令,只不過可以通過 git 加一個 名字來呼叫此命令母蛛。),專門用來配置或讀取相應的工作環(huán)境變量翩剪。而正是由這些環(huán)境變量,決定了 Git 在 各個環(huán)節(jié)的具體工作方式和行為。這些變量可以存放在以下三個不同的地方:
/etc/gitconfig文件:系統(tǒng)中對所有用戶都普遍適用的配置。若使用 git config 時用 —system 選項,讀寫 的就是這個文件。
~/.gitconfig文件:用戶目錄下的配置文件只適用于該用戶望伦。若使用 git config 時用 —global 選項,讀寫 的就是這個文件。
當前項目的 git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當前 項目有效恕出。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 里的配置會覆蓋 /etc/gitconfig 中的同名變量。
配置姓名违帆、郵箱和編輯器
git config --global user.name"Xiu Yuliang"
git config --global user.email yuliangxiu@gmail.com
git config --global core.editor sublime
解決合并沖突時使用哪種差異分析工具
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecme,rge,和opendiff等合并工具的輸出信息
git config --global merge.tool vimdiff
查看已有的配置信息
git config --list
尋求幫助
githelp
如果用了 —global 選項,那么更改的配置文件就是位于你用戶主目錄下的那個,以后你所有的項目都會默 認使用這里配置的用戶信息浙巫。如果要在某個特定的項目中使用其他名字或者電郵,只要去掉 —global 選項重 新配置即可,新的設定保存在當前項目的 .git/config 文件里。
具體 Git 操作
建立版本庫的基礎操作
git init:要對現(xiàn)有的某個項目開始用 Git 管理,只需到此項目所在的目錄
git add *.c:開始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時 把有沖突的文件標記為已解決狀態(tài)等
git clone git://github.com/schacon/grit.git mygrit克隆倉庫刷后,并命名為mygrit
git status:查看文件狀態(tài)
git cat readme.txt抓取當前的文件的畴,打開查看內(nèi)容
cat .gitignore:忽略某些文件
文件 .gitignore 的格式規(guī)范如下:
所有空行或者以注釋符號# 開頭的行都會被 Git 忽略廉油。
可以使用標準的 glob 模式匹配。
匹配模式最后跟??斜杠(/)說明要忽略的是目錄苗傅。
要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取??抒线。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*)匹配零個或多個任意字符;[abc] 匹配 任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);問號(?) 只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符范圍內(nèi)的都可以匹配 (比如 [0-9] 表示匹配所有 0 到 9 的數(shù)字)渣慕。
我們再看一個 .gitignore 文件的例子:
# 此為注釋 – 將被 Git 忽略
*.a# 忽略所有 .a 結尾的文件
!lib.a# 但 lib.a 除外
/TODO# 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目錄下的所有文件
doc/*.txt# 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
查看版本差異
git diff: 比較的是工作目錄中當前文件和暫存區(qū)域快照之間的差異
git diff --cached: 已經(jīng)暫存起來的文件和上次提交時的快照之間的差異
git diff HEAD -- readme.txt: 工作目錄中文件與倉庫中文件的比對
commit提交
$ git commit:提交命令
$ git commit -m "Story 182: Fix benchmarks for speed"也可以使用 -m 參數(shù)后跟提交說明的方式
git commit -a -m 'added new benchmarks'給 git commit 加上 -a 選項,Git 就會自動把所有已經(jīng)跟蹤過的文件暫 存起來一并提交,從而跳過 git add
git reset --hard HEAD^回溯到上一個版本嘶炭,上上個版本用HEAD^^
git reset --hard id回溯到id號指示的那一個版本
git reflog展示你對倉庫的所有操作軌跡,這樣即使你刪除了某一個版本(git log無法顯示此刪除版本的id號碼)逊桦,也可以榮國reflog重新找到你的那次操作眨猎,從而查到id號碼
samusakaisuketekiMacBook-Pro:learngit Personals$ git reflog
869f440 HEAD@{0}: reset: moving to 869f44020
1818601 HEAD@{1}: reset: moving to HEAD^
869f440 HEAD@{2}: commit: git commit -m "append the GPL"
1818601 HEAD@{3}: commit: second commit
a8e553a HEAD@{4}: commit (initial): wrote a readme file
移除和重命名
rm test:簡單的移除工作文件操作
git rm test?git commit -m "remove the test":移除該文件的版本庫中的文件
git checkout -- test如果只是刪除了工作區(qū)中的文件,可以從版本庫中還原刪除的文件
git rm -f test:當文件已經(jīng)存在于暫存區(qū)的時候强经,刪除工作文件
git rm --cached test:當文件已經(jīng)存在于暫存區(qū)的時候睡陪,刪除暫存文件
git mv README.txt README:文件重命名,并同時自動設定跟蹤新文件
git checkout -- benchmarks.rb取消文件修改(工作區(qū)的文件)匿情,回退到上一次add或者commit之后的狀態(tài)兰迫,用版本庫/暫存區(qū)里面的版本替換工作區(qū)的版本,如果文件在暫存區(qū)和版本庫都有炬称,則用暫存區(qū)的版本來替換掉
git reset HEAD readme.txt取消文件修改(提交到暫存區(qū)文件)汁果,將文件放回工作區(qū),HEAD表示最新版本
查看操作歷史
git log -p -2 --stat查看操作歷史,我們常用 -p 選項展開顯示每次提交的內(nèi)容差異,用 -2 則僅顯示最近的兩次更新,—stat僅僅顯示簡要的增改行數(shù)變化
git log --pretty=oneline單行顯示
$ git log --pretty=format:"%h - %an, %ar : %s"定制要顯示的記錄格式,這樣的輸出便于后期編程提取分析
$ git log --pretty="%h:%s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/加上時間段和確定作者的輸出
$ git commit --amend重新提交(比如剛才提交后發(fā)現(xiàn)修改有錯誤或者忘記add一些文件)
gitk圖形界面
git lg自己編輯的五彩斑斕log
遠程push和pull
$ git remote -v查看遠程庫(包含遠程庫的地址)玲躯,顯示抓取和推送的origin地址
git remote -v
origin git@github.com:xiucode/learngit.git (fetch)
origin git@github.com:xiucode/learngit.git (push)
$ git remote add pb git://github.com/paulboone/ticgit.git要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用
$ git fetch pd此命令會到遠程倉庫中拉取所有你本地倉庫中還沒有的數(shù)據(jù),fetch 命令只是將遠端的數(shù)據(jù)拉到本地倉庫,并不自動合并到當前工作分支,只有當你確實準備好 了,才能手工合并
git pull從原始克隆的遠 端倉庫中抓取數(shù)據(jù)后,合并到工作目錄中當前分支
$ git push origin master將本地倉庫中的數(shù)據(jù)推送到遠程倉庫,如果
在你推數(shù)據(jù)前,已經(jīng)有其他人推送了若干更新,那你的推送操作就會被駁回据德。你必須先把他們的更新抓取到本
地,并到自己的項目中,然后才可以再次推送。
$ git push origin dev推送其他的分支
git checkout -b dev origin/dev創(chuàng)建本地分支并且對接云端已有的dev分支跷车,方便push
不同的推送需求
git remote show origin查案遠程倉庫詳細信息
git remote origin
git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/schacon/ticgit.git
pb git://github.com/paulboone/ticgit.git
實際情況比較復雜:
git remote show origin * remote origin
URL: git@github.com:defunkt/github.git
Remote branch merged with 'git pull' while on branch issues
issues
Remote branch merged with 'git pull' while on branch master
master
New remote branches (next fetch will store in remotes/origin)
caching
Stale tracking branches (use 'git remote prune')
libwalker
walker2
Tracked remote branches
acl
apiv2 dashboard2 issues master postgres
Local branch pushed with 'git push' master:master
運行 git push 時缺省推送的分支是什么(譯注:最后兩行)棘利。
它還顯示了有哪些遠端分支還 沒有同步到本地(譯注:第六行的 caching 分支),哪些已同步到本地的遠端分支在遠端服務器上已被刪除(譯注:Stale tracking branches 下面的兩個分支)
以及運行 git pull 時將自動合并哪些分支(譯注:前四行中列出的 issues 和 master 分支)。
$ git remote rename pb paul遠程倉庫的重命名
$ git remote rm paul移除遠端的某一個倉庫
Github使用
cd 當前git目錄首先定位到當前的目錄
在Github上創(chuàng)建相應的respositoriies?learngit
git remote add origin git@github.com:xiucode/learngit.git
git push -u origin master-u的意思是不近將本地的master推送到遠程github上的master朽缴,并且進行分支的合并關聯(lián)
git push origin master之后善玫,只要本地提交到倉庫,直接用這段命令就可以實現(xiàn)同步
git clone git@github.com:xiuocde/gitskills.git直接把遠程倉庫克隆到本地
github上可以fork他人的倉庫不铆,fork后他人的倉庫就放到了自己云端蝌焚,然后git clone自己的倉庫到本地裹唆,進行修改后commit誓斥,然后push,如果你想?yún)R入他人的倉庫许帐,可以拋出一個pull request劳坑,如果對方很喜歡你添加的功能,就有可能接受成畦,如果接受你的代碼就會merge到源代碼
Git 與 Github對接:
cd?到當前文檔
git init?初始化git
git add -A?將所有文件提交到暫存區(qū)
git commit -m "xxx"?將所有暫存區(qū)文件提交倉庫
git remote add origin git@github.com:xiucode/font-end-beginner.git?對接遠程庫
git fetch origin從遠程庫拉取內(nèi)容到本地距芬,不合并
git pull從遠程庫拉取內(nèi)容到本地涝开,并且合并
git push origin master將本地倉庫推送到遠程倉庫
git pull根據(jù)遠程倉庫更新本地倉庫
標簽
$ git tag列出現(xiàn)有的標簽
$ git tag -l 'v1.4.2.*'列出v.1.4.2的系列版本
$ git tag v1.4給對象加一個輕量級標簽(無說明文字)
$ git tag -a v1.4 -m 'my version 1.4'給對象加一個重量級標簽(帶說明文字)
$ git tag v1.4 fa89asf9給非當前commit的舊分支打標簽只需要制定他的id
$ git tag -d v1.4刪除某一個標簽
$ git show v1.4查看該標簽對應對象的版本信息(和直接show + name用法一樣,都是show)
在后期對早先的某次提交加注標簽(只需要提供校驗的前幾位字符即可)
$ git log --pretty=oneline
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
$ git tag -a v1.2 9fceb02
$ git push origin v1.5把標簽傳到服務器上
$ git push origin --tags一次把所有標簽一起傳到服務器上
$ git push origin:refs/tags/v1.4把推送的標簽從云端刪除
創(chuàng)建分支
git branch查看當前的分支
git checkout -b branch1創(chuàng)建并且切換到分支branch1
git branch branch1創(chuàng)建分支框仔,但不切換到該分支
git checkout master切換分支
git merge合并分支
git branch -d branch1刪除branch1分支
git branch -D branch1強行刪除沒有合并過的分支
當出現(xiàn)merge conflict沖突的時候舀武,conflict出現(xiàn)的部分會相應的顯示到當前分支文件中,我們只需要修改當前分支文件离斩,使其符合自己原本期望的更改狀態(tài)银舱,然后重新提交,再刪除合并分支即可
Fast-Forward模式與—No-ff模式的區(qū)別
git merge --no-ff -m "merge with no ff" dev
git stash可以暫存當前的編輯狀態(tài)跛梗,比如你突然接到一個調(diào)bug的任務寻馏,但又不想提交現(xiàn)在的dev,就可以用stash暫存當前的編輯狀態(tài)核偿,等bug調(diào)完再回來搞dev分支
git stash pop恢復現(xiàn)場并且刪除剛才保存的stash
git stash apply stash@{0}恢復一種一個現(xiàn)場但不刪除剛才的stash
輸出格式參數(shù)
選項說明
%H提交對象(commit)的完整哈希字串 %h 提交對象的簡短哈希字串
%T樹對象(tree)的完整哈希字串
%t樹對象的簡短哈希字串
%P父對象(parent)的完整哈希字串 %p 父對象的簡短哈希字串
%an作者(author)的名字
%ae作者的電子郵件地址
%ad作者修訂日期(可以用 -date= 選項定制格式) %ar 作者修訂日期,按多久以前的方式顯示
%cn提交者(committer)的名字
%ce提交者的電子郵件地址
%cd提交日期
%cr提交日期,按多久以前的方式顯示 %s 提交說明
選項說明
-p按補丁格式顯示每個更新之間的差異诚欠。
—stat顯示每次更新的文件修改統(tǒng)計信息。
—shortstat只顯示 —stat 中最后的行數(shù)修改添加移除統(tǒng)計漾岳。
—name-only僅在提交信息后顯示已修改的文件清單轰绵。
—name-status顯示新增、修改尼荆、刪除的文件清單藏澳。
—abbrev-commit僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符。
—relative-date使用較短的相對時間顯示(比如,“2 weeks ago”)耀找。
—graph顯示 ASCII 圖形表示的分支合并歷史翔悠。
—pretty使用其他格式顯示歷史提交信息∫懊ⅲ可用的選項包括 oneline,short,full,fuller 和 format(后跟指定格式)蓄愁。
選項說明
-(n)僅顯示最近的 n 條提交
—since, —after僅顯示指定時間之后的提交。 —until, —before 僅顯示指定時間之前的提交狞悲。
—author僅顯示指定作者相關的提交撮抓。 —committer 僅顯示指定提交者相關的提交。