Git經常使用命令

git是目前世界上最早進的分佈式版本控制系統, 它由Linux的創始人Linus在2005年建立, 建立之初, Linus是爲了解決Linux系統的代碼管理問題, 因爲Linux是開源的, 全世界的熱心志願者均可以編寫Linux代碼, 可是代碼版本管理維護愈來愈困難, 所以, git誕生了.php

集中式vs分佈式

集中式版本控制系統的版本庫是存放在中央服務器的, 編寫代碼時, 須要先從中央服務器 checkout代碼到本地, 編寫完成後, 再把代碼從本地 push到中央服務器, 集中式版本控制系統最大的毛病就是必須聯網才能工做, 在網絡較差的地方或者沒有網絡那就沒辦法工做了.

而分佈式版本控制系統是不存在所謂"中央服務器" 的, 每一個人的電腦都是一個完整的版本庫. 其實,爲了方便交換你們的修改, 分佈式版本控制系統也有一個充當"中央服務器"的電腦. 集中式版本控制系統的表明是 SVN, CVS等. 分佈式版本控制系統的表明就是咱們今天的主角 GIT了.

git安裝

安裝過程很簡單, 到官網下載安裝包, 雙擊安裝就能夠了(個人電腦是window, 所以這個安裝包也僅考慮到window64位版本), 安裝成功後, 在任意文件夾下右鍵能夠看到git Bash代表安裝成功了. 安裝完成後, 右鍵打開git bash設置本臺機器使用git時用戶的名稱和郵箱html

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
複製代碼

這個操做僅須要設置一次git

建立版本庫

# 在當前目錄新建一個Git代碼庫
$ git init

# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]

# 下載一個項目和它的整個代碼歷史
$ git clone [url]
複製代碼

配置

在項目目錄下能夠經過常見.gitignore文件來設置配置規則windows

  • 空格不匹配任意文件,可做爲分隔符,可用反斜槓轉義
  • 以「#」開頭的行都會被 Git 忽略。即#開頭的文件標識註釋,可使用反斜槓進行轉義。
  • 以斜槓"/"開頭表示目錄;"/"結束的模式只匹配文件夾以及在該文件夾路徑下的內容,可是不匹配該文件;"/"開始的模式匹配項目跟目錄;若是一個模式不包含斜槓,則它匹配相對於當前 .gitignore 文件路徑的內容,若是該模式不在 .gitignore 文件中,則相對於項目根目錄。
  • 以星號"*"通配多個字符,即匹配多個任意字符;使用兩個星號"**" 表示匹配任意中間目錄,好比a/**/z能夠匹配 a/z, a/b/z 或 a/b/c/z等。
  • 以問號"?"通配單個字符,即匹配一個任意字符;
  • 以方括號"[]"包含單個字符的匹配列表,即匹配任何一個列在方括號中的字符。好比[abc]表示要麼匹配一個a,要麼匹配一個b,要麼匹配一個c;若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配。好比[0-9]表示匹配全部0到9的數字,[a-z]表示匹配任意的小寫字母)。
  • 以歎號"!"表示不忽略(跟蹤)匹配到的文件或目錄,即要忽略指定模式之外的文件或目錄,能夠在模式前加上驚歎號(!)取反。須要特別注意的是:若是文件的父目錄已經被前面的規則排除掉了,那麼對這個文件用"!"規則是不起做用的。也就是說"!"開頭的模式表示否認,該文件將會再次被包含,若是排除了該文件的父級目錄,則使用"!"也不會再次被包含。可使用反斜槓進行轉義。 須要謹記:git對於.ignore配置文件是按行從上到下進行規則匹配的,意味着若是前面的規則匹配的範圍更大,則後面的規則將不會生效;
實例 解釋
# 表示此爲註釋,將被Git忽略
*.a 表示忽略全部 .a 結尾的文件
!lib.a 表示但lib.a除外
/TODO 表示僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目錄下的全部文件,過濾整個build文件夾
doc/*.txt 表示會忽略doc/notes.txt但不包括 doc/server/arch.txt
bin/ 表示忽略當前路徑下的bin文件夾,該文件夾下的全部內容都會被忽略,不忽略 bin 文件
/bin 表示忽略根目錄下的bin文件
debug/*.obj 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo 表示忽略/foo,a/foo,a/b/foo等
a/**/b 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目錄下的run.sh文件
*.log 表示忽略全部 .log 文件
config.php 表示忽略當前路徑的 config.php 文件
/mtk/ 表示過濾整個mtk文件夾
*.zip 表示過濾全部.zip文件

git命令

名詞解釋: Workspace(工做區), Index/Stage(暫存區), Repository(倉庫區), Remote(遠程倉庫)

  1. 增長/刪除文件
# 添加指定文件到暫存區
$ git add [file1] [file2] ...

# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]

# 添加當前目錄的全部文件到暫存區
$ git add .

# 添加每一個變化前,都會要求確認
# 對於同一個文件的多處變化,能夠實現分次提交
$ git add -p

# 刪除工做區文件,而且將此次刪除放入暫存區
$ git rm [file1] [file2] ...

# 中止追蹤指定文件,但該文件會保留在工做區
$ git rm --cached [file]

# 更名文件,而且將這個更名放入暫存區
$ git mv [file-original] [file-renamed]
複製代碼
  1. 代碼提交
# 提交暫存區到倉庫區
$ git commit -m [message]

# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]

# 提交工做區自上次commit以後的變化,直接到倉庫區
$ git commit -a

# 提交時顯示全部diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]

# 重作上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...
複製代碼
  1. 分支
# 列出全部本地分支
$ git branch

# 列出全部遠程分支
$ git branch -r

# 列出全部本地分支和遠程分支
$ git branch -a

# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]

# 新建一個分支,並切換到該分支
$ git checkout -b [branch]

# 新建一個分支,指向指定commit
$ git branch [branch] [commit]

# 新建一個分支,與指定的遠程分支創建追蹤關係
$ git branch --track [branch] [remote-branch]

# 切換到指定分支,並更新工做區
$ git checkout [branch-name]

# 切換到上一個分支
$ git checkout -

# 創建追蹤關係,在現有分支與指定的遠程分支之間
$ git branch --set-upstream [branch] [remote-branch]

# 合併指定分支到當前分支
$ git merge [branch]

# 選擇一個commit,合併進當前分支
$ git cherry-pick [commit]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
複製代碼
  1. 標籤
# 列出全部tag
$ git tag

# 新建一個tag在當前commit
$ git tag [tag]

# 新建一個tag在指定commit
$ git tag [tag] [commit]

# 刪除本地tag
$ git tag -d [tag]

# 刪除遠程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交全部tag
$ git push [remote] --tags

# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]
複製代碼
  1. 查看信息
# 顯示有變動的文件
$ git status

# 顯示當前分支的版本歷史
$ git log

# 顯示commit歷史,以及每次commit發生變動的文件
$ git log --stat

# 搜索提交歷史,根據關鍵詞
$ git log -S [keyword]

# 顯示某個commit以後的全部變更,每一個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature

# 顯示某個文件的版本歷史,包括文件更名
$ git log --follow [file]
$ git whatchanged [file]

# 顯示指定文件相關的每一次diff
$ git log -p [file]

# 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示全部提交過的用戶,按提交次數排序
$ git shortlog -sn

# 顯示指定文件是什麼人在什麼時間修改過
$ git blame [file]

# 顯示暫存區和工做區的差別
$ git diff

# 顯示暫存區和上一個commit的差別
$ git diff --cached [file]

# 顯示工做區與當前分支最新commit之間的差別
$ git diff HEAD

# 顯示兩次提交之間的差別
$ git diff [first-branch]...[second-branch]

# 顯示今天你寫了多少行代碼
$ git diff --shortstat "@{0 day ago}"

# 顯示某次提交的元數據和內容變化
$ git show [commit]

# 顯示某次提交發生變化的文件
$ git show --name-only [commit]

# 顯示某次提交時,某個文件的內容
$ git show [commit]:[filename]

# 顯示當前分支的最近幾回提交
$ git reflog
複製代碼
  1. 遠程同步
# 下載遠程倉庫的全部變更
$ git fetch [remote]

# 顯示全部遠程倉庫
$ git remote -v

# 顯示某個遠程倉庫的信息
$ git remote show [remote]

# 增長一個新的遠程倉庫,並命名
$ git remote add [shortname] [url]

# 取回遠程倉庫的變化,並與本地分支合併
$ git pull [remote] [branch]

# 上傳本地指定分支到遠程倉庫
$ git push [remote] [branch]

# 強行推送當前分支到遠程倉庫,即便有衝突
$ git push [remote] --force

# 推送全部分支到遠程倉庫
$ git push [remote] --all
複製代碼
  1. 撤銷
# 恢復暫存區的指定文件到工做區
$ git checkout [file]

# 恢復某個commit的指定文件到暫存區和工做區
$ git checkout [commit] [file]

# 恢復暫存區的全部文件到工做區
$ git checkout .

# 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變
$ git reset [file]

# 重置暫存區與工做區,與上一次commit保持一致
$ git reset --hard

# 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變
$ git reset [commit]

# 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致
$ git reset --hard [commit]

# 重置當前HEAD爲指定commit,但保持暫存區和工做區不變
$ git reset --keep [commit]

# 新建一個commit,用來撤銷指定commit
# 後者的全部變化都將被前者抵消,而且應用到當前分支
$ git revert [commit]

# 暫時將未提交的變化移除,稍後再移入
$ git stash
$ git stash pop
複製代碼

常見錯誤

  1. 用戶名或密碼錯誤, 項目好好地忽然報錯, 原來是在gitee上從新設置了郵箱地址形成的
$ git push origin master
remote: Incorrect username or password ( access token )
fatal: Authentication failed for 'https://gitee.com/gavin_d/xxxxxx.git/'
複製代碼

方法: 打開電腦的控制面板-> 用戶帳戶 -> 管理windows憑證, 找到普通憑證中本身的賬號信息, 填入正確的用戶名和密碼保存便可bash

  1. 404 Not Found , 修改了用戶名後引起了不少問題
ERROR: Repository not found.
fatal: Could not read from remote repository.

 Please make sure you have the correct access rights
 and the repository exists.
複製代碼

方法: 輸入git remote set-url origin git@gitee.com:xxxxxx/xxxxxx.git, 你的新倉庫地址服務器

參考文獻:網絡

相關文章
相關標籤/搜索