GIT

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 僅顯示指定提交者相關的提交。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摇锋,一起剝皮案震驚了整個濱河市丹拯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荸恕,老刑警劉巖乖酬,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異融求,居然都是意外死亡咬像,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來县昂,“玉大人肮柜,你說我怎么就攤上這事〉拐茫” “怎么了审洞?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長待讳。 經(jīng)常有香客問我预明,道長,這世上最難降的妖魔是什么耙箍? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任撰糠,我火速辦了婚禮,結果婚禮上辩昆,老公的妹妹穿的比我還像新娘阅酪。我一直安慰自己,他們只是感情好汁针,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布术辐。 她就那樣靜靜地躺著,像睡著了一般施无。 火紅的嫁衣襯著肌膚如雪辉词。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天猾骡,我揣著相機與錄音瑞躺,去河邊找鬼。 笑死兴想,一個胖子當著我的面吹牛幢哨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫂便,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捞镰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毙替?” 一聲冷哼從身側響起岸售,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厂画,沒想到半個月后凸丸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡木羹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年甲雅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑填。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抛人,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脐瑰,到底是詐尸還是另有隱情妖枚,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布苍在,位于F島的核電站绝页,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寂恬。R本人自食惡果不足惜续誉,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望初肉。 院中可真熱鬧酷鸦,春花似錦、人聲如沸牙咏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妄壶。三九已至摔握,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丁寄,已是汗流浹背氨淌。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伊磺,地道東北人宁舰。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像奢浑,于是被迫代替她去往敵國和親蛮艰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容