git常用命令收藏
這個教程將介紹如何將一個新的項目導入到 git 之中,如何修改項目并如何將這些變更與其他開發者分享。
如果你更感興趣如何用 git 取出一個項目,比如,測試軟件的最新版本,你可能更應該看看The Git User’s Manual的前兩章。
首先,記住你可以用 man 來獲取 git 的文檔,比如 "git diff" 的文檔可以用如下命令察看:
$ man git-diff在做任何改動之前,最好把自己的名字和 email 地址介紹給大家,最簡單的方法就是:
$ git config --global user.name "Your Name Comes Here"$ git config --global user.email you@yourdomain.example.com導入一個新項目
假設你有一個名為 project.tar.gz 的 tarball 作為項目的初始內容。你可以如下操作來把它至于 git 版本控制之下。
$ tar xzf project.tar.gz$ cd project$ git initGit 將會如下回復:
Initialized empty Git repository in .git/現在,你已經初始化了工作目錄——你可能已經注意到了名為 ".git" 的一個新目錄了。
下一步就是使用 git-add(1) 命令告訴 git 當前目錄的所有文件 (注意這個點:.) 全是項目的一個快照:
$ git add .這個快照目前存放在一個臨時區域之中,在 git 中稱為 "index"(索引)。使用 git-commit(1) 命令,你可以把 index 的所有內容永久性地存放到軟件倉庫之中:
$ git commit這條命令會向你提示輸入版本變更信息。這樣,你的項目的第一個版本就已經存入 git 之中了。
進行修改
修改一些文件之后,你可以將更新這些內容到 index 之中:
$ git add file1 file2 file3現在,你已經準備就緒,可以提交了。現在你可以使用 git-diff(1) 命令的 –cache 參數:
$ git diff --cached(如果不使用 –cached 參數,git-diff(1)會顯示所有還沒添加進 index 的已經做出的改動。) 你也可以使用 git-status(1)來獲得一些當前狀況的概要信息:
$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: file1# modified: file2# modified: file3#如果你需要進行更多改動,現在就可以進行,然后可以添加到 index 之中。最后,使用如下命令提交改動:
$ git commit這將再次要求你輸入關于這次改動內容的描述性信息,之后記錄下的項目新版本。
此外,如果想省掉提交之前的git add命令,你可以直接用
$ git commit -a這樣會自動檢測所有修改過的文件 (不包括新文件) ,并一氣呵成地將它們添到 index 之中,并提交。
關于提交的描述信息: 雖然這個信息不是必須的,但提交信息描述最好以一行不超過50個字符的概要性信息來開頭,在一個空行之后再進行更多的描述。比如那些將 commit 轉化為 email 的工具就會把這個第一行作為郵件標題,其余的提交內容則放在郵件內部。
Git 跟蹤內容而不是文件
很多版本控制系統提供了一個 "add" 命令用來記錄一個新文件。而 git 的 "add" 命令更加簡單也更加強大: git add既用于新文件也用于新近改動的文件,在所有這些情況下,它在 index 中對所有的文件與狀態進行一次快照,這樣就可以在下一次 commit 命令中進行提交。
Viewing project history
在任何時候,你都可以如下查看所有你進行過的改動
$ git log你可能還想看到每一步改進中的所有完整的 diff ,這可以使用如下命令
$ git log -p瀏覽改動的概要對于獲得每一步修改的情況常常是比較有用的,可以使用如下命令
$ git log --stat --summary管理分支
一個 git 倉庫可以包含多個開發分支。使用如下命令可以建立一個稱為 "experimental" 的新分支
$ git branch experimental如果你運行命令
$ git branch你將可以得到類似下面的已有分支的列表
experimental* master"experimental" 就是你剛剛建立的那個分支,而 "master" 分支則是建立倉庫的時候自動創建的缺省分支,里面的星號表示你當前所在的分支;輸入命令
$ git checkout experimental就可以切換到 experimental 分支。現在修改一個文件,并提交改變,然后重新回到 master 分支:
(edit file)$ git commit -a$ git checkout master你會發現,剛才的變更已經不可見了,這是因為這個改變是發生于 experimental 分支的,而你現在已經回到 master 分支了。
現在,你可以在 master 分支上做一些不同的變更:
(edit file)$ git commit -a這里,兩個分支已經產生不同了,每個分支上都發生了不同的改動。要把 experimental 中的改變也合并到 master 之中,運行命令
$ git merge experimental如果兩者的改變并不沖突,那么就算是完成了。而如果這里有沖突,有問題的文件左邊會顯示出標記,以表明這個文件發生了沖突;
$ git diff上述命令將會列出具體的沖突。一旦你編輯文件解決了沖突,
$ git commit -a這個命令將把合并的結果提交。最終,
$ gitk會顯示出漂亮的圖標以展示歷史變革。
這里你可以使用如下命令刪除 experimental 分支。
$ git branch -d experimental這個命令會確定 experimental 中的所有改動已經在當前分支當中了。
如果你在 crazy-idea 分支中進行開發,然后又后悔了,你可以用如下命令刪除分支
$ git branch -D crazy-idea分支操作十分簡單而且代價低廉,所以適合于嘗試一些東西。
使用 git 進行協作
假設 Alice 在 /home/alice/project 中的 git 倉庫啟動了一個新項目,而在本機中也擁有 home 目錄的 Bob 想要貢獻一些代碼。
他可以以如下工作開始:
$ git clone /home/alice/project myrepo這會新建一個名為 "myrepo" 的目錄,里面包含了 Alice 的倉庫的一份克隆。這份克隆與原始項目完全一致,可以處理自己的一份原始項目歷史。
之后,Bob 進行了一些變更并提交了這些變動:
(edit files)$ git commit -a(repeat as necessary)當他完成的時候,他告訴 Alice 將 /home/bob/myrepo 之中的變動導入到原始倉庫之中。她使用如下命令來完成這一工作:
$ cd /home/alice/project$ git pull /home/bob/myrepo master這會合并 Bob 的 "master" 分支到 Alice 的當前分支。如果 Alice 也已經修改了某些內容,她需要手工修復沖突。(注意,"master" 參數實際上并不是必要的,因為這是缺省分支。)
"pull" 命令包括兩個操作: 從遠端分支中取出改動,然后合并到當前分支之中。
當你只在一個很小的小組里工作的時候,通常不會頻繁地訪問同一個倉庫。通過定義倉庫的快捷方式,可以讓訪問遠程倉庫更方便一些:
$ git remote add bob /home/bob/myrepo這樣,Alice 可以如下用 "git fetch" 命令僅取出改動,而不把它們合并到當前分支之中:
$ git fetch bob和長格式不同,當 Alice 使用 git remote設置的快捷方式從 Bob 的倉庫中獲取內容的時候,取出的內容存儲在一個 remote tracking 分支之中,在本例中是 bob/master。所以,如下操作:
$ git log -p master..bob/master將會列出從 Bob 從 Alice 的主分支中分支出去以后的所有改動。
檢查了這些變動之后,Alice 可以將這些變動合并到自己的 master 分支中:
$ git merge bob/master這個合并也可以通過從自己的 remote tracking 分支中 pull 來做到,如:
$ git pull . remotes/bob/master注意,git pull 總是合并進當前的分支,不論命令行給出的是什么。
之后,Bob 可以如下使用 Alice 的最近改動更新自己的倉庫
$ git pull這里,他不需要給出 Alice 的倉庫的位置;當 Bob 克隆了 Alice 的倉庫的時候,git 在倉庫設置中保存了她的倉庫的位置,即 pull 所使用的位置:
$ git config --get remote.origin.url/home/alice/project(git-clone 創建的完整配置信息可以用 "git config -l" 獲得,git-config(1)的 man page 解釋了所有選項的含義。)
Git 也在 "origin/master" 分支保存了一份 Alice 的主分支的原始拷貝:
$ git branch -r origin/master如果其后 Bob 決定轉到另一臺主機上工作,他還可以通過 ssh 來克隆原始倉庫:
$ git clone alice.org:/home/alice/project myrepo此外,git 本身也有遠程協議,并且可以使用 rsync 或 http,詳細情況可以查看 git-pull(1)的 man page。
Git 也可以使用類似 CVS 的工作方式,使用一個中心倉庫,所有用戶將改動推送到倉庫之中,相關內容可以查閱 git-push(1)的手冊頁或git for CVS users。
瀏覽歷史
Git 的歷史是通過一系列相互關聯的 commit 構成的。我們已經通過 git log 命令看到了這些提交的列表。注意,每個 git log 條目的第一行是那次提交的名稱:
$ git logcommit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7Author: Junio C Hamano <junkio@cox.net>Date: Tue May 16 17:18:22 2006 -0700merge-base: Clarify the comments on post processing.把這個名稱用于 git show 命令,可以得到提交的詳情。
$ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7不過還有其他辦法來指代這次提交。你可以只使用名稱的開始部分,只要它足夠長,保證在所有提交中是惟一的就行了:
$ git show c82a22c39c # the first few characters of the name are # usually enough$ git show HEAD # the tip of the current branch$ git show experimental # the tip of the "experimental" branch每一次提交通常都有一次提交作為 "parent" ,它是項目的前一個狀態:
$ git show HEAD^ # to see the parent of HEAD$ git show HEAD^^ # to see the grandparent of HEAD$ git show HEAD~4 # to see the great-great grandparent of HEAD要注意,合并提交可能會有多個 "parent":
$ git show HEAD^1 # show the first parent of HEAD (same as HEAD^)$ git show HEAD^2 # show the second parent of HEAD你還可以給你的提交一個名字; 命令
$ git-tag v2.5 1b2e1d63ff讓你可以使用 "v2.5" 來指代 1b2e1d63ff。如果你想把這個名字與他人共享 (比如標記一個發布版本),你應該建立一個 "tag" 對象,可能還需要簽署它; 詳情請查看 git-tag(1)的 man page。
任何 git 命令都可以使用上述任何一種名字。比如:
$ git diff v2.5 HEAD # compare the current HEAD to v2.5$ git branch stable v2.5 # start a new branch named "stable" based # at v2.5$ git reset --hard HEAD^ # reset your current branch and working # directory to its state at HEAD^小心使用上述最后一個命令: 這將丟失工作目錄中的所有改動,他還會清除本分支內隨后的所有提交。如果這個分支是包含這些提交的惟一分支,它們將永遠地丟失了。此外,不要對一個公眾可見的、有其他開發者從中 pull 內容的分支使用 "git reset" 命令,這將導致一些不必要的合并來清除其他開發者的歷史信息。如果你需要取消已經推送的改動,可以使用git-revert(1)命令。
git grep 可以在項目的所有版本歷史中尋找字符串,如下命令
$ git grep "hello" v2.5會在版本 v2.5 中尋找所有 "hello" 的蹤跡。
如果你不提供 commit 名稱,git grep 會在你當前的目錄中搜索所有由 git 管理的文件。于是,如下命令
$ git grep "hello"是搜索 git 跟蹤的所有文件的便捷的方式。
很多 git 命令可以處理一組提交,可以通過多種方式來指定版本。這里是一些 git log 的例子:
$ git log v2.5..v2.6 # commits between v2.5 and v2.6$ git log v2.5.. # commits since v2.5$ git log --since="2 weeks ago" # commits from the last 2 weeks$ git log v2.5.. Makefile # commits since v2.5 which modify # Makefile你給出的范圍的上下邊界不一定是嚴格的時間先后關系,比如,"stable-release" 分支可能會在 "master" 分支之后相當長一段時間才會引入同一個提交內容,這樣
$ git log stable..experimental將會列出 expermental 分支之中已經有的,而 stable 分支卻還沒有的提交,而命令
$ git log experimental..stable將會列出 stable 中已有、但 experimental 卻沒有的提交。
"git log" 命令有一個弱點:必須將所有提交在一個列表中呈現出來。當項目歷史中有多個不同開發分支并最終合并到一起時,"git log" 中呈現出來的順序可能沒什么意義。
大部分有大量開發者的項目 (比如 linux kernel 或 git 本身) 都經常合并分支,gitk 可以更好地將這些合并變化展示出來。比如,
$ gitk --since="2 weeks ago" drivers/這個命令允許你瀏覽過去兩個星期中在 "drivers" 目錄之中的任意提交。(注意: 你可以按住 ctrl 鍵然后用 "-" 和 "+" 來調整 gitk 的字體大小。)
最后,大部分命令可以帶有文件名,這可以用于指定某次提交中的某個文件,從而指定某個文件的某個版本:
$ git diff v2.5:Makefile HEAD:Makefile.in你還可以用 "git show" 命令去查看任意文件的任意版本:
$ git show v2.5:Makefile轉載于:https://www.cnblogs.com/cobbliu/archive/2011/11/30/2389003.html
總結
- 上一篇: [转]编程电子书
- 下一篇: ArcMap 水文分析 部分功能