歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Git及常用命令說明

Git及常用命令說明

日期:2017/2/28 13:46:05   编辑:Linux教程

概述

Git Home: https://git-scm.com/
Git is a version control ststem.  
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
The way that git work:
    Git tracks changes of files.
    work file ---[git add]---> stage(index) ---[commit]---> HEAD-master
    * git add命令實際上就是把要提交的所有修改放到暫存區(Stage),
    * 然後執行git commit就可以一次性把暫存區的所有修改提交到分支。
      * 每次修改,如果不add到暫存區,那就不會加入到commit中。
Git creating a new branch is quick and simple.

修改git用戶名稱和郵箱

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

初始化git倉庫

初始化一個Git倉庫,使用git init命令。

添加文件到git倉庫

添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反復多次使用,添加多個文件;
第二步,使用命令git commit,完成。

查看git倉庫當前狀態

$git status 

如果git status告訴你有文件被修改過,用git diff可以查看修改內容

$git diff
$git diff HEAD -- readme.txt
$git diff HEAD^ -- readme.txt 

顯示從最近到最遠的提交日志

$ git log
$ git log --pretty=oneline
$ git log --graph --pretty=oneline --abbrev-commit (查看分支合並圖)

回退到以前的版本

$ git reset --hard HEAD^     #回退到上一個版本(只能回到以前的版本)
$ git reset --hard HEAD~100  #回退到上100個版本(只能回到以前的版本)
$ git reset --hard c126a6bd08346e59b95a9cfb5dbea53d6ba2f2a4 #回到特定版本號ID的版本(可以回到以前的版本,也可以回到將來的版本,版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了)
$ git reset HEAD readme.txt  #把暫存區的修改回退到工作區(unstage), 用git status可以看到緩存區是干淨的。(這條命令和git checkout -- readme.txt 是相對應的,git checkout -- readme.txt 是將工作區的修改丟棄掉,而git reset HEAD readme.txt 是將緩存區的修改回退到工作區)
[注] --hard:徹底將版本庫、暫存區、工作區的文件恢復到指定的版本庫
     --mixed:將版本庫、工作區的文件恢復到指定的版本庫
     --soft:僅僅將已提交的版本庫恢復到指定的版本庫,一般不用

在Git中,總是有後悔藥可以吃的,Git提供了一個命令git reflog用來記錄你的每一次命令

$ git reflog

讓文件回到最近一次git commit或git add時的狀態

$git checkout -- readme.txt (注意:這裡沒有--,就變成了“切換到另一個分支”的命令)
把readme.txt文件在工作區的修改全部撤銷,這裡有兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區,又作了修改,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態。
git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。

刪除文件

一般情況下,你通常直接在文件管理器中把沒用的文件刪了,或者用rm命令刪了:
$ rm test.txt

這個時候,Git知道你刪除了文件,因此,工作區和版本庫就不一致了,git status命令會立刻告訴你哪些文件被刪除了:
$ git status

現在你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,並且git commit:
$ git rm test.txt
$ git commit -m "remove test.txt"

另一種情況是刪錯了,因為版本庫裡還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本
$ git checkout -- test.txt

僅刪除暫存區的文件

$ git rm --cache <file_name>

分布式工作:添加github遠程倉庫

1. 在本地開發庫生成公鑰和私鑰, 注意秘鑰對的名字不要私自修改,默認為id_rsa*
$ ssh-keygen -t rsa -C "[email protected]"

2. 登陸GitHub,打開“Account settings”,Add SSH Key
   並在本地庫機器測試是否公鑰是否設置成功:ssh -vT [email protected] (調試模式下並禁止虛假用戶)

3. 登錄Github之後,創建在github創建遠程倉庫,Create a new repo

4. 將本地庫的代碼推送到遠程倉庫
   4.1. 關聯遠程庫
   $ git remote add origin [email protected]:kinglyjn/test.git         (git協議)
     或 git remote add origin https://github.com/kinglyjn/test.git (https協議)   

   4.2. 第一次推送master分支的所有內容
   $ git push -u origin master

   4.3. 此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改
   $ git push origin master

   分布式版���系統的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯網都可以正常工作,
   而SVN在沒有聯網的時候是拒絕干活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!

從遠程倉庫克隆

1. 在本地開發庫生成公鑰和私鑰
    $ ssh-keygen -t rsa -C "[email protected]"

2. 登陸GitHub,打開“Account settings”,Add SSH Key

3. 將遠程代碼庫克隆到本地,在本地執行瑞安命令
   $ git clone [email protected]:kinglyjn/test2.git
   如果有多個人協作開發,那麼每個人各自從遠程克隆一份就可以了

創建分支方式工作

查看分支:git branch
創建分支:git branch <branch_name>
切換分支:git checkout <branch_name>
創建和切換分支一步完成:git checkout -b <branch_name> 
合並某分支到當前分支:git merge <branch_name>  (快進模式合並分支,當Git無法自動合並分支時,就必須先解決沖突,解決沖突後再提交合並完成。)
刪除分支:git branch -d <branch_name>
強行刪除分支:git branch -D <branch_name> (如果要丟棄一個沒有被合並過的分支就要用到這條命令)

分支管理策略

a. master分支是非常穩定的,僅用來發布新版本,平時不能在上面干活;
b. dev分支是不穩定的,干活都在dev分支上,到某個時候,比如1.0版本發布時,再把dev分支合並到master上,在master分支發布1.0版本;
c. 你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合並就可以了;
d. 開發一個新功能,最好在dev分支上再新建一個feature-id分支;
e. 解決程序bug,最好在相應的分支上新建一個issue-id分支;
f. 快進模式分支:通常合並分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。
   $ git merge <branch_name>
g. 普通模式分支:合並分支時,加上--no-ff參數就可以用普通模式合並,合並後的歷史有分支,能看出來曾經做過合並。
   $ git merge --no-ff -m "message..." <branch_name>  (因為本次合並要創建一個新的commit,所以加上-m參數,把commit描述寫進去)
h. master時刻與遠程同步;dev是所有成員都在上面工作,需要與遠程同步;feature是否推送取決於你是否和小伙伴合作開發;bug分支沒必要推送到遠程

BUG分支管理

a. 修復bug時,我們會通過創建新的bug分支(eg.issue-101)進行修復,然後合並,最後刪除;
b. 當手頭工作沒有完成時,先把工作現場 git stash 一下,然後去修復bug,修復後,再在相應的分支上git stash pop,回到工作現場。
   $ git stash (儲存工作現場)
   $ git stash list (查看現有的工作現場列表)
   $ git stash pop <stash@{0}>(恢復並刪除工作現場)
   $ git stash apply <stash@{0}> (恢復而不刪除工作現場) 

多人協作

a. 首先,可以試圖 git push origin <branch_name> 推送自己的修改;
   $ git push origin <branch_name>
b. 如果推送失敗,則因為遠程分支比你的本地庫更新,需要先用 git pull 抓取遠程的最新提交,
   抓取遠程的最新提交之後,初始時,你只能看到本地的master分支,如果需要在dev分支上開發,就必須創建遠程庫origin的dev分支到本地
   $ git pull origin <branch_name eg.dev>
   $ git branch --set-upstream dev origin/dev (指定本地dev分支與遠程origin/dev分支鏈接,下次直接git pull就可以,相當於git pull origin dev)
   $ git checkout -b dev origin/dev (相當於git branch dev origin/dev; git checkout dev)
c. 合並遠程的最新提交,如果合並有沖突,則解決沖突,並在本地提交,沒有沖突後,再用git push origin <branch_name> 推送就能推送成功.
[注] 查看遠程庫信息,使用git remote -v;
     本地新建的分支如果不推送到遠程,對其他人就是不可見的;
     git clone 是本地沒有repository時,把整個git項目拷貝下來,包括裡面的日志信息,git項目裡的分支,你也可以直接切換、使用裡面的分支等等;
     git pull相當於git fetch和git merge,是本地有repository時,先從遠程下載git項目裡的文件,然後將文件與本地的分支進行merge。 

Git標簽

發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。將來無論什麼時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。
Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,標簽不能移動),所以,創建和刪除標簽都是瞬間完成的。
a. 創建標簽:git tag <tag_name> (為當前提交HEAD創建標簽)
             git tag <tag_name> 6224937 (為commit id為6224937的版本創建標簽)
             git tag -a <tag_name> -m "message..." (創建標簽並指定標簽信息)
             git tag -s <tag_name> -m "message..." (創建PGP簽名標簽)
b. 刪除標簽:git tag -d <tag_name> 
c. 查看標簽:git tag [--list] (查看標簽列表,按字母順序排序)
             git show <tag_name> (查看標簽詳細信息)

Git配置

配置文件的位置:
repository config:在當前倉庫的.git/config
system config:在git安裝目錄下
global config:在電腦當前用戶主目錄下.gitconfig

配置生效順序:
repository config > system config > global config

忽略特殊文件:
a. 在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件
b. 不需要從頭寫.gitignore文件,GitHub已經為我們准備了各種配置文件,只需要組合一下就可以使用了
c. 所有配置文件可以直接在線浏覽:https://github.com/github/gitignore
d. 忽略的原則:忽略系統自動生成文件、中間編譯或可執行文件(eg.*.class)、敏感信息文件(eg.密碼口令)
e. 有些時候,你想添加一個文件到Git,但發現添加不了,原因是這個文件被.gitignore忽略了,如果你確實想添加該文件,可以用-f強制添加到Git:
   $ git add -f App.class
   $ git check-ignore -v App.class (找出到底哪個規則忽略了不該忽略的App.class文件,該命令用於檢查出錯的忽略文件)

常見參數配置:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
$ git config --global color.ui true (讓git的命令輸出顯示顏色)

配置命令行別名:
$ git config --global alias.st status (告訴Git,以後st就表示status,即git status == git st)
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1' (git log -1 查看最近一次的提交)
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

搭建內部Git服務器

a. 搭建內部git服務器非常簡單,通常只需要一下幾步即可(強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt命令就可以完成安裝):
   1. 安裝git
      $ sudo apt-get install git
   2. 創建git用戶來運行git服務
      $ sudo adduser git
   3. 創建證書登錄
      收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裡,一行一個
      $ cat id_rsa.pub >> ~/.ssh/authorized_keys
   4. 初始化git倉庫(假定是在~/gitrepors文件夾中創建sample.git裸倉庫),然後把owner改為git
      創建裸倉庫,裸倉庫沒有工作區,因為服務器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務器上去改工作區,
      並且服務器上的Git倉庫通常都以.git結尾
      $ sudo chown -R git:git sample.git
   5. 禁用shell登錄
      出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成
      找到類似下面的一行:
      git:x:1001:1001:,,,:/home/git:/bin/bash
      更改為:
      git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
      這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因為我們為git用戶指定的git-shell每次一登錄就自動退出   
   6. 克隆遠程倉庫
      $ git clone [email protected]:~/gitrepors/sample.git
      剩下的推送就簡單了
b. 如果團隊很小,把每個人的公鑰收集起來放到服務器的~/.ssh/authorized_keys文件裡就是可行的;
   如果團隊有幾百號人,就沒法這麼玩了,這時,可以用Gitosis來管理公鑰。
c. 要像SVN那樣變態地控制權限,用Gitolite。

Git 教程系列文章

GitHub 使用教程圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm

Git使用圖文詳細教程 http://www.linuxidc.com/Linux/2016-11/136781.htm

Ubuntu Git安裝與使用 http://www.linuxidc.com/Linux/2016-11/136769.htm

Git 標簽管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm

Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm

Git 遠程倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm

Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm

Git 服務器搭建與客戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm

Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm

分享實用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm

Git從入門到學會 http://www.linuxidc.com/Linux/2016-10/135872.htm

Git基本操作詳解 http://www.linuxidc.com/Linux/2016-10/135691.htm

Git 的詳細介紹:請點這裡
Git 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved