1. 程式人生 > >git基礎

git基礎

介紹 長度 -o sha-1 意義 2.0 ast comm hub

一、 獲取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基礎