git基礎總結


git基礎總結

git基礎總結

在工作目錄中初始化新倉庫:$ git init

將文件添加到git:

格式:$ git add

舉例:

$ git add *.c

$ git add README

提交文件到git:

格式:$ git commit [-m '備注']

舉例:$ git commit -m 'initial project version'

設置自己喜歡的編輯軟件:默認會啟用 shell 的環境變量 $EDITOR 所指定的軟件,一般都是 vim 或 emacs。

git config --global core.editor

從倉庫克隆到本地的命令:

格式:$ git clone [url] [folder_path]

舉例:$ git clone git://github.com/schacon/grit.git demo_folder

查看分支:

格式:$ git branch [-a]

舉例(所有分支):$ git branch -a

舉例(本地分支):$ git branch

檢查當前文件狀態:$ git status

查看具體修改了什么地方:$ git diff

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

Git>=1.6.1還允許使用(效果是相同的):$ git diff --staged

git獲取幫助

格式:$ git help

舉例:要學習config命令可以怎么用,運行:$ git help config

格式:$ git?--help

舉例:$ git config --help

格式:$ man git-

舉例:$ man git-config

按q退出

忽略文件

忽略某些文件:創建.gitignore文件

內容舉例:

$ cat .gitignore

*.[oa] #告訴 Git 忽略所有以 .o 或 .a 結尾的文件

*~ #告訴 Git 忽略所有以波浪符(~)結尾的文件,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本

#此為注釋 – 將被 Git 忽略

#忽略所有 .a 結尾的文件

*.a

#但 lib.a 除外

!lib.a

#僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO

/TODO

#忽略 build/ 目錄下的所有文件

build/

#會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

doc/*.txt

#忽略 doc/ 目錄下所有擴展名為 txt 的文件

doc/**/*.txt

**\通配符從 Git 版本 1.8.2 以上已經可以使用。


跳過使用暫存區域:$ git commit -a -m ''


移除文件


格式:git rm [] [--] ...

查看git rm具體參數,在命令行輸入:$ git rm

刪除文件:$ rm grit.gemspec

移除git上的文件的操作:$ git rm grit.gemspec

如果刪除之前修改過并且已經放到暫存區域的話,則必須要用強制刪除選項-f(譯注:即 force 的首字母),以防誤刪除文件后丟失修改的內容。

要移除跟蹤但不刪除文件:

$ git rm --cached readme.txt

也可以使用glob模式:

舉例:$ git rm log/\*.log

解釋:此命令刪除所有log/目錄下擴展名為 .log 的文件。

舉例:$ git rm \*~

解釋:會遞歸刪除當前目錄及其子目錄中所有~結尾的文件。


移動文件


在Git中對文件改名:

舉例:$ git mv file_from file_to

解釋:

其實,運行git mv就相當于運行了下面三條命令:

$ mv file_from file_to

$ git rm file_from

$ git add file_to


查看提交歷史


查看提交歷史命令:$ git log

常用命令:

舉例:$ git log -p -2

解釋:常用-p選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新

僅顯示簡要的增改行數統計:

$ git log --stat

常用命令:

舉例:$ git log --pretty=oneline

解釋:常用的--pretty選項,可以指定使用完全不同于默認格式的方式展示提交歷史。

--pretty的值有:oneline、short、full 、 fuller和format

oneline將每個提交放在一行顯示,這在提交數很大時非常有用。

format:可以定制要顯示的記錄格式,這樣的輸出便于后期編程提取分析。

舉例:$ git log --pretty=format:"%h - %an, %ar : %s"

常用的格式占位符寫法及其代表的意義:

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

%h 提交對象的簡短哈希字串

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

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

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

%p 父對象的簡短哈希字串

%an 作者(author)的名字

%ae 作者的電子郵件地址

%ad 作者修訂日期(可以用-date=選項定制格式)

%ar 作者修訂日期,按多久以前的方式顯示

%cn 提交者(committer)的名字

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

%cd 提交日期

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

%s 提交說明


其他3項展示的信息或多或少有些不同,請自己動手實踐一下看看效果如何。

用oneline或 format 時結合 --graph 選項,可以看到開頭多出一些 ASCII 字符串表示的簡單圖形,形象地展示了每個提交所在的分支及其分化衍合情況。在我們之前提到的 Grit 項目倉庫中可以看到:

$ git log --pretty=format:"%h %s" --graph

* 2d3acf9 ignore errors from SIGCHLD on trap

* ?5e3ee11 Merge branch 'master' of git://github.com/dustin/grit

|\

| * 420eac9 Added a method for getting the current branch.

* | 30e367c timeout code and tests

* | 5a09431 add timeout protection to grit

* | e1193f8 support for heads with slashes in them

|/

* d6016bc require time for xmlschema

* ?11d191e Merge branch 'defunkt' into local

git log其他常用的選項及其釋義:

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

--word-diff 按word diff格式顯示差異。

--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(后跟指定格式)。

--oneline --pretty=oneline --abbrev-commit的簡化用法。

Git在輸出所有提交時會自動調用分頁程序(less),要看更早的更新只需翻到下頁即可。

另外還有按照時間作限制的選項,比如--since和 --until。下面的命令列出所有最近兩周內的提交:

舉例:$ git log --since=2.weeks

其他常用的類似選項:

-(n) 僅顯示最近的n條提交

--since, --after 僅顯示指定時間之后的提交。

--until, --before 僅顯示指定時間之前的提交。

--author 僅顯示指定作者相關的提交。

--committer 僅顯示指定提交者相關的提交。

請注意,如果要得到同時滿足這兩個選項搜索條件的提交,就必須用--all-match選項。否則,滿足任意一個條件的提交都會被匹配出來:

例子:

$ git log --pretty="%h - %an, %ar : %s" --author=gitster --after="2008-10-01"

???--before="2008-11-01" --no-merges -- t/


撤消操作


修改最后一次提交:

$ git commit -m 'initial commit'

$ git add forgotten_file

$ git commit --amend

上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。


不小心用git add .全加到了暫存區域,取消已經暫存的文件:git status 的命令輸出已經告訴了我們該怎么做:

取消暫存文件使用:git reset HEAD ...

$ git reset HEAD benchmarks.rb


取消對文件的修改,回到之前的狀態,git status同樣提示了具體的撤消方法


在第二個括號中,我們看到了拋棄文件修改的命令(至少在Git 1.6.1以及更高版本中會這樣提示,如果你還在用老版本,我們強烈建議你升級,以獲取最佳的用戶體驗),讓我們試試看:git checkout -- ...

$ git checkout -- benchmarks.rb

遠程倉庫的使用

查看當前的遠程庫

命令:$ git remote

實現:

克隆項目$ git clone git://github.com/schacon/ticgit.git

$ cd ticgit

$ git remote

顯示對應的克隆地址:

$ git remote -v

添加遠程倉庫

運行git remote add [shortname] [url]

$ git remote

$ git remote add pb git://github.com/paulboone/ticgit.git

$ git remote -v

現在可以用字符串pb指代對應的倉庫地址了。比如說,要抓取所有 Paul 有的,但本地倉庫沒有的信息,可以運行 git fetch pb:

$ git fetch pb

從遠程倉庫抓取數據


$ git fetch [remote-name]

注意:需要記住,fetch命令只是將遠端的數據拉到本地倉庫,并不自動合并到當前工作分支,只有當你確實準備好了,才能手工合并。

常用:

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

$ ?git pull

推送數據到遠程倉庫

命令:git push [remote-name] [branch-name]

例子:

$ git push origin master

或者

$ git push


查看遠程倉庫信息


命令:git remote show [remote-name]

例子:

$ 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 rename pb paul

$ git remote


注意,對遠程倉庫的重命名,也會使對應的分支名稱發生變化,原來的pb/master分支現在成了 paul/master。


刪除對應的遠端倉庫,可以運行git remote rm命令:

$ git remote rm paul


打標簽


列顯已有的標簽:

$ git tag


注意:顯示的標簽按字母順序排列,所以標簽的先后并不表示重要程度的輕重。


篩選標簽:

$ git tag -l 'v1.4.2.*'



新建標簽


一般我們都建議使用含附注型的標簽,以便保留相關信息;當然,如果只是臨時性加注標簽,或者不需要旁注額外信息,用輕量級標簽也沒問題。


輕量級的(lightweight)


創建標簽:

$ git tag v1.4-lw

$ git tag


查看標簽版本信息:$ git show v1.4-lw


含附注的(annotated)


創建標簽:用-a(譯注:取 annotated 的首字母)指定標簽名字即可:

$ git tag -a v1.4 -m 'my version 1.4'

$ git tag

v0.1

v1.3

v1.4


而-m選項則指定了對應的標簽說明,Git 會將此說明一同保存在標簽對象中。如果沒有給出該選項,Git 會啟動文本編輯軟件供你輸入標簽說明


查看相應標簽的版本信息,并連同顯示打標簽時的提交對象:

$ git show v1.4

簽署標簽


如果你有自己的私鑰,還可以用GPG來簽署標簽,只需要把之前的 -a 改為 -s (譯注: 取 signed 的首字母)即可:

$ git tag -s v1.5 -m 'my signed 1.5 tag'


查看標簽版本信息:$ git show v1.4


驗證標簽


使用git tag -v [tag-name](譯注:取 verify 的首字母)的方式驗證已經簽署的標簽。此命令會調用 GPG 來驗證簽名,所以你需要有簽署者的公鑰,存放在 keyring 中,才能驗證:

$ git tag -v v1.4.2.1

若是沒有簽署者的公鑰,會報告類似下面這樣的錯誤:

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A

gpg: Can't check signature: public key not found

error: could not verify the tag 'v1.4.2.1'

后期加注標簽

你甚至可以在后期對早先的某次提交加注標簽。比如在下面展示的提交歷史中:

$ git log --pretty=oneline

4682c3261057305bdd616e23b64b0857d832627b added a todo file

166ae0c4d3f420721acbb115cc33848dfcc2121a started write support

9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile

964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo

8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme


在提交“updated rakefile” 后為此項目打上版本號 v1.2


補標簽:$ git tag -a v1.2 9fceb02


列顯已有的標簽:$ git tag


查看相應標簽的版本信息,并連同顯示打標簽時的提交對象:$ git show v1.2


分享標簽

運行git push origin [tagname]

描述:

默認情況下,git push并不會把標簽傳送到遠端服務器上,只有通過顯式命令才能分享標簽到遠端倉庫。其命令格式如同推送分支,運行 git push origin [tagname] 即可:

$ git push origin v1.5

要一次推送所有本地新增的標簽上去:

$ git push origin --tags


技巧和竅門


自動補全

如果你用的是Bash shell,可以試試看 Git 提供的自動補全腳本。下載 Git 的源代碼,進入 contrib/completion 目錄,會看到一個 git-completion.bash 文件。將此文件復制到你自己的用戶主目錄中(譯注:按照下面的示例,還應改名加上點:cp git-completion.bash ~/.git-completion.bash),并把下面一行內容添加到你的 .bashrc 文件中:


source ~/.git-completion.bash


也可以為系統上所有用戶都設置默認使用此腳本。Mac上將此腳本復制到 /opt/local/etc/bash_completion.d 目錄中,Linux 上則復制到 /etc/bash_completion.d/ 目錄中。這兩處目錄中的腳本,都會在 Bash 啟動時自動加載。


如果在Windows上安裝了 msysGit,默認使用的 Git Bash 就已經配好了這個自動補全腳本,可以直接使用。


實例:

$ git co

commit config


此例中:

linux中鍵入 git co 然后連按兩次 Tab 鍵,會看到兩個相關的建議(命令) commit 和 config。繼而輸入 m 會自動完成 git commit 命令的輸入。

windows中鍵入 git co 然后連按兩次 Tab 鍵,會看到命令在變,選擇相應的命令即可。


實例:

比如運行git log的時候忘了相關選項的名字,可以輸入開頭的幾個字母,然后敲 Tab 鍵看看有哪些匹配的:

$ git log --s


Git命令別名

取別名

例子:

$ git config --global alias.co checkout

$ git config --global alias.br branch

$ git config --global alias.ci commit

$ git config --global alias.st status

現在,如果要輸入git commit只需鍵入 git ci 即可


比方說取消暫存文件時的輸入比較繁瑣,可以自己設置一下:

$ git config --global alias.unstage 'reset HEAD --'


這樣一來,下面的兩條命令完全等同:

$ git unstage fileA

$ git reset HEAD fileA


還經常設置last命令:

$ git config --global alias.last 'log -1 HEAD'


看最后一次的提交信息,就變得簡單多了:

$ git last


我們希望運行某個外部命令,而非Git的子命令,這個好辦,只需要在命令前加上 ! 就行。如果你自己寫了些處理 Git 倉庫信息的腳本的話,就可以用這種技術包裝起來。作為演示,我們可以設置用 git visual 啟動 gitk:


$ git config --global alias.visual '!gitk'

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Git 命令行學習筆記 Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,952評論 0 11
  • Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協同...
    __silhouette閱讀 15,948評論 5 147
  • 一、電腦本地初始化一個倉庫 1. git init: 初始化一個電腦上本地倉庫 終端進入項目目錄,輸入: 該命令將...
    dragon_li閱讀 3,000評論 1 4
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,610評論 1 26
  • 文/無憂先生 細雨拍打著干旱的大地 大地忍不住哭泣 分不清淚水還是雨滴 如此淅瀝 大風猛刮著媽媽的雨衣 孩子在身后...
    無憂先生閱讀 215評論 0 1