【Git 學習筆記】Git 入門教程

    Git 官網https://git-scm.com/

    下載傳送門https://git-scm.com/downloads

    官網Book(中文版)https://git-scm.com/book/zh/v2

    Git是最流行的分佈式版本控制系統,Git是Linus用C語言開發的,所以速度是非常快的也很穩定。

    所有的版本控制系統,其實只能跟蹤文本文件的改動,比如 TXT 文件,網頁,所有的程序代碼等等,Git 也不例外。

    Git 項目一般包括Git 倉庫、工作目錄以及暫存區域:

  • Git 倉庫目錄是 Git 用來保存項目的元數據和對象數據庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裏的數據。
  • 工作目錄是對項目的某個版本獨立提取出來的內容。 這些從 Git 倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改。
  • 暫存區域是一個文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中。 有時候也被稱作"索引",不過一般說法還是叫暫存區域。

    基本的 Git 工作流程如下:

  1.     在工作目錄中修改文件。
  2.     暫存文件,將文件的快照放入暫存區域。
  3.     提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄

 

一、創建版本庫 

    1、新建一個空文件夾,作爲版本庫的倉庫

$ mkdir Git_Learn
$ cd Git_Learn

    2、爲了更好的使用git,git 中添加全局的用戶名username和郵箱email

$ git config --global user.name "holysll"

$ git config --global user.email "[email protected]"

    3、通過git init 命令把這個目錄變成 Git 可以管理的倉庫,用ls 或者 ll命令可以看到隱藏的.git文件

$ git init
$ ls

    4、在目錄下新建一個文件test.py ,並用git add test.py 命令添加到倉庫 或者使用 git add .  添加目錄下的所有文件到倉庫其中後面點之前有空格。

$ touch test.py
$ git add .
$ git add test.py

    5、通過git commit -m "xxxx" 提交到倉庫,其中 -m 後面輸入的是本次提交的說明 

$ git commit -m "test.py"

    6、通過git status  查看倉庫狀態

$ git status

    7、通過git diff test.py 查看看尚未暫存的文件的修改內容

$ git diff test.py
$ git diff --cached  # 查看已暫存的將要添加到下次提交裏的內容
$ git diff HEAD --file # 查看工作區和版本庫裏面最新版本的區別

 8、通過 git log 查看提交歷史記錄

# 查看提交歷史記錄
$ git log 

# 顯示最近兩次提交內容差異,-p顯示每次提交的內容差異,-2 顯示最近兩次提交
$ git log -p -2 

# 每次提交的簡略的統計信息
$ git log --stat

# 只顯示 --stat 中最後的行數修改添加移除統計
$ git log --shortstat

# 僅在提交信息後顯示已修改的文件清單
$ git log --name-only

# 顯示新增、修改、刪除的文件清單
$ git log --name-status

# 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符
$ git log --abbrev-commit

# 使用較短的相對時間顯示(比如,“2 weeks ago”)
$ git log --relative-date

# 使用其他格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)
$ git log --pretty

# 將每個記錄提交放在一行顯示
$ git log --pretty=oneline 

# 用format 固定格式顯示提交記錄
$ git log --pretty=format:"%h - %an, %ar : %s"

# 用ASCII 圖形更形象地展示你的分支、合併歷史
$ git log --pretty=format:"%h %s" --graph

# 列出所有最近兩週內的提交
$ git log --since=2.weeks

# 僅顯示指定時間之後的提交
$ git log --after
$ git log --since

# 僅顯示指定時間之前的提交
$ git log --before
$ git log --until

# 僅顯示指定提交者相關的提交
$ git log --committer

# 僅顯示添加或移除了某個關鍵字的提交
$ git log -S

# 找出添加或移除了某一個特定函數的引用的提交
$ git log -Sfunction_name

# 用 --author 選項顯示指定作者的提交
$ git log --author

# 用 --grep 選項搜索提交說明中的關鍵字
$ git log --grep

        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 倉庫中,2008 年 10 月期間,Junio Hamano 提交的但未合併的測試文件,可以用下面的查詢命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t

    9、通過 git reflog 查找命令歷史記錄(重返未來)

$ git reflog

    10、確實要從版本庫中刪除該文件,那就用命令git rm 刪掉,並且git commit 

$ git rm test.py
$ git commit -m "remove test.py"

# 刪除 log/ 目錄下擴展名爲 .log 的所有文件
$ git rm log/\*.log 

# 刪除以 ~ 結尾的所有文件   
$ git rm \*~   

    11、文件重命名

$ git mv test test1

 

 

二、版本回退 

    有的時候存在誤刪,誤操作等情況或者是遺漏一些代碼、文件之類的,或者提交信息錯誤。這時,我們想回退到以前版本,或者撤銷操作。

    1、撤銷操作

    有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend 選項的提交命令嘗試將暫存區中的文件重新提交,如果自上次提交以來你還未做任何修改,那麼快照會保持不變,而你所修改的只是提交信息:

$ git commit --amend

    2、取消暫存的文件

# 版本回退(HEAD指向的版本就是當前版本)
$ git rest --hard HEAD^      會退到上一個版本
$ git rest --hard HEAD^^     會退到前兩個版本
$ git rest --hard HEAD~100   會退到前100個版本
$ git reset --hard <commit id>  根據commit id回退到某個版本

   當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改 :

$ git reset HEAD file
$ git checkout -- file  # 當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時

    雖然在調用時加上 --hard 選項令 git reset 成爲一個危險的命令(譯註:可能導致工作目錄中所有當前進度丟失!),但本例中工作目錄內的文件並不會被修改。 不加選項地調用 git reset 並不危險 — 它只會修改暫存區域。 

    3、撤消對文件的修改(文件在工作區的修改全部撤銷

  • 一種是 file 自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
  • 一種是 file 已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。

    總之,就是讓這個文件回到最近一次git commitgit add時的狀態。

$ git checkout -- file

     你需要知道 git checkout -- [file] 是一個危險的命令,這很重要。 你對那個文件做的任何修改都會消失 - 你只是拷貝了另一個文件來覆蓋它。 除非你確實清楚不想要那個文件了,否則不要使用這個命令。

 

三、分支管理

    1、分支創建

# 創建 dev 分支,然後切換到 dev 分支,-b參數表示創建並切換
$ git checkout -b dev

# 等同於
$ git branch dev
$ git checkout dev

    2、查看當前分支 

$ git branch

   3、切換分支

$ git checkout master

    4、合併分支

# 把 dev 分支的工作成果合併到 master 分支上
$ git checkout master
$ git merge dev

# --no-ff參數,表示禁用 Fast forward ,保留 merge 信息
$ git merge --no-ff -m "keep merge info" dev

     5、刪除分支

$ git branch -d dev

# 強行刪除
$ git branch -D dev

    6、解決衝突

# 手動進行把dev和master衝突的內容進行合併,然後commit 例如:
<<<<<<< HEAD
aaaaaa
=======
bbbbbb
>>>>>>> dev


# 手動修改合併後
aaaaaa & bbbbbb

# 提交
$ git commit -am "conflict fixed"


# 查看到分支合併圖
$ git log --graph

    7、當前工作現場“儲藏”

    當工作只進行到一半,還沒法提交,預計還需要一段時間,但是又要忙着去做其他事情,所以可以把當前工作區的內容存儲起來。

# 儲存當前工作區
$ git stash

# 查看剛纔儲存的位置
$ git stash list

# 恢復之前工作區內容, 並刪除stash 內容
$ git stash apply
$ git stash drop

# 直接恢復同時刪除stash內容
$ git stash pop

# 恢復指定的 stash
$ git stash apply stash@{0}

 

四、遠程倉庫 

    1、克隆遠程倉庫

# 用git clone克隆github上用戶名爲username 倉庫名爲gitname的遠程倉庫
$ git clone https://github.com/username/gitname

    2、查看遠程倉庫

$ git remote
$ git remote show [remote-name] # 查看某一個遠程倉庫的更多信息

# 選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL

$ git remote -v
origin	https://github.com/username/gitname (fetch)
origin	https://github.com/username/gitname (push)

     3、添加遠程倉庫

# 通過 git remote add <shortname> <url> 添加一個新的遠程 Git 倉庫
$ git remote
$ git remote add alg https://github.com/abc/learn_git
$ git remote -v
origin	https://github.com/username/gitname (fetch)
origin	https://github.com/username/gitname (push)
alg	https://github.com/abc/learn_git (fetch)
alg	https://github.com/abc/learn_git (push)

    4、從遠程倉庫中抓取與拉取

# git fetch 相當於是從遠程獲取最新到本地,不會自動merge
$ git fetch [remote-name]

# git pull:相當於是從遠程獲取最新版本並merge到本地
$ git pull [remote-name]

    在實際使用中,git fetch更安全一些 

     5、推送到遠程倉庫

# -u參數,Git 不但會把本地的 master 分支內容推送的遠程新的 master 分支,還會把本地的 master 分支和遠程的 master 分支關聯起來,在以後的推送或者拉取時就可以簡化命令

$ git push -u origin master

     6、遠程倉庫的移除與重命名

# 使用 git remote rename 去修改一個遠程倉庫的簡寫名
$ git remote rename alg aaa   # 把遠程倉庫alg重命名爲aaa

# 刪除遠程倉庫aaa
$ git remote rm aaa

 

    參考來源:https://git-scm.com/book/zh/v2

                      https://www.liaoxuefeng.com/wiki/896043488029600

                      https://morvanzhou.github.io/tutorials/others/git/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章