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出現的部分會相應的顯示到當前分支文件中,我們只需要修改當前分支文件,使其符合自己原本期望的更改狀態,然后重新提交,再刪除合并分支即可
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 僅顯示指定提交者相關的提交。