GIT

Git學習筆記


Git 與 Github對接:

cd?到當前文檔

git init初始化git

git add -A?將所有文件提交到暫存區

git commit -m "xxx"將所有暫存區文件提交倉庫

git remote add origin git@github.com:xiucode/font-end-beginner.git對接遠程庫

git clone git@github.com:xiuocde/gitskills.git直接把遠程倉庫克隆到本地

git fetch origin從遠程庫拉取內容到本地,不合并

git pull從遠程庫拉取內容到本地,并且合并

git push origin master將本地倉庫推送到遠程倉庫

git pull根據遠程倉庫更新本地倉庫

基本概念

對于任何一個文件,在 Git 內都只有三種狀態:已提交 (committed),已修改(modified)和已暫存(staged)。

已提交表示該文件已經被安全地保存在本地數據庫中了;

已修改表示修改了某個文件,但還沒有提交保存;

已暫存表示把已修改的文件放在下次提交時要保存的清單中。

由此我們看到 Git 管理項目時,文件流轉的三個工作區域:Git 的本地數據目錄,工作目錄以及暫存區域。

請記住,工作目錄下面的所有文件都不外乎這兩種狀態:已跟蹤或未跟蹤。

已跟蹤的文件是指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄,工作一段時間后,它們的狀態可能是未更新,已修改或者已放入暫存區。而所有其他文件都屬于未跟蹤文件。它們既沒有上次更新時的快照,也不在當前的暫存區域。

初次克隆某個倉庫時,工作目錄中的所有文件都屬于已跟蹤文件,且狀態為未修改。在編輯過某些文件之后,Git 將這些文件標為已修改。我們逐步把這些修改過的文件放到暫存區域,然后等 最后一次性提交暫存區域的所有文件更新,如此重復。

基本的 Git 工作流程如下所示:


在工作目錄中修改某些文件。

對這些修改了的文件作快照,并保存到暫存區域。

提交更新,將保存在暫存區域的文件快照轉儲到 git 目錄中。

add負責將單個文件一次加入暫存區,commit負責將暫存區的文件“一股腦”全都存進倉庫之中。


初次運行 Git 前的配置

Git 提供了一個叫做 git config 的工具(譯注:實際是 git-config 命令,只不過可以通過 git 加一個 名字來呼叫此命令。),專門用來配置或讀取相應的工作環境變量。而正是由這些環境變量,決定了 Git 在 各個環節的具體工作方式和行為。這些變量可以存放在以下三個不同的地方:

/etc/gitconfig文件:系統中對所有用戶都普遍適用的配置。若使用 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:要對現有的某個項目開始用 Git 管理,只需到此項目所在的目錄

git add *.c:開始跟蹤新文件,或者把已跟蹤的文件放到暫存區,還能用于合并時 把有沖突的文件標記為已解決狀態等

git clone git://github.com/schacon/grit.git mygrit克隆倉庫,并命名為mygrit

git status:查看文件狀態

git cat readme.txt抓取當前的文件,打開查看內容

cat .gitignore:忽略某些文件

文件 .gitignore 的格式規范如下:

所有空行或者以注釋符號# 開頭的行都會被 Git 忽略。

可以使用標準的 glob 模式匹配。

匹配模式最后跟??斜杠(/)說明要忽略的是目錄。

要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取??。

所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*)匹配零個或多個任意字符;[abc] 匹配 任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);問號(?) 只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配 (比如 [0-9] 表示匹配所有 0 到 9 的數字)。

我們再看一個 .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: 比較的是工作目錄中當前文件和暫存區域快照之間的差異

git diff --cached: 已經暫存起來的文件和上次提交時的快照之間的差異

git diff HEAD -- readme.txt: 工作目錄中文件與倉庫中文件的比對

commit提交

$ git commit:提交命令

$ git commit -m "Story 182: Fix benchmarks for speed"也可以使用 -m 參數后跟提交說明的方式

git commit -a -m 'added new benchmarks'給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的文件暫 存起來一并提交,從而跳過 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如果只是刪除了工作區中的文件,可以從版本庫中還原刪除的文件

git rm -f test:當文件已經存在于暫存區的時候,刪除工作文件

git rm --cached test:當文件已經存在于暫存區的時候,刪除暫存文件

git mv README.txt README:文件重命名,并同時自動設定跟蹤新文件

git checkout -- benchmarks.rb取消文件修改(工作區的文件),回退到上一次add或者commit之后的狀態,用版本庫/暫存區里面的版本替換工作區的版本,如果文件在暫存區和版本庫都有,則用暫存區的版本來替換掉

git reset HEAD readme.txt取消文件修改(提交到暫存區文件),將文件放回工作區,HEAD表示最新版本

查看操作歷史

git log -p -2 --stat查看操作歷史,我們常用 -p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新,—stat僅僅顯示簡要的增改行數變化

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重新提交(比如剛才提交后發現修改有錯誤或者忘記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此命令會到遠程倉庫中拉取所有你本地倉庫中還沒有的數據,fetch 命令只是將遠端的數據拉到本地倉庫,并不自動合并到當前工作分支,只有當你確實準備好 了,才能手工合并

git pull從原始克隆的遠 端倉庫中抓取數據后,合并到工作目錄中當前分支

$ git push origin master將本地倉庫中的數據推送到遠程倉庫,如果

在你推數據前,已經有其他人推送了若干更新,那你的推送操作就會被駁回。你必須先把他們的更新抓取到本

地,并到自己的項目中,然后才可以再次推送。

$ git push origin dev推送其他的分支

git checkout -b dev origin/dev創建本地分支并且對接云端已有的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上創建相應的respositoriies?learngit

git remote add origin git@github.com:xiucode/learngit.git

git push -u origin master-u的意思是不近將本地的master推送到遠程github上的master,并且進行分支的合并關聯

git push origin master之后,只要本地提交到倉庫,直接用這段命令就可以實現同步

git clone git@github.com:xiuocde/gitskills.git直接把遠程倉庫克隆到本地

github上可以fork他人的倉庫,fork后他人的倉庫就放到了自己云端,然后git clone自己的倉庫到本地,進行修改后commit,然后push,如果你想匯入他人的倉庫,可以拋出一個pull request,如果對方很喜歡你添加的功能,就有可能接受,如果接受你的代碼就會merge到源代碼

Git 與 Github對接:

cd?到當前文檔

git init?初始化git

git add -A?將所有文件提交到暫存區

git commit -m "xxx"?將所有暫存區文件提交倉庫

git remote add origin git@github.com:xiucode/font-end-beginner.git?對接遠程庫

git fetch origin從遠程庫拉取內容到本地,不合并

git pull從遠程庫拉取內容到本地,并且合并

git push origin master將本地倉庫推送到遠程倉庫

git pull根據遠程倉庫更新本地倉庫

標簽

$ git tag列出現有的標簽

$ 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把推送的標簽從云端刪除

創建分支

git branch查看當前的分支

git checkout -b branch1創建并且切換到分支branch1

git branch branch1創建分支,但不切換到該分支

git checkout master切換分支

git merge合并分支

git branch -d branch1刪除branch1分支

git branch -D branch1強行刪除沒有合并過的分支

當出現merge conflict沖突的時候,conflict出現的部分會相應的顯示到當前分支文件中,我們只需要修改當前分支文件,使其符合自己原本期望的更改狀態,然后重新提交,再刪除合并分支即可


Fast-Forward模式與—No-ff模式的區別

git merge --no-ff -m "merge with no ff" dev

git stash可以暫存當前的編輯狀態,比如你突然接到一個調bug的任務,但又不想提交現在的dev,就可以用stash暫存當前的編輯狀態,等bug調完再回來搞dev分支

git stash pop恢復現場并且刪除剛才保存的stash

git stash apply stash@{0}恢復一種一個現場但不刪除剛才的stash

輸出格式參數

選項說明

%H提交對象(commit)的完整哈希字串 %h 提交對象的簡短哈希字串

%T樹對象(tree)的完整哈希字串

%t樹對象的簡短哈希字串

%P父對象(parent)的完整哈希字串 %p 父對象的簡短哈希字串

%an作者(author)的名字

%ae作者的電子郵件地址

%ad作者修訂日期(可以用 -date= 選項定制格式) %ar 作者修訂日期,按多久以前的方式顯示

%cn提交者(committer)的名字

%ce提交者的電子郵件地址

%cd提交日期

%cr提交日期,按多久以前的方式顯示 %s 提交說明

選項說明

-p按補丁格式顯示每個更新之間的差異。

—stat顯示每次更新的文件修改統計信息。

—shortstat只顯示 —stat 中最后的行數修改添加移除統計。

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容