GIT的簡單理解與經常使用命令總結

什麼是git?

Git 是一個免費的開源分佈式版本控制系統,它的設計目的是爲了速度和效率的處理從小型到大型的項目;Git 能夠幫咱們管理咱們的代碼,記錄歷史,只要代碼提交到 Git 上就永久不會丟失,能夠隨時 「穿越」(回到以前的某一個版本);能夠多端共享,團隊協做中,多我的操做了同一個文件時,能夠實現自動合併(模塊化,組件化)、標記衝突,擁有強大的分支管理系統。git

Git 與 SVN 的區別

SVN:集中式,須要一臺中央服務器,全部代碼的拉取和提交都是在中央服務器,一旦中央服務器或者網絡出現故障,則不能拉取和提交代碼,須要不斷去備份中央服務器,防止代碼丟失。緩存

Git:分佈式,有一箇中央服務器的同時,每一個開發者本地都有本身的本地倉庫,擁有完整的版本庫,不用擔憂代碼丟失,Git 存儲的是代碼變化的快照,更新代碼的速度要比 SVN 更快。服務器

Git 工做區、暫存區和版本庫

  • 工做區: 就是你在電腦裏能看到的目錄。
  • 暫存區: 英文叫stage, 或index。通常存放在 ".git目錄下" 下的index文件(.git/index)中,因此咱們把暫存區有時也叫做索引(index)
  • 版本庫: 工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。

下面這個圖展現了工做區、版本庫中的暫存區和版本庫之間的關係:網絡

圖片描述

圖中左側爲工做區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區(stage, index),標記爲 "master" 的是 master 分支所表明的目錄樹。app

圖中咱們能夠看出此時 "HEAD" 實際是指向 master 分支的一個"遊標"。因此圖示的命令中出現 HEAD 的地方能夠用 master 來替換。分佈式

圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 ".git/objects" 目錄下,裏面包含了建立的各類對象及內容。模塊化

當對工做區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。組件化

當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。學習

當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。fetch

當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除文件,工做區則不作出改變。

當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。

當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。

git基本操做

工做區上的操做命令

提交
  1. 提交工做區全部文件到暫存區:git add .
  2. 提交工做區中指定文件到暫存區:git add <file1> <file2> ...;
  3. 提交工做區中某個文件夾中全部文件到暫存區:git add [dir];
撤消
  1. 刪除工做區文件,而且也從暫存區刪除對應文件的記錄:git rm <file1> <file2>;
  2. 從暫存區中刪除文件,可是工做區依然還有該文件:git rm --cached <file>;
  3. 取消暫存區已經暫存的文件:git reset HEAD <file>...;
  4. 撤銷上一次對文件的操做:git checkout --<file>。要肯定上一次對文件的修改再也不須要,若是
    想保留上一次的修改以備之後繼續工做,可使用stashing和分支來處理;
  5. 隱藏當前變動,以便可以切換分支:git stash;
  6. 查看當前全部的儲藏:git stash list;
  7. 應用最新的儲藏:git stash apply,若是想應用更早的儲藏:git stash apply stash@{2}
    從新應用被暫存的變動,須要加上--index參數:git stash apply --index;
  8. 使用apply命令只是應用儲藏,而內容仍然還在棧上,須要移除指定的儲藏:git stash drop stash{0};若是使用pop命令不只能夠從新應用儲藏,還能夠馬上從堆棧中清除:git stash pop;
撤銷修改

a. 撤銷工做區的修改,不影響緩存區

$ git checkout -- [file1] [file2]
$ git checkout -- .

b. 撤銷緩存區的修改,將修改內容放回工做區,與工做區後期修改合併(clean 或者合併2處修改)

$ git reset HEAD xxx(文件名)
$ git reset HEAD .
「儲藏」和「恢復」工做現場
$ git stash
$ git stash list 查看
$ git stash apply    stash內容並不刪除
$ git stash pop        恢復的同時把stash內容也刪了
$ git stash drop  (.......)

暫存區上的操做命令

提交文件到版本庫
  1. 將暫存區中的文件提交到本地倉庫中,即打上新版本:git commit -m "commit_info";
  2. 將全部已經使用git管理過的文件暫存後一併提交,跳過add到暫存區的過程:git commit -a -m "commit_info";
  3. 提交文件時,發現漏掉幾個文件,或者註釋寫錯了,能夠撤銷上一次提交:git commit --amend;
查看信息
  1. 比較暫存區與上一版本的差別:git diff --cached;
  2. 指定文件在暫存區和本地倉庫的不一樣:git diff <file-name> --cached;
  3. 查看提交歷史:git log;參數-p展開每次提交的內容差別,用-2顯示最近的兩次更新,如git log -p -2;
tag標籤
  1. 建立標籤:git tag <name>
  2. 建立帶有說明的標籤: git git tag -a <標籤名> -m "<註釋>"
  3. 查看標籤:git tag
  4. 刪除本地標籤:git tag -d <標籤名>

遠程操做

  1. 推送代碼到遠程:git push
  2. 獲取遠程分支:git fetch origin <分支名>
  3. 刪除遠程分去名: git push origin --delete <遠程的分支名>
  4. 推送標籤到遠程:git push origin <標籤名>
  5. 刪除遠程標籤:git push origin --delete <標籤名>

【注】本文章借鑑了網上一些文章,系統學習能夠參考廖雪峯GIT教程

相關文章
相關標籤/搜索