git基礎
一、 獲取git倉庫 :兩種方法
第一種:在現有項目或目錄下導入所有文件到git中
1.在終端進入項目目錄 cd ..
運行git init 來初始化git倉庫
2.在已經存在文件的文件夾中初始化git倉庫
git Add *.C
git Add License
git Commit -M "Initial Project Version"
git add命令用來實現對指定文件的跟蹤,然後執行git commit提交
第二種:從服務器克隆一個現有的git倉庫
git clone https://github.com/woailuo2015/git.git
二、記錄每次更新到倉庫
1.工作目錄下的給個文件只有兩種狀態:已跟蹤或未跟蹤
已跟蹤的文件:指被納入版本控制的文件,在上一次快照中有他們的記錄,在工作一段時間後,他們的狀態可能處於未修改,已修改或已放入緩存區。
未跟蹤的文件:除了已跟蹤的文件之外的其他文件都是未跟蹤的文件,它們即不存在於上次快照的記錄中,也沒有存放暫存區。
初次克隆某個倉庫的時候,工作目錄中的所有文件都是屬於已跟蹤文件,並處於未修改狀態。
2.檢查當前文件狀態
git status -s
新添加的未跟蹤文件前面有??標記
新添加到暫存區中的文件前面有A標記
修改過的文件前面有M標記(M有兩個可以出現的位置:
右邊的M表示該文件被修改了但是沒有放到暫存區,
左邊的M表示該文件被修改了並放到了暫存區)
3.
跟蹤新文件 git add
暫存已修改文件 git add
在提交commit 文件之前,不管你修改多少次這個文件,最後提交的都是你最後git add的這個文件(最新的文件)
4.忽略文件:cat .gitignore
我們創建一個 .gitignore文件,在裏面列出要忽略的文件模式。
文件 .gitignore的格式規範如下:
所有空行或者以#開頭的行都會被git忽略;
可以使用標準的glob模式匹配;
匹配模式可以以(/)開頭防止遞歸;
匹配模式可以以(/)結尾指定目錄;
要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反;
GitHub 有一個十分詳細的針對數十種項目及語言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它.
3.查看已暫存和未暫存的修改
git diff
此命令比較的是工作目錄中當前文件和暫存區快照之間的差異,也就是修改之後還沒有暫存起來的變化內容。
git diff --cached
git diff --staged
這兩個命令效果相同
4.提交更新git commit
每次準備提交前,先用git status看一下是不是都已經暫存起來了,被一切修改過的或者新建的文件都git add過,就可以提交了。
git commit -m " 內容"
這個命令可以提交信息
提交後它會告訴你,這次提交中有多少文件修改過,多少行添加和刪除過。
請記住:提交時記錄的是放在暫存區的快照。任何還未暫存的仍然保持已修改狀態,可以在下次提交時納入版本管理。每一次運行提交操作,都是對你項目做一次快照,以後回到這和狀態,或者進行比較。
5.跳過使用暫存區域
git commit -a
盡管使用暫存區的方式可以精心準備要提交的細節,但是有時候這麽做略顯繁瑣。所以Git提供了一個跳過使用暫存區域的方式,只要在提交的時候,給git commit 加上-a選項,git就會自動把所有已經跟蹤過的文件暫存起來一並提交,從而跳過git add步驟;
6.移除文件
git rm
這個命令後面可以列出文件或者目錄的名字
git rm --cached
這個命令作用:移除git倉庫中的文件,也就是讓文件保存在磁盤,但是不想讓git繼續跟蹤。
7.移動文件
重命名:在git中對文件改名,可以這麽做:
git mv file_from file_to
實際運行git mv file_from file_to命令就相當於運行了下面三條命令:
mv file_from file_to
git rm file_from
git add file_to
8.查看提交歷史 git log
默認不用任何參數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。
git log -p -2
用來顯示每次提交的內容差異
git log --stat
可以看到每次提交的簡略的統計信息
git log --pretty=oneline 或者short 或者full 或者fuller
指定使用不同於默認的方式展示提交歷史
git log --pretty=format:"%h - %an, %ar : %s"
可以定制要顯示的記錄格式。
git log --pretty=format常用的選項列出了常用的格式占位符寫法及其代表的意義。 Table 1. git log --pretty=format 常用的選項
選項 |
說明 |
%H |
提交對象(commit)的完整哈希字串 |
%h |
提交對象的簡短哈希字串 |
%T |
樹對象(tree)的完整哈希字串 |
%t |
樹對象的簡短哈希字串 |
%P |
父對象(parent)的完整哈希字串 |
%p |
父對象的簡短哈希字串 |
%an |
作者(author)的名字 |
%ae |
作者的電子郵件地址 |
%ad |
作者修訂日期(可以用 --date= 選項定制格式) |
%ar |
作者修訂日期,按多久以前的方式顯示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的電子郵件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久以前的方式顯示 |
%s |
提交說明 |
你一定奇怪 作者 和 提交者 之間究竟有何差別, 其實作者指的是實際作出修改的人,提交者指的是最後將此工 作成果提交到倉庫的人。 所以,當你為某個項目發布補丁,然後某個核心成員將你的補丁並入項目時,你就是 作者,而那個核心成員就是提交者。 我們會在 分布式 Git 再詳細介紹兩者之間的細微差別。
Table 2. git log 的常用選項
選項 |
說明 |
-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(後跟指定格式)。 |
9.限制輸出長度
git log --since=2.weeks 顯示最近兩周內的提交
git log --author 顯示指定作者的提交
git log --grep 搜索提交說明中的關鍵字
如果只關心某些文件或目錄的歷史提交,可以在git log選項的最後面指定他們的路徑。因為是放在最後位置的選項,所以用兩根短劃線(--)隔開之前的選項和後面限定的路徑名。
Table 3. 限制 git log 輸出的選項
選項 |
說明 |
-(n) |
僅顯示最近的 n 條提交 |
--since, --after |
僅顯示指定時間之後的提交。 |
--until, --before |
僅顯示指定時間之前的提交。 |
--author |
僅顯示指定作者相關的提交。 |
--committer |
僅顯示指定提交者相關的提交。 |
--grep |
僅顯示含指定關鍵字的提交 |
-S |
僅顯示添加或移除了某個關鍵字的提交 |
10.撤銷操作
git commit --amend
你提交後發現忘記了暫存某些需要的修改,可以向下面這樣操作:
$ git commit -m ‘initial commit‘
$ git add forgotten_file
$ git commit --amend
最終你只會有一個提交:第二次提交將代替第一次提交的結果。
接下來要演示如何操作暫存區域與工作目錄中已修改的文件。
這些命令在修改文件狀態的同事,也會提示如何撤銷操作。
11.取消暫存的文件
git reset
12.撤銷對文件的修改
如果你不想保留對某個文件的修改,如何方便地撤銷修改並將它還原成上次提交時的樣子,
git checkout -- 某文件
這個是一個危險的命令,除非你確定不要這個文件了,否則不要使用這個命令。
如果你仍然想保留對這個文件作出的修改,但是現在仍然需要撤銷,我們將會在git分支介紹保存進度與分支;這些通常是更好的做法。
記住:在git中任何已提交的東西幾乎總是可以恢復的。甚至那些被刪除的分支中的提交或使用 --amend選項覆蓋的提交也可以恢復。然而,任何你未提交的東西丟失後很可能再也找不回來了。
三、遠程倉庫的使用
1.查看遠程倉庫
git remote
git remote -v
這個命令會顯示需要讀寫遠程倉庫使用的git保存的簡寫與其對應的URL。
2.添加遠程倉庫
git remote add <shortname> <url>
git remote add origin https://github.com/woailuo2015/git.git
現在你可以在命令行中使用字符串origin來代替整個URL。
3.拉取遠程倉庫:git fetch origin
這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。執行後,你將會有那個遠程倉庫中所有分支的額引用,可以隨時合並會查看。
git pull
命令會自動抓取人後合並遠程分支到當前分支。
4.推送到遠程倉庫
git push [remote-name] [branch-name]
git push origin master
只有當你有所克隆服務器的寫入權限,並且之前沒有人推送過時,這條命令才能生效。
如果有人先你一步推送了,你只能先將他們的工作拉取下來並將其合並進你的工作後才能推送。
5.查看遠程倉庫
git remote show [remote-name]
git remote show origin
6.遠程倉庫的移除與重命名
git remote rename 來修改遠程倉庫的簡寫名
git remote rename origin og
git remote rm 來移除一個遠程倉庫
git remote rm origin
四、打標簽
git可以給歷史中的某一個提交打上標簽,以示重要
1.列出標簽 git tag
git tag -l ‘v1.8.5*‘ 列出v1.8.5系列的標簽所有信息
2.創建標簽
git使用兩種主要類型的標簽:輕量標簽與附註標簽
輕量標簽:很像一個不會改變的分支--它只是一個特定提交的引用。
附註標簽:是存儲在git數據庫中的一個完整對象。他們是可以被校驗的。
2.1附註標簽
git tag -a v1.4 -m ‘my version 1.4‘
git show 命令可以看到標簽信息與對應的提交信息
git show v1.4
2.2輕量標簽:實質是將提交校驗和存儲到一個文件中:沒有保存任何其他信息。
不需要-a -s -m這些選項
git tag v1.4-lw
2.3 後期打標簽 對過去的提交打標簽
你也可以對過去的提交打標簽。 假設提交歷史是這樣的:
$ git log --pretty=oneline 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch ‘experiment‘ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch ‘experiment‘ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function 4682c3261057305bdd616e23b64b0857d832627b added a todo file 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
現在,假設在 v1.2 時你忘記給項目打標簽,也就是在 “updated rakefile” 提交。 你可以在之後補上標簽。 要 在那個提交上打標簽,你需要在命令的末尾指定提交的校驗和(或部分校驗和):
$ git tag -a v1.2 9fceb02
2.4共享標簽
默認情況下,git push 命令並不會傳送標簽到遠程倉庫服務器上。 在創建完標簽後你必須顯式地推送標簽到 共享服務器上。 這個過程就像共享遠程分支一樣 - 你可以運行 git push origin [tagname]。
$ git push origin v1.5 Counting objects: 14, done. Delta compression using up to 8 threads. Compressing objects: 100% (12/12), done. Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done. Total 14 (delta 3), reused 0 (delta 0) To [email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果想要一次性推送很多標簽,也可以使用帶有 --tags 選項的 git push 命令。 這將會把所有不在遠程倉庫 服務器上的標簽全部傳送到那裏。
$ git push origin --tags Counting objects: 1, done. Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) To [email protected]:schacon/simplegit.git
* [new tag] v1.4 -> v1.4 * [new tag] v1.4-lw -> v1.4-lw
現在,當其他人從倉庫中克隆或拉取,他們也能得到你的那些標簽。
2.5檢出標簽
在 Git 中你並不能真的檢出一個標簽,因為它們並不能像分支一樣來回移動。 如果你想要工作目錄與倉庫中特定 的標簽版本完全一樣,可以使用 git checkout -b [branchname] [tagname] 在特定的標簽上創建一個 新分支:
$ git checkout -b version2 v2.0.0 Switched to a new branch ‘version2‘
當然,如果在這之後又進行了一次提交,version2 分支會因為改動向前移動了,那麽 version2 分支就會和 v2.0.0 標簽稍微有些不同,這時就應該當心了。
五、git別名
Git 並不會在你輸入部分命令時自動推斷出你想要的命令。 如果不想每次都輸入完整的 Git 命令,可以通過 git config 文件來輕松地為每一個命令設置一個別名。 這裏有一些例子你可以試試:
$ 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,可能也會經常使 用其他命令,所以創建別名時不要猶豫。
在創建你認為應該存在的命令時這個技術會很有用。 例如,為了解決取消暫存文件的易用性問題,可以向 Git 中 添加你自己的取消暫存別名:
$ 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 commit 66938dae3329c7aebe598c2246a8e6af90d04646 Author: Josh Goebel <[email protected]> Date: Tue Aug 26 19:48:51 2008 +0800
test for current head Signed-off-by: Scott Chacon <[email protected]>
可以看出,Git 只是簡單地將別名替換為對應的命令。 然而,你可能想要執行外部命令,而不是一個 Git 子命 令。 如果是那樣的話,可以在命令前面加入 ! 符號。 如果你自己要寫一些與 Git 倉庫協作的工具的話,那會很 有用。 我們現在演示將 git visual 定義為 gitk 的別名:
$ git config --global alias.visual ‘!gitk‘
總結
現在,你可以完成所有基本的 Git 本地操作-創建或者克隆一個倉庫、做更改、暫存並提交這些更改、瀏覽你的 倉庫從創建到現在的所有更改的歷史。
git基礎