Git ( git-scm.com/ ) 是開源的分佈式版本控制系統, 是 Linus Torvalds 爲幫助開發人員而設計的軟件系統, 在開發人員中大部分會選擇Git做爲你的代碼管理工具。python
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內都只有三種狀態:服務器
由此咱們看到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地址的對應憑據修改帳戶密碼
複製代碼