摘要
本文主要介紹git常用命令的使用方法,同時介紹一些常見問題的處理方法,持續更新中…
git命令通用選項
大多數git命令都適用的選項列表如下:
-v, --verbose show hash and subject, give twice for upstream branch
-q, --quiet suppress informational messages
-t, --track set up tracking mode (see git-pull(1))
--set-upstream change upstream info
-u, --set-upstream-to <upstream> change the upstream info
--unset-upstream Unset the upstream info
--color[=<when>] use colored output
-r, --remotes act on remote-tracking branches
--contains <commit> print only branches that contain the commit
--abbrev[=<n>] use <n> digits to display SHA-1s
常用命令
git help
使用方式如下,其中command_name 具體使用的時候替換成要查詢的命令名。
git help <command_name>
git help 命令的輸出結構(以輸入git help help為例):
NAME(命令名稱)git-help - 顯示git有關的幫助信息SYNOPSIS(梗概)(相同的option選項會放在同一個[]中,許多命令提供了簡寫形式)git help [-a|--all] [-g|--guide] [-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]DESCRIPTION(描述)help命令使用的一些描述(包括如何使用、使用注意事項以及如何能最高效的得到你想要的結果)OPTION(選項)對具體的option選項(即SYNOPSIS中中括號展示出來的選項)具體的解釋CONFIGURATION VARIABLES關于該命令的可選配置(即該命令在.gitconfig文件中可以進行的一些配置操作)
首次使用,可以輸入git help,該命令會展示一些使用git的總體幫助信息,展示如下:
git命令使用的不同場景:創建一個git工作區 (萬里長征的第一步)clone 克隆分支init 創建一個新的git倉庫或者重新初始化一個已經存在的git倉庫(放心,在一個已經存在的git倉庫中執行git init命令是安全的,執行該命令的主要原因是為了快速挑選出新近添加的模版或者使用驚醒倉庫移動)針對當前分支的操作 (詳情請看:git help everyday)add 將文件添加到git的索引中(方便提交)mv 將文件(目錄等)進行移動或重命名reset 將當前分支的HEAD(最新提交)Reset到指定的commitrm 將文件從工作樹和工作索引中移除檢查歷史及狀態的相關命令(詳情請看: git help revisions)bisect Find by binary search the change that introduced a buggrep Print lines matching a patternlog Show commit logsshow Show various types of objectsstatus Show the working tree statusgrow, mark and tweak your common historybranch 查詢、創建或刪除分支checkout 切換分支或者恢復當前工作區的文件commit 將更改記錄到倉庫,及本地提交diff 比較不同提交(分支和工作目錄)之間的差異等merge 將開發記錄合并rebase 將本地提交放在提交記錄的頂部(及記錄棧棧頂)具體可查看git rebase 中的示例tag 創建、查詢、刪除或核對一個用GPG協議簽名的Tagcollaborate (see also: git help workflows)fetch 拉取更新,不合并pull 拉取更新并合并push 推送更新到相關分支git help -a 列出所有git命令(方便查看有哪些git命令)
git help -g 列出所有概念性的指導(很有用)
git add
git add支持以通配符形式的添加文件
git add . 添加當前目錄所有改變(修改、刪除、新增)的文件信息到索引庫(常用)
git add -u . 添加當前目錄所有修改、刪除的文件信息到索引庫,不處理untracked文件
git add -A . 添加當前目錄所有修改、刪除的文件信息導索引庫,并將untracked文件添加到索引庫
git add -i . 交互式添加當目錄所有修改、刪除、新增的文件信息到索引庫
git add -i . 輸入之后,會進入一個子命令系統,會列出當前工作目錄所有tracked和untracked的文件信息,同時會在下方列出以下八個子命令:
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
這八個子命令都是見名知意的,使用方式都是輸入相應子命令后,列出帶序號的文件列表,選擇要操作的文件序號(可多選),執行命令,顯示命令結果,之后按回車鍵,返回子命令系統目錄。
git push
首次使用git push命令(即直接輸入git push),git 會提示設置set upstream,其實就是讓你設置本地分支同遠程分支見的對應關系,建立跟蹤關系的方法:
-
建立分支時采用 —track,如:
git branch --track local_branch origin/remote_branch_name 執行之后,本地分支local_branch 和 遠程分支remote_branch_name間就建立了跟蹤關系
-
使用—set-upstream(相當于修改項目根目錄.get文件夾下的config文件),如:
git branch --set-upstream test_branch origin/test_branch
-
push操作時使用—set-upstream,如:
git push origin --set-upstream test_bransh:origin/test_branch
push命令具體分析:
git push -u origin local_branch:remote_branch 推送成功后,local_branch和remote_branch間就存在對應關系了;
git push --prune(中文意思裁剪)推送之后,如果本地分支不存在了,同名的遠程分支也將被刪除
git push -n 模擬推送,除了真正的將更新推送過去這件事不干外,其他push會發生的操作都進行了
git push --delete remote_branch_name刪除遠程分支remote_branch_name(效果同git push origin :remote_branch_name)
git push --all 推送所有分支
git push --quiet推送之后不現實輸出結果,除非發生了錯誤
git push --progress推送之后顯示推送進度
push命令的一些便捷操作:
git push將當前的分支推送到關聯的遠程分支,沒有的話git會予以提示;
git push origin同上,沒有的話會報錯
git push origin :將當前的分支推送到匹配的遠程分支
git push origin master將master分支推送到遠程的master分支,如果遠程沒有,則會創建相同名稱的遠程分支
git push origin HEAD將當前分支推送到相同名車個的遠程分支
git merge
git merge 操作需要操作著熟悉vim編輯器,由于自己使用的較少,顧不做描述,建議采用GUI環境來進行Merge操作(通常就是解決沖突)
待我熟悉了vim,我會不全的。
git checkout
-
git checkout origin/remote_branch_name,運行該命令會處于HEAD Detached狀態,原因是HEAD不能指向遠程分支,它只能指向本地的某個commit或者本地分支。當"git checkout 遠程分支",而本地又沒有這個分支,HEAD就會直接指向遠程分支指向的commit了,HEAD指向commit就會進入detached HEAD state。這個以后只要運行以下命令即可:
git checkout -b 分支名// 運行完之后,在利用git push將新建的本地分支和上面的分支 // 關聯起來即可
git pull
首次使用git pull命里該,效果同首次使用git push命令相同。在默認的git pull選項中,該命令相當于執行以下命令組:
git fetch remote
git merge FETCH_HEAD
使用git pull —rebase時,相當于執行以下命令組:
git fetch remote
git rebase
git pull具體分析
pull命令本身只有三個option選項(-q, -v, —[no-]recurese-submodules),但由于pull命令是fetch和merge兩個命令的組合,使用pull命令時要注意fetch命令和merge命令的一些注意事項。
git rebase
俗稱變基操作,舉個栗子來說明(來源于git文檔)
Assume the following history exists and the current branch is "topic":A---B---C topic/D---E---F---G masterFrom this point, the result of either of the following commands:git rebase mastergit rebase master topicwould be:A'--B'--C' topic/D---E---F---G master
我的理解就是,將并行兩個commit記錄(采用新的commit來)串行處理。
rebase過程中如果存在沖突,先解決沖突,然后采用git add .將更改的文件添加到索引庫,在繼續rebase操作(無需提交),具體命令如下:
git rebase master
git rebase master topic(或者采用git pull --rebase)if(conflicts occures) {First, resolve the conflicts;(實際上就是一些merge操作)Then, git add .(添加merge修改的文件)Finally, git rebase --continue
}
變基操作完成。
rebase過程中如果想放棄變基操作,可采用如下命令:
git rebase --abort該命令會放棄變基,讓操縱的回到之前的狀態
還有其他選項,會在使用過程中陸續添加
git log
顯示提交記錄,其選項較多,大多是美化log輸出、設置log輸出格式、設置log輸出范圍等
git log --follow <filePath>顯示特定文件的歷史更改記錄
git log -g顯示所有的記錄(包括丟失的),用來做數據恢復很方便,等同于命令git reflog
git log <revirsion range>顯示已定范圍的log
git log --merges顯示所有的merge記錄
git branch
展示、創建或刪除分支
git branch列出所有本地分支
git branch -a 列出所有遠程分支和本地分支
git branch -r列出所有遠程分支
git branch -d local_branch_name刪除本地分支(對local_branch_name分支的合并狀態有要求,必須完全合并)
git branch -f branch_name創建分支branch_name,如果branch_name存在,則重置(不使用-f的區別就是如果branch_name存在則重用branch_name分支
git branch -D(shortcut for --delete --force)刪除本地分支(對local_branch_name分支的合并狀態無要求,相當于強刪)
git branch -m old_branch_name new_branch_name重命名old_branch_name為new_branch_name(對old_branch_name分支的merge狀態有要求)
git branch -M old_branch_name new_branch_name重命名old_branch_name為new_branch_name(對old_branch_name強行重命名)
git branch --color=[always, never, auto] color_branch_name高亮顯示color_branch_name這個分支
git config
用來配置倉庫或全局的配置選項
// git 全局配置命令
git remote
該命令用來管理已經跟蹤的庫,常見用法:
git remote [-v | --verbose]git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>git remote rename <old> <new>git remote remove <name>git remote set-head <name> (-a | --auto | -d | --delete | <branch>)git remote set-branches [--add] <name> <branch>...git remote get-url [--push] [--all] <name>git remote set-url [--push] <name> <newurl> [<oldurl>]git remote set-url --add [--push] <name> <newurl>git remote set-url --delete [--push] <name> <url>git remote [-v | --verbose] show [-n] <name>...git remote prune [-n | --dry-run] <name>...git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
- 如下將本地庫添加到遠程倉庫
git remote add origin https://github.com/Rainmonth/JavaLearn.git
git push -u origin maste
git 大文件提交
參考文章
// GitHub 對提交的文件大小有限制,要小于 100m,即使使用了上面的 git global
常見問題
中文文件名在git中顯示亂碼
原因是因為git中文默認以\xxx八進制形式展現,會對對0x80以上的字符進行quote,只要將core.quotepath設置為false即可解決問題
git config --global core.quotepath false
恢復已刪除的的分支、會見或丟失的commit
前提是存在恢復的可能性,以下情況不能恢復:
丟失的分支或commit信息沒有被git gc清除,一般情況下,gc對那些無用的object會保留很長時間后才清除的。
恢復方法,具體步驟如下:
- 執行git reflog(或git log -g)命令,查看所有歷史操作信息,得到要恢復的commit的commit id;
- 執行git branch recover_branch_name commit id命令,創建一個恢復分支;
- 將恢復分支合并到當前工作分支,打完收工。
忽略已經跟蹤的文件
假設已經跟蹤的文件為git.txt,執行以下代碼即可
git rm --cached
git update-index --assume-unchanged git.txt
git update-index --no-assume-unchanged git.txt
常用工作流程
重要概念
常用git IDE推薦
SourceTree