GIT的實用技巧專欄

MedusaSorcerer的博客


專欄目錄

專欄詳情

GIT介紹

Git ( git-scm.com/ ) 是開源的分佈式版本控制系統, 是 Linus Torvalds 爲幫助開發人員而設計的軟件系統, 在開發人員中大部分會選擇Git做爲你的代碼管理工具。python

  • 分支: 從主分支(master)上分離出來的子分支, 從而進行不影響master分支的操做
  • 合併: 你在子分支的修改須要歸併到master的時候就須要將分支合併
  • 衝突: 在不一樣分支對同一文件修改提交後合併會產生衝突, 須要手動解決, 具體體現是在文件內容衝突的地方寫入內容差別
  • 倉庫: 倉庫是你提交代碼後保存代碼的地方, 咱們會有遠程倉庫和本地倉庫之說

GIT差別

Git和其餘版本控制系統的主要差異在於Git只關心文件數據的總體是否發生變化, 而大多數其餘系統則只關心文件內容的具體差別, 這類系統(CVS | Subversion | Perforce | Bazaar...)每次記錄有哪些文件做了更新以及更新的內容。 git

Git並不保存這些先後變化的差別數據, 而Git更像是把變化的文件做快照後記錄在一個內置文件系統中, 每次提交更新時它會縱覽全部文件的指紋信息並對文件做快照, 而後保存一個指向此次快照的索引, 若文件沒有變化, 僅僅是保存上次的快照連接。 算法

在Git中的絕大多數操做都只須要訪問本地文件和資源而不用鏈接網絡, 但若是用CVCS的話, 差很少全部操做都須要鏈接網絡, 由於Git在本地磁盤上就保存着全部當前項目的歷史提交, 因此處理速度極快。 數據庫

數據在保存到Git以前, 全部數據都要進行內容的校驗和計算(checksum), 並將此結果做爲數據的惟一標識和索引, 換句話說, Git不可能在你修改了文件或目錄以後對此一無所知。 這項特性做爲Git的設計哲學, 建在總體架構的最底層, 因此若是文件在傳輸時變得不完整或者磁盤損壞致使文件數據缺失時Git都能當即察覺。 而Git使用 SHA-1 算法計算數據的校驗和, 經過對文件的內容或目錄的結構計算出一個SHA-1哈希值, 做爲指紋字符串, 該字串由 40 個十六進制字符(0-9 | a-f)組成, 實際上全部保存在Git數據庫中的東西都是用此哈希值來做索引的, 而不是靠文件名。 安全

對於任何一個文件, 在Git內都只有三種狀態:服務器

  • 已提交 (committed): 表示該文件已經被安全地保存在本地數據庫中
  • 已修改 (modified): 表示修改了某個文件但尚未提交保存
  • 已暫存 (staged): 表示把已修改的文件放在下次提交時要保存的清單中

由此咱們看到Git管理項目時, 文件流轉的三個工做區域: 工做目錄 | 暫存區域 | 本地倉庫 網絡

官網原文點擊此處查看架構

GIT命令

在三個工做區的基礎上, 咱們實際還有一個 遠程倉庫區, 跟本地倉庫同樣, 只是倉庫位置從本機拓展到了遠程服務器上。 app

Command Descriptions
git add -i 打開一個交互式界面按需求添加文件
git add -p 對同一個文件的多處變化分次提交
git add -u 將本地的(修改, 刪除, 沒有新增)文件添加到暫存區
git add .
git add -A
添加當前目錄的全部文件到暫存區
git add [DirName] 添加指定目錄到暫存區
git add [FileName] ... 添加指定文件到暫存區
git archive 生成一個可供發佈的壓縮包
git blame [FileName] 顯示指定文件是什麼人在什麼時間修改的信息
git branch --set-upstream [Branch] [RemoteBranch] 創建追蹤關係, 在現有分支與指定的遠程分支之間
git branch --track [Branch] [RemoteBranch] 新建一個分支, 與指定的遠程分支創建追蹤關係
git branch -a 列出全部分支
git branch -d [Branch] 強制刪除分支
git branch -m [OldName] [NewName] 本地分支重命名
git branch -r 列出全部遠程分支
git branch [Branch] [Commit] 新建一個分支, 指向指定commit
git branch [Branch] 新建一個分支, 但不切換
git branch 查看本地全部分支
git checkout - 切換到上一個分支
git checkout --track origin/dev 切換到遠程dev分支
git checkout -b [Branch] [tag] 新建一個分支, 指向某個tag
git checkout -b [Branch] 新建一個分支, 並切換到該分支
git checkout . 恢復暫存區的全部文件到工做區
git checkout [Branch] 切換到指定分支, 並更新工做區
git checkout [Commit] [File] 恢復某個commit的指定文件到暫存區和工做區
git checkout [FileName] 恢復暫存區的指定文件到工做區
git checkout [BranchName] 切換分支
git cherry-pick [CommitID] 用於把另外一個本地分支的commit修改應用到當前分支
git clone [URL] 克隆對應項目URL的代碼到本地
git commit --amend -m [message] 代碼沒有任何新變化, 則改寫上一次commit的提交信息
git commit --amend [file1] [file2] ... 重改上一次commit, 幷包括指定文件的新變化
git commit -a -v 通常提交命令
git commit -a 提交當前repos的全部的改變
git commit -am [message] 提交工做區變化的文件直接到倉庫區, 並添加提交描述信息
git commit -m [message] 提交暫存區到倉庫區, 並添加提交描述信息
git commit -v 提交時顯示全部diff信息
git commit [file1] [file2] ... -m [message] 提交暫存區的指定文件到倉庫區, 並添加提交描述信息
git commit 提交
git config --global alias.ci commit
git config --global alias.co checkout
設置git命令的別名
git config --list 顯示Git配置
git config -e [--global] 編輯Git配置文件
git config -l 查看當前配置
git config [--global] user.name "[userName]"
git config [--global] user.email "[email]"
設置用戶信息
git diff --cached [file] 顯示暫存區和上一個commit的差別
git diff --cached
git diff --staged
查看還沒有提交的更新
git diff --shortstat "@{0 day ago}" 顯示今天你寫了多少行代碼
git diff --staged 查看暫存起來的文件(stage)與並未提交(commit)的差異
git diff --stat 查看顯示簡略結果(文件列表)
git diff HEAD 顯示工做區與當前分支最新commit之間的差別
git diff [first-branch]...[second-branch] 顯示兩次提交之間的差別
git diff 顯示暫存區和工做區的差別
git fetch [remote] 下載遠程倉庫的全部變更
git fetch 從遠程獲取最新版本到本地, 不會自動merge
git init [dirName] 新建一個目錄並初始化爲Git本地倉庫
git init 在當前目錄建立一個Git本地倉庫
git log --follow [file]
git whatchanged [file]
顯示某個文件的版本歷史, 包括文件更名
git log --graph 顯示什麼時候出現了分支和合並等信息
git log --oneline 一行顯示一條log
git log --stat 顯示commit歷史, 以及每次commit發生變動的文件
git log -3 查看前3次修改
git log -N --pretty --oneline 顯示過去N次提交
git log -S [keyword] 搜索提交歷史, 根據關鍵詞
git log -p [file] 顯示指定文件相關的每一次diff
git log -p 查看詳細修改內容
git log [tag] HEAD --grep feature 顯示某個commit以後的全部變更, 其"提交說明"必須符合搜索條件
git log [tag] HEAD --pretty=format:%s 顯示某個commit以後的全部變更, 每一個commit佔據一行
git log 顯示當前分支的版本歷史
git ls-files 看已經被提交的
git merge --abort 儘可能回退到merge前的狀態(可能會失敗)
git merge --no-ff <branch_name> 採用no fast forward的合併方式, 這種方式在合併的同時會生成一個新的commit
git merge --squash <branch_name> 將目標分支合併過來但不攜帶commit信息, 執行後最後須要提交一個commit
git merge [branch] 合併指定分支到當前分支
git mv [file-original] [file-renamed] 修改文件名, 而且將這個更名放入暫存區
git pull --rebase 暫存本地變動, 合併遠程最新改動, 合併剛剛暫存的本地變動(不產生無用的merge的同步)
git pull [remoteName] [localBranchName] 拉取遠程倉庫
git pull origin --tags 合併遠程倉庫的tag到本地
git pull 從遠程獲取最新版本並merge到本地
git push --all origin 將全部本地分支都推送到origin主
git push -f origin -f強推, 在遠程主機產生一個"非直進式"的合併(non-fast-forward merge)
git push -u origin master -u指定origin爲默認主機, 後面就能夠不加任何參數使用git push了
git push [remoteName] --delete [branch]
git branch -dr [remote/branch]
刪除遠程分支
git push [remoteName] :refs/tags/[tagName] 刪除遠程tag
git push [remoteName] [localBranchName] 推送遠程倉庫
git push [remote] --all 推送全部分支到遠程倉庫
git push [remote] --force 強行推送當前分支到遠程倉庫, 即便有衝突
git push [remote] --tags 提交全部tag
git push [remote] [branch] 上傳本地指定分支到遠程倉庫
git push [remote] [tag] 提交指定tag
git push origin --tags 上傳本地tag到遠程倉庫
git push origin :heads/[name]
git push origin :[name]
刪除遠程分支
git push origin :refs/tags/[name] 刪除遠程版本
git push origin master:hb-dev 將本地庫與服務器上的庫進行關聯
git rebase --abort 終止rebase, 分支會回到rebase開始前的狀態
git rebase --continue 執行rebase出現衝突解決後, 執行該命令會繼續應用(apply)餘下的補丁
git rebase --skip 跳過當前提交
git reflog 顯示當前分支的最近幾回提交
git remote -v 顯示全部遠程倉庫
git remote add [shortname] [url] 增長一個新的遠程倉庫, 並命名
git remote rm [name] 刪除遠程倉庫
git remote set-url --push [name] [newUrl] 修改遠程倉庫
git remote show [remote] 顯示某個遠程倉庫的信息
git remote show 查看遠程庫
git reset --hard [commit] 重置當前分支的HEAD爲指定commit, 同時重置暫存區和工做區, 與指定commit一致
git reset --hard 完全回退到某個版本, 替換暫存區和工做區, 本地的源碼也會變爲上一個版本的內容
git reset --keep [commit] 重置當前HEAD爲指定commit, 但保持暫存區和工做區不變
git reset --mixed 同不帶任何參數的git reset同樣, 重置暫存區, 但不改變工做區
git reset --soft HEAD~3 引用回退三次(工做區不變, 暫存區不變)
git reset --soft 回退到某個版本, 不改變暫存區和工做區(若是還要提交, 直接commit便可
git reset HEAD HEAD 效果同上, 由於引用重置到HEAD至關與沒有重置
git reset HEAD^ 引用回退一次(工做區不變, 暫存區回退)
git reset [commit] 重置當前分支的指針爲指定commit, 同時重置暫存區, 但工做區不變
git reset [file] 重置暫存區的指定文件, 與上一次commit保持一致, 但工做區不變
git reset 將以前用git add命令添加到暫存區的內容撤出暫存區(至關於git add -A 的反向操做)
git revert -n HEAD 撤銷上一次但不commit
git revert -no-edit HEAD 撤銷上一次並直接使用默認註釋
git revert HEAD 撤銷上一次commit
git revert [commit] 新建一個commit, 用來撤銷指定commit
後者的全部變化都將被前者抵消, 而且應用到當前分支
git rm --cached [file] 中止追蹤指定文件, 但該文件會繼續保留在工做區
git rm -r [floder] 刪除文件夾
git rm [file1] [file2] ... 刪除工做區文件, 而且將此次刪除操做放入暫存區
git shortlog -sn 顯示全部提交過的用戶, 按提交次數排序
git show --name-only [commit] 顯示某次提交發生變化的文件
git show [commit] 顯示某次提交的元數據和內容變化
git show [commit]:[filename] 顯示某次提交時, 某個文件的內容
git show [tag] 查看tag信息
git stash apply 恢復最新保存工做進度, 但不刪除
git stash clear 刪除全部
git stash drop 刪除一個進度, 默認刪除最新的
git stash list 顯示進度列表
git stash pop 恢復最新保存的工做進度, 並將恢復的工做進度從存儲的列表中刪除
git stash push 將文件給push到一個臨時空間中
git stash save "message" 保存進度加說明
git stash 保存當前的工做進度
git status --ignored 顯示被忽略的文件
git status -s 將結果以簡短的形式輸出
git status 查看當前狀態
git submodule add [url] [path] 添加子模塊
git submodule init 初始化子模塊
git submodule update 更新子模塊
git tag -a [name] -m 'yourMessage' 建立帶註釋的tag
git tag -d [tag] 刪除本地tag
git tag -r 查看遠程版本
git tag [name] 建立版本
git tag [tag] [commit] 新建一個tag在指定commit
git tag [tag] 新建一個tag在當前commit
git tag 列出全部tag
git version 獲取git版本

常見錯誤

認證失敗
# 方案一
git config --system --unset credential.helper

# 方案二
->  win+R 打開命令窗口
->  輸入 control
->  用戶帳戶
->  管理你的憑據
->  Windows憑據
-> 找到Git地址的對應憑據修改帳戶密碼
複製代碼
相關文章
相關標籤/搜索