一、背景
在開發(fā)過程中,我們基本都是使用Git進(jìn)行代碼管理,Git命令是必須要會(huì)的,下面就把Git常用命令總結(jié)下來。
二、Git命令
1、init & clone
# 在當(dāng)前目錄新建一個(gè)倉庫
git init
# 在一個(gè)目錄下新建本地倉庫
git init [project-name]
# 克隆一個(gè)遠(yuǎn)程倉庫
git clone [url]
2、config
# 查看配置
git config [--local][--global][--system] --list
# 查看當(dāng)前git環(huán)境詳細(xì)配置
git config -l
# 查看系統(tǒng)config
git config --system --list
# 查看當(dāng)前用戶配置
git config --global --list
# 查看當(dāng)前倉庫配置信息
git config --local --list
# 查看全局賬號
git config --global user.name
# 查看全局郵箱
git config --global user.email
# 修改配置
git config [--local][--global][--system] section.key value
# 設(shè)置當(dāng)前項(xiàng)目的用戶名
git config --local user.name [用戶名]
# 配置當(dāng)前用戶的編碼項(xiàng),可以解決中文編碼問題
git config --global core.quotepath false
# 配置當(dāng)前項(xiàng)目不忽略文件大小寫,git默認(rèn)忽略文件名的大小寫,這點(diǎn)值得注意
git config --local core.ignorecase false
3、remote
# 查看遠(yuǎn)程倉庫地址命令
git remote -v
# 刪除遠(yuǎn)程倉庫地址
git remote remove origin
# 添加遠(yuǎn)程倉庫地址 http://.....
git remote add origin [url]
# 查看remote 地址,遠(yuǎn)程分支,還有本地分支與之相對應(yīng)關(guān)系等信息
git remote show origin
# 刪除那些遠(yuǎn)程倉庫已經(jīng)不存在的分支
git remote prune origin
# 建好 develop 分支的跟蹤中央倉庫分支
git checkout -b develop origin/develop
4、branch
# 創(chuàng)建分支
git branch [branch-name]
# 查看當(dāng)前分支
git branch
# 查看本地和遠(yuǎn)程的所有分支
git branch -a
# 查看遠(yuǎn)程所有分支
git branch -r
# 查看本地分支與遠(yuǎn)程分支的映射關(guān)系
git branch -vv
# 切換分支
git checkout [branch-name]
創(chuàng)建dev分支,然后切換到dev分支
# git checkout命令加上 -b 參數(shù)表示創(chuàng)建并切換,相當(dāng)于以上兩條命令
git checkout -b [branch-name]
# 刪除一個(gè)分支
git branch -d [branch-name]
# 強(qiáng)制刪除一個(gè)沒有合并的分支
git branch -D [branch-name]
# 刪除遠(yuǎn)程分支dev
git push origin :[branch-name]
# 更新分支列表信息
# -p 表示刪除不存在的遠(yuǎn)程跟蹤分支
git fetch -p
# 清理無效的遠(yuǎn)程追蹤分支
git remote prune origin
5、add
# 從工作區(qū)添加指定文件到暫存區(qū)
git add [file-name1] [file-name2] ...
# 將工作區(qū)的被修改的文件和新增的文件提交到暫存區(qū),不包括被刪除的文件
git add .
# u指update,將工作區(qū)的被修改的文件和被刪除的文件提交到暫存區(qū),不包括新增的文件
git add -u .
# A指all,將工作區(qū)被修改、被刪除、新增的文件都提交到暫存區(qū)
git add -A .
6、commit
# 將暫存區(qū)所有文件添加到本地倉庫
git commit -m "[massage]"
# 將暫存區(qū)指定文件添加到本地倉庫
git commit [file-name-1] [file-name-2] -m "[massage]"
# 將工作區(qū)的內(nèi)容直接加入本地倉庫
git commit -am "[massage]"
# 快速將當(dāng)前文件修改合并到最新的commit,不會(huì)產(chǎn)生新的commit。
# 在提交commit后發(fā)現(xiàn)還有部分文件修改忘記提交了可以是用該命令
git commit --amend
加 -m
是指直接在后面寫上版本的注釋,不加 -m
的話會(huì)用一個(gè)vim打開文件讓你寫入massage,有未追蹤的文件將會(huì)失敗,需要 add
加入暫存區(qū)。
7、pull & push
# 從遠(yuǎn)程倉庫拉取代碼到工作空間
git pull
# 從遠(yuǎn)程倉庫拉取指定分支代碼
git pull origin [branch-name]
# 將文件添加到遠(yuǎn)程倉庫
git push
# 將代碼推送到指定的遠(yuǎn)程分支
git push origin [branch-name]
# 強(qiáng)制將代碼推送到指定的遠(yuǎn)程分支
git push --force origin [分支名稱]
# 強(qiáng)制提交,當(dāng)我們本地reset到舊的版本時(shí),然后普通push會(huì)被攔截,因?yàn)榇耸潜镜豀EAD指向比遠(yuǎn)程庫還要舊
git push -f
# 推送當(dāng)前本地分支到指定遠(yuǎn)程分支
git push origin [branch-name]
# 退到/進(jìn)到 指定的commit【sha碼】,然后強(qiáng)制推送到遠(yuǎn)程
git reset --hard [commit_id]
git push origin HEAD --force
# 刪除遠(yuǎn)程分支
git push origin --delete [分支名稱]
8、log & reflog
# 查看分支歷史
git log
# 簡化查看分之歷史
# 沒有pretty的是,只有commit id 前7位,加pretty的是全部的id
git log --oneline
git log --pretty=oneline
# 圖形式展示分支歷史
git log --graph
# 簡化版圖形式展示分支歷史
git log --graph --oneline
# 簡化版圖形式展示分支歷史附帶展示已經(jīng)修改的文件
git log --graph --oneline --name-only
# 查看分支合并情況
git log --graph --pretty=oneline --abbrev-commit
# 使用git reset --hard命令改變了HEAD指向某個(gè)版本后后,還可以用git log --reflog查看所有版本。
git log --reflog
# 查看最新3條commit日志數(shù)據(jù)
git log -3
# 查看某個(gè)文件的修改記錄
git log -p [filename]
# 顯示操作本地版本庫的命令,包括commit和reset等,
# 在回退版本以后又后悔找不到commit id了可以使用此命令查看歷史
git reflog
9、diff
文件對比
在我們不指定專門的文件夾的時(shí)候,git diff
默認(rèn)比較的是整個(gè)項(xiàng)目 git
目錄。
# 工作區(qū)與暫存區(qū)比較
git diff
# 工作區(qū)與 HEAD ( 當(dāng)前工作分支) 比較
git diff HEAD
# 工作區(qū)比較上次的提交
git diff HEAD^
# 工作區(qū)比較上兩次提交,于是有了,git diff HEAD~n 是比較上n次提交與現(xiàn)在工作區(qū)間的關(guān)系
git diff HEAD~2
# 查看add的文件修改內(nèi)容
git diff HEAD [filename]
# 工作區(qū)與暫存區(qū)文件比較(查看未add的文件修改內(nèi)容)
git diff [filename]
# 工作區(qū)比較特定提交
git diff [commitId]
# 工作區(qū)與特定提交文件進(jìn)行比較
git diff [commitId] [filepath]
# 暫存區(qū)與 HEAD 比較
git diff --cached
# 暫存區(qū)比較 HEAD 的某個(gè)文件差異
git diff --cached _posts/blog/2019-02-16-git.md
# 當(dāng)前分支與 branchName 分支進(jìn)行比較
git diff [branchName]
# 當(dāng)前分支的文件與branchName 分支的文件進(jìn)行比較
git diff [branchName] [filepath]
# 查看某兩個(gè)版本之間的差異
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c
# 查看某兩個(gè)版本的某個(gè)文件之間的差異
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename
10、reset
當(dāng)對整個(gè)版本進(jìn)行操作
# --soft 其中可選參數(shù)soft表示單純的切換HEAD指向的commit-id
# --mixed 默認(rèn)值mixed參數(shù)表示先執(zhí)行上面一步,然后再將commit-id里面的內(nèi)容更新到暫存區(qū)
# --hard hard表示先執(zhí)行上面兩步,然后再將暫存區(qū)內(nèi)容同步到工作區(qū)
git reset --{soft|(mixed)|hard} HEAD
# 用上兩個(gè)版本里的所有文件撤回到暫工作區(qū)
git reset --hard HEAD^^
# 用指定版本的所有文件撤回到工作區(qū)
git reset --hard [commit id]
當(dāng)對當(dāng)個(gè)文件進(jìn)行操作
# 對單個(gè)文件操作時(shí)候只能用mixed參數(shù),而且還是可省略
# 對單個(gè)文件操作時(shí)候HEAD指向不會(huì)變
# 將commit中指定的文件同步到暫存區(qū)中
git reset HEAD [file-name]
# 將指定commit-id中的文件替換掉暫存區(qū)的文件
git reset [commit-id] [file-name]
11、merge
# 用于合并指定分支到當(dāng)前分支
git merge [branch-name]
# 退出當(dāng)前分支合并,當(dāng)合并后沖突很多,要撤回合并分支就可以用這個(gè)命令
git merge --quit
# 準(zhǔn)備合并dev分支,請注意--no-ff參數(shù),表示禁用Fast forward
# 合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并
# 而fast forward合并就看不出來曾經(jīng)做過合并。
git merge --no-ff -m [massage] [branch-name]
12、checkout
# 切換分支
git checkout [branch]
# 最好加--,沒有的話就把它當(dāng)作切換分支看待,切換到另一個(gè)分支了,如果沒有這個(gè)分支也會(huì)把它當(dāng)作文件執(zhí)行。
# 用暫存區(qū)的文件覆蓋掉工作區(qū)的文件
# 如果暫存區(qū)沒有可更新的就會(huì)用commit的文件更新工作區(qū)的文件
git checkout -- [file-name]
# 創(chuàng)建并切換分支
git checkout -b [new-branch-name]
# 從遠(yuǎn)程倉庫里拉取一條本地不存在的分支
git checkout -b [本地分支名] origin/[遠(yuǎn)程分支名]
# 如果出現(xiàn)提示
# fatal: Cannot update paths and switch to branch 'dev2' at the same time.
# Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
# 表示拉取不成功。我們需要先執(zhí)行,然后在執(zhí)行上面命令
git fetch
git checkout -b [本地分支名] origin/[遠(yuǎn)程分支名]
13、stash
# 隱藏當(dāng)前工作的修改
# 如果不隱藏自己修改的半成品代碼,就會(huì)發(fā)生切換到別的分支后,將然后自己的半成品代碼帶入其他分支,這樣就發(fā)生很多不必要的麻煩。
git stash
# 執(zhí)行存儲時(shí),添加備注,方便查找,只有g(shù)it stash 也要可以的,但查找時(shí)不方便識別。
git stash save message
# 查看隱藏的工作信息列表
git stash list
# 刪除隱藏的工作信息
git stash drop
# 恢復(fù)隱藏的工作信息,同時(shí)刪除隱藏的工作信息
git stash pop
# 恢復(fù)指定的隱藏工作信息,但是不會(huì)刪除隱藏的工作信息
git stash apply [stash@{0}]
14、cherry-pick
適用于在其他分支上修復(fù)了bug,但是這個(gè)bug在當(dāng)前分支上依然存在,所以可以復(fù)制這個(gè)commit的過程,不必重寫代碼。文章來源:http://www.zghlxwxcb.cn/news/detail-851258.html
# 這個(gè)是復(fù)制一次commit提交,然后在當(dāng)前分支上重新提交一遍;也就是將指定commit的合并到當(dāng)前分支;
git cherry-pick [commit-id]
# 將某個(gè)分支的多次commit合并到當(dāng)前分支
git cherry-pick [commitHashA] [commitHashA]
# 將某個(gè)分支的commitA到commitB的所有commit合并到當(dāng)前分支
git cherry-pick [commitHashA]..[commitHashA]
# 使用該命令,提交 A 將不會(huì)包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的語法。
git cherry-pick [commitHashA]^..[commitHashA]
15、rebase
合并多次 commit
提交。文章來源地址http://www.zghlxwxcb.cn/news/detail-851258.html
# 合并多次提交
# 非關(guān)鍵性的提交太多會(huì)讓版本歷史很難看、冗余,所以合并多次提交也是挺有必要的。
# 同樣是使用以上的變基命令,不同的是變基命令打開的文本編輯器里的內(nèi)容的修改。
# 將pick修改為squash,可以是多行修改,然后保存退出。
# 這個(gè)操作會(huì)將標(biāo)記為squash的所有提交,都合并到最近的一個(gè)祖先提交上。
# 注意:不能對的第一行commit進(jìn)行修改,至少保證第一行是接受合并的祖先提交。
# -i參數(shù)表示進(jìn)入交互模式。
git rebase -i <commit range>
# 合并前兩個(gè)歷史提交,
# 會(huì)彈出vim修改信息,修改第二行的pick為s,或者為squash,squash為合并的意識,
# 然后保存退出編輯,會(huì)打開第二個(gè)vim編輯,合并并修改commit內(nèi)容,
# 保存退出會(huì)產(chǎn)生一個(gè)新的commit id,這樣就合并了兩個(gè)commit
git rebase -i HEAD~2
16、show
# 顯示此次提交的修改
git show [commitid]
到了這里,關(guān)于Git 基本命令匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!