Git基礎(chǔ)知識(shí)與簡(jiǎn)單用法

本文包括git的簡(jiǎn)介搂捧、基本使用方法、部分原理
這么好用的工具必須安利大家使用滥沫,真的是越使用越覺得其強(qiáng)大的功能侣集。
用過圖形界面和命令行,還是命令行下面使用的得心用手兰绣,推薦大家了解原理后使用命令行世分。

相關(guān)文檔


安裝


Windows

下載相應(yīng)包安裝即可

Linux

  $ sudo yum install git #yum軟件包管理工具
  $ sudo apt-get install git #基于Debian的發(fā)行版

Mac OS X

Terminal 里嘗試首次運(yùn)行 git 命令即可,會(huì)提示你安裝

源碼安裝

命令校驗(yàn)是否安裝成功

$ git --version

概述


概念

  • 直接記錄快照缀辩,而非差異比較
  • 近乎所有操作都是本地執(zhí)行
  • Git 保證完整性
  • Git 一般只添加數(shù)據(jù)
  • 三種狀態(tài)
    • 已提交(committed) 對(duì)應(yīng) .git directory(Repository) 工作區(qū)域
    • 已修改(modified) 對(duì)應(yīng) Working Directory工作區(qū)域
    • 已暫存(staged/Index) 對(duì)應(yīng) Index/Staging Area工作區(qū)域

配置

  • 系統(tǒng)級(jí)別:/etc/gitconfig,通過git config --system命令來配置
  • 用戶級(jí)別:~/.gitconfig或者~/.config/git/config,通過git config --global來配置
  • 倉(cāng)庫(kù)級(jí)別:.git/config
# 設(shè)置用戶名
$ git config --global user.name "xxx"
# 設(shè)置email
$ git config --global user.email "xxx@xx.com"
# 設(shè)置默認(rèn)文本編輯器罚攀,當(dāng)Git需要你輸入信息的時(shí)候會(huì)調(diào)用它
$ git config --global core.editor emacs
# 檢查配置信息
$ git config --list
# 設(shè)置credential cache,省得多次輸入密碼
$ git config --global credential.helper cache

獲取幫助

# 有關(guān)命令的更多信息
$ git <verb> --help
$ git help <verb>
$ man git-<verb>

基礎(chǔ)文件操作


獲取Git倉(cāng)庫(kù)

  • git init將現(xiàn)有目錄和文件初始化一個(gè)Git倉(cāng)庫(kù)雌澄,會(huì)生成一個(gè).git文件夾(這個(gè)文件夾就是本地Git倉(cāng)庫(kù))
  • git clone [url]來克隆現(xiàn)有的倉(cāng)庫(kù)
$ git clone https://github.com/catchance/git-learning.git git-learning

檢查當(dāng)前文件狀態(tài)

$ git status

git status命令的功能

  1. 查看當(dāng)前工作區(qū)的狀態(tài)

忽略文件

創(chuàng)建.gitignore文件來來將某些文件不納入Git管理

# 忽略所有以 .o 或 .a 結(jié)尾的文件
*.[oa]
# Git 忽略所有以波浪符(~)結(jié)尾的文件
*~
  • 匹配模式可以以/開頭防止遞歸
  • 匹配模式可以以/結(jié)尾指定目錄
  • 所有空行或者以 # 開頭的行都會(huì)被 Git 忽略斋泄。
  • 可以使用標(biāo)準(zhǔn)的 glob 模式匹配(指 shell 所使用的簡(jiǎn)化了的正則表達(dá)式。)
    1. 星號(hào)(*)匹配零個(gè)或多個(gè)任意字符镐牺;
    2. [abc] 匹配任何一個(gè)列在方括號(hào)中的字符
    3. 問號(hào)(?)只匹配一個(gè)任意字符
    4. 使用兩個(gè)星號(hào)(*) 表示匹配任意中間目錄a/**/z
    5. 方括號(hào)中使用短劃線分隔兩個(gè)字符炫掐,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配[0-9]

跟蹤文件,將文件添加到暫存區(qū),文件處于暫存狀態(tài)睬涧。

# 跟蹤文件募胃,文件處于暫存狀態(tài) 默認(rèn)是忽略溢出的操作
$ git add <file>...
# 跟蹤文件,文件處于暫存狀態(tài) 同時(shí)對(duì)于刪除的操作進(jìn)行記錄
$ git add --all <file>...
# 將文件撤出未跟蹤的狀態(tài)
$ git reset HEAD <file>...
# 將已經(jīng)修改的文件還原成HEAD索引指向的版本
$ git checkout -- <file>...
  • HEAD指向當(dāng)前所在分支畦浓,將HEAD想象為當(dāng)前分支的別名痹束。
  • git add命令的功能:
    1. 可以用它開始跟蹤新文件
    2. 把已跟蹤的文件放到暫存區(qū)
    3. 合并時(shí)把有沖突的文件標(biāo)記為已解決
  • git checkout --命令
    1. 撤銷對(duì)工作區(qū)修改,這個(gè)命令是以最新的存儲(chǔ)時(shí)間節(jié)點(diǎn)(add和commit)為參照
    2. 覆蓋工作區(qū)對(duì)應(yīng)文件file讶请;這個(gè)命令改變的是工作區(qū)
  • git reset命令
    1. 清空add命令向暫存區(qū)提交的關(guān)于file文件的修改(Ustage)
    2. 這個(gè)命令僅改變暫存區(qū)祷嘶,并不改變工作區(qū)

對(duì)比文件信息

# 對(duì)比工作目錄中的文件和暫存區(qū)的區(qū)別
$ git diff
# 對(duì)比暫存區(qū)的文件和上一次提交的不同
$ git diff --cached
# 效果等同于 --cached命令
$ git diff --staged
# 可以使用diff插件來分析結(jié)果
$ git difftool --tool-help

git show命令

  • 顯示具體的代碼改動(dòng)情況
    # 查看某次commit的修改內(nèi)容
    $ git show <commit-hash-id>
    

提交更新

# 提交更新
$ git commit -m "message"
# 跳過暫存區(qū)直接提交
$ git commit -a -m "message"
  • 提交時(shí)記錄的是放在暫存區(qū)域的快照
  • 每一次運(yùn)行提交操作,都是對(duì)你項(xiàng)目作一次快照,以后可以回到這個(gè)狀態(tài)论巍,或者進(jìn)行比較烛谊。

移除文件

# 將刪除的文件提交 rm <file>
$ git add --all <file>... 提交工作空間中刪除的文件
# 同 git add 命令一樣的
$ git rm <file>
# 如果工作空間不想刪除,而只是想刪除Git跟蹤的文件的話
$ git rm --cached <file>...

移動(dòng)文件

# Git 并不顯式跟蹤文件移動(dòng)操作
# 如果在 Git 中重命名了某個(gè)文件嘉汰,倉(cāng)庫(kù)中存儲(chǔ)的元數(shù)據(jù)并不會(huì)體現(xiàn)出這是一次改名操作
# git mv命令相當(dāng)于 mv xx xxx git rm xx git add xxx
$ git mv <file> <file>

查看提交歷史

git log命令的輸出格式多種多樣丹禀,自行參考幫助文檔。

# 查詢提交歷史
$ git log
# 常用提交信息
$ git log --oneline --graph --all --decorate
# -2 用來顯示最近兩次提交鞋怀,-p用來顯示每次提交的內(nèi)容差異
$ git log -p -2
# 查看某個(gè)文件的修改歷史
$ git log -p <filename>
# 除了顯示基本信息之外双泪,還附帶了每次 commit 的變化
$ git log --stat
# 可以指定使用不同于默認(rèn)格式的方式展示提交歷史
$ git log --pretty=oneline
# 添加了一些ASCII字符串來形象地展示你的分支、合并歷史
$ git log --graph
# 顯示某個(gè)路徑或者文件的提交歷史
$ git log -- <path>

查詢引用變更的記錄

# 查詢操作的相關(guān)記錄
$ git reflog

撤銷操作

# 重新提交命令
# 這個(gè)命令會(huì)將暫存區(qū)中的文件提交,如果快照會(huì)保持不變密似,而你所修改的只是提交信息焙矛。
$ git commit --amend
# 撤銷暫存區(qū)的記錄,工作區(qū)的文件不變辛友。
$ git reset HEAD <path>
# 重置工作區(qū)中的文件薄扁,從暫存區(qū)或者上次提交中重置文件。
$ git checkout -- <path>

遠(yuǎn)程倉(cāng)庫(kù)


查看遠(yuǎn)程倉(cāng)庫(kù)信息

# 列出你指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫
$ git remote  
#會(huì)顯示需要讀寫遠(yuǎn)程倉(cāng)庫(kù)使用的 Git 保存的簡(jiǎn)寫與其對(duì)應(yīng)的 URL废累。
$ git remote -v
# 要查看某一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的更多信息
$ git remote show origin

添加遠(yuǎn)程倉(cāng)庫(kù)

# 添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù)邓梅,同時(shí)指定一個(gè)你可以輕松引用的簡(jiǎn)寫
$ git remote add <shortname> <url>

從遠(yuǎn)程倉(cāng)庫(kù)中抓取與拉取

# 從遠(yuǎn)程倉(cāng)庫(kù)中獲得數(shù)據(jù),它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作
$ git fetch [remote-name]
# 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。
$ git pull [remote-name]

推送到遠(yuǎn)程倉(cāng)庫(kù)

# 要將 master 分支推送到 origin 服務(wù)器時(shí) `git push [remote-name] [branch-name]`
$ git push origin master

遠(yuǎn)程倉(cāng)庫(kù)的移除與重命名

# 修改你的遠(yuǎn)程分支名字
$ git remote rename pb paul
$ git remote
# 移除一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
$ git remote rm paul
$ git remote

打標(biāo)簽

# 過濾顯示定義的標(biāo)簽
$ git tag -l 'v1.8.5*'
# 創(chuàng)建標(biāo)簽
$ git tag -a v1.4 -m 'my version 1.4'
# 輕量標(biāo)簽 輕量標(biāo)簽本質(zhì)上是將提交校驗(yàn)和存儲(chǔ)到一個(gè)文件中 - 沒有保存任何其他信息邑滨。
$ git tag v1.4-lw
# 后期打標(biāo)簽 9fceb2每次提交的校驗(yàn)和
$ git tag -a v1.2 9fceb2  
# 共享標(biāo)簽 默認(rèn)情況下日缨,git push 命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器上。
# 在創(chuàng)建完標(biāo)簽后你必須顯式地推送標(biāo)簽到共享服務(wù)器上掖看。
$ git push origin [tagname]
# 檢出標(biāo)簽 `git checkout -b [branchname] [tagname]`
$ git checkout -b version2 v2.0.0

Git別名

# 取消暫存文件別名
git config --global alias.unstage 'reset HEAD --'
# 輕松地看到最后一次提交
git config --global alias.last 'log -1 HEAD'

Git分支


創(chuàng)建分支

創(chuàng)建分支匣距,就相當(dāng)于在當(dāng)前分支上面創(chuàng)建一個(gè)指針。
Git有一個(gè)HEAD的特殊指針哎壳,指向當(dāng)前所在的本地分支毅待。

# 創(chuàng)建分支
$ git branch testing

stash的常用操作

$ git stash  #保存當(dāng)前的修改
$ git stash pop #彈出stash中最頂端的即stash<0>的內(nèi)容
$ git stash list #查看stash中所有的改動(dòng)
$ git stash apply @stash<id> #彈出stash<id>的修改
$ git stash pop @stash<id> #彈出stash<id>的修改
$ git stash clear  #清除所有的stash
$ git stash drop @stash<id>  #移除stash<id>

切換分支

切換分支的時(shí)候通過保存進(jìn)度(stashing) 和 修補(bǔ)提交(commit amending)
保持好一個(gè)干凈的狀態(tài)。

$ git checkout testing
$ git checkout master
# 創(chuàng)建分支并且切換分支
$ git checkout -b <branchname>

刪除分支

# 刪除分支
$ git branch -d <branchname>

合并分支

fast-forward分支所指向的提交是你當(dāng)前提交的直接上游

# 合并test分支到當(dāng)前分支
$ git merge test

沖突的解決

分支管理(開發(fā)分支流)

  • 長(zhǎng)期分支 用來維護(hù)不同層次的穩(wěn)定性
    1. master分支 只保留完全穩(wěn)定的代碼
    2. develop/next分支 后續(xù)開發(fā)和測(cè)試穩(wěn)定性
    3. pu(proposed updates) 建議更新分支归榕,不成熟的內(nèi)容不適合放入master和develop的
    4. test 測(cè)試部門使用的需要測(cè)試的分支
  • 短期分支尸红,特性分支
    1. issue分支 特性分支
    2. hotfix分支 緊急修復(fù)補(bǔ)丁分支

遠(yuǎn)程分支

$ git remote show <remote>
$ git ls-remote <remote>
  • 推送
      $ git push <remote> <branch>
      # 將本地的 localbranch 分支推送到遠(yuǎn)程倉(cāng)庫(kù)上的 serverfix 分支
      $ git push origin localbranch:serverfix
      # 運(yùn)行 git merge origin/serverfix 將這些工作合并到當(dāng)前所在的分支
      $ git merge origin/serverfix
    
  • 跟蹤分支
      # 查看設(shè)置的所有跟蹤分支
      $ git branch -vv
      # 在自己的 serverfix 分支上工作,可以將其建立在遠(yuǎn)程跟蹤分支之上
      $ git checkout -b serverfix origin/serverfix
      # 上面命令的快捷方式
      $ git checkout --track origin/serverfix
      # 設(shè)置已有的本地分支跟蹤一個(gè)剛剛拉取下來的遠(yuǎn)程分支
      $ git branch -u origin/serverfix
    
  • 拉取
      # 抓取本地沒有的數(shù)據(jù)時(shí)刹泄,它并不會(huì)修改工作目錄中的內(nèi)容
      $ git fetch
      # 相當(dāng)于fetch然后緊接著一個(gè)merge命令
      $ git pull
    
  • 刪除遠(yuǎn)程分支
      # 刪除分支
      $ git push origin --delete serverfix
    

變基rebase

整合分支的兩種方式:rebase和merge
merge:它會(huì)把兩個(gè)分支的最新快照以及二者最近的共同祖先進(jìn)行三方合并外里,合并的結(jié)果是生成一個(gè)新的快照并提交
rebase:提取在分支中所做的補(bǔ)丁和修改,然后在需要合并的分支上再應(yīng)用一次特石。用于把一個(gè)分支的修改合并到當(dāng)前分支盅蝗。rebase用來修改本地私有提交歷史的。

  # git rebase [basebranch] [topicbranch]
  # 在git rebase后面加上參數(shù)<branch>姆蘸,那么會(huì)先執(zhí)行g(shù)it checkout到這個(gè)分支墩莫,如果沒有加分支則表示對(duì)當(dāng)前分支進(jìn)行操作
  $ git rebase master server
  # git add 解決沖突后繼續(xù)rebase
  $ git rebase --continue  
  # --abort參數(shù)來終止rebase的行動(dòng)芙委,并且"mywork" 分支會(huì)回到rebase開始前的狀態(tài)。
  $ git rebase --abort
# 想維持樹的整潔
$ git fetch origin master
$ git rebase origin/master
$ git push

不要對(duì)在你的倉(cāng)庫(kù)外有副本的分支執(zhí)行rebase操作

Git Revert原理:根據(jù)你要回退的提交所做的改動(dòng)做相反的改動(dòng)贼穆,然后重新提交代碼题山,使代碼達(dá)到?jīng)]有這些舊提交所能達(dá)到的狀態(tài)兰粉。

使用git reset是不影響遠(yuǎn)程分支的故痊,一切都在本地發(fā)生。如果回退需要很快影響遠(yuǎn)程分支的玖姑,應(yīng)該使用git revert

規(guī)范


  • 如果某些文件已經(jīng)被跟蹤了愕秫, 再放入到.gitinore可能會(huì)失效, 用以下命令來忽略

    # 忽略文件
    $ git update-index --assume-unchanged filename
    # 撤銷用:
    $ git update-index --no-assume-unchanged filename
    
  • git diff --check 找出可能的空白錯(cuò)誤并將它們列出來

  • 本地分支和遠(yuǎn)程分支的綁定(tracking)焰络,加上 rebase 策略

    [branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
    
  • 解決多個(gè)問題戴甩,最好不要一次提交,根據(jù)任務(wù)分開提交闪彼。

  • 每次提交信息的模板

    修改的摘要(50 個(gè)字符或更少)

    如果必要的話甜孤,加入更詳細(xì)的解釋文字。在
    大概 72 個(gè)字符的時(shí)候換行畏腕。在某些情形下缴川,
    第一行被當(dāng)作一封電子郵件的標(biāo)題,剩下的
    文本作為正文描馅。分隔摘要與正文的空行是
    必須的(除非你完全省略正文)把夸;如果你將
    兩者混在一起,那么類似變基等工具無法
    正常工作铭污。

    空行接著更進(jìn)一步的段落恋日。

    • 句號(hào)也是可以的。

    • 項(xiàng)目符號(hào)可以使用典型的連字符或星號(hào)
      前面一個(gè)空格嘹狞,之間用空行隔開岂膳,
      但是可以依據(jù)不同的慣例有所不同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磅网,一起剝皮案震驚了整個(gè)濱河市谈截,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌知市,老刑警劉巖傻盟,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嫂丙,居然都是意外死亡娘赴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門跟啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诽表,“玉大人唉锌,你說我怎么就攤上這事「妥啵” “怎么了袄简?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泛啸。 經(jīng)常有香客問我绿语,道長(zhǎng),這世上最難降的妖魔是什么候址? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任吕粹,我火速辦了婚禮,結(jié)果婚禮上岗仑,老公的妹妹穿的比我還像新娘匹耕。我一直安慰自己,他們只是感情好荠雕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布稳其。 她就那樣靜靜地躺著,像睡著了一般炸卑。 火紅的嫁衣襯著肌膚如雪既鞠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天矾兜,我揣著相機(jī)與錄音损趋,去河邊找鬼。 笑死椅寺,一個(gè)胖子當(dāng)著我的面吹牛浑槽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返帕,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桐玻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了荆萤?” 一聲冷哼從身側(cè)響起镊靴,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎链韭,沒想到半個(gè)月后偏竟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敞峭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年踊谋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旋讹。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殖蚕,死狀恐怖轿衔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睦疫,我是刑警寧澤害驹,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蛤育,受9級(jí)特大地震影響宛官,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缨伊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一摘刑、第九天 我趴在偏房一處隱蔽的房頂上張望进宝。 院中可真熱鬧刻坊,春花似錦、人聲如沸党晋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽未玻。三九已至灾而,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扳剿,已是汗流浹背旁趟。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庇绽,地道東北人锡搜。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瞧掺,于是被迫代替她去往敵國(guó)和親耕餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容