基本配置
Git 的配置文件為 .gitconfig
据德,它在用戶主目錄下~/.gitconfig
滓玖,針對當(dāng)前用戶是全局的毫目,同時(shí)每個(gè)項(xiàng)目目錄下也可以有一個(gè)局部的配置文件奸腺,僅針對當(dāng)前項(xiàng)目有效侥衬。
# 顯示當(dāng)前的配置
git config --list
# 配置文本編輯器
git config --global core.editor vim
# 編輯配置文件
git config -e --global
# 設(shè)置提交代碼時(shí)的用戶信息
git config --global user.name "[name]"
git config --global user.email "[email address]"
# 設(shè)置換行符轉(zhuǎn)化規(guī)則
git config --global core.autocrlf input
git config --global core.safecrlf true
# 保持文件權(quán)限設(shè)置
git config --global core.filemode true
# 設(shè)置 merge branch 時(shí)使用 --rebase
git config --global branch.autosetuprebase always
git config --global pull.rebase true
# 配置命令別名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
# 列出所有命令別名配置
git config --get-regexp alias
# 記錄手動輸入的賬號和密碼
git config --global credential.helper store
# 配置全局的 ignore 文件為 ~/.gitignore
git config --global core.excludesfile ~/.gitignore
倉庫初始化
# 初始化當(dāng)前目錄為一個(gè) git 倉庫
git init .
# 新建一個(gè)目錄并初始化為 git 倉庫
git init <Directory>
# 初始化一個(gè)裸的倉庫诗祸,即沒有工作區(qū),通常用于作為遠(yuǎn)程倉庫
git init --bare
# 從遠(yuǎn)程克隆一個(gè)倉庫到本地
git clone <url>
提交修改
這里的提交是指將暫存區(qū)里的改動提交到本地的版本庫中(而非提送到遠(yuǎn)程)轴总。提交代碼用 commit 命令直颅,每次提交會生成一個(gè) commit-id,該 id 是一個(gè) 40 位的哈希值怀樟,提交相當(dāng)于一個(gè)快照际乘,便于未來追溯歷史以及版本回退等。
# 提交代碼漂佩,會打開 core.editor 配置的編輯器以輸出提交信息
git commit
# 直接指定提交信息
git commit -m <msg>
# 通常提交的時(shí)候都需要先 add脖含,而 -a 參數(shù)能將所有已跟蹤文件的更新自動提交到暫存區(qū)
# 注:新創(chuàng)建的沒有被跟蹤文件使用 -a 參數(shù)是無效的
git commit -a
# 將新的修改追加到上一個(gè)提交中
git commit --amend
# 提交一個(gè)空內(nèi)容,在沒有任何修改又想增加一個(gè)提交時(shí)可用
git commit --allow-empty
# 忽略 pre-commit hook 腳本
git commit -n
git commit --no-verify
# 在提交的時(shí)候指定作者信息
git commit --author="name <email@mail.com>" ...
# 修改提交的作者信息
git commit --amend --author="name <email@mail.com>"
# 在全局的配置改變了之后投蝉,修改某個(gè)作者信息
git commit --amend --reset-author --no-edit
# 修改前一個(gè)Commit的提交內(nèi)容但是不修改提交信息
git add --all && git commit --amend --no-edit
提交信息(commit message)的格式規(guī)范:
<type>(<scope>): <subject>
<body>
<footer>
Type
用于說明 commit 的類別养葵,可以是如下的標(biāo)識:
- feature:新功能
- bugfix:修補(bǔ) Bug
- docs:文檔(documentation)
- style:格式(不影響代碼運(yùn)行的變動)
- refactor:重構(gòu)(即不是新增功能,也不是修改 Bug 的代碼變動)
- test:增加測試
- chore:構(gòu)建過程或輔助工具的變動
如果 type 為 feature 和 bugfix瘩缆,則該 commit 將肯定出現(xiàn)在 Change log 之中关拒,其它則試情況而定。
Scope
用于說明 commit 影響的范圍庸娱,比如數(shù)據(jù)層着绊、控制層、視圖層等等熟尉,視項(xiàng)目不同而不同归露。
Subject
是對本地提交內(nèi)容的概述,不要太長斤儿,建議不超過 50 個(gè)字符剧包;以動詞開頭恐锦,使用第一人稱現(xiàn)在時(shí),比如 change疆液,而不是 changed 或 changes一铅;第一個(gè)字母小寫;結(jié)尾不加句號(.)堕油。
Body
是對本次 commit 的詳細(xì)描述潘飘,可以分成多行。
Footer
僅用于兩種情況:
- (1)不兼容變動:如果當(dāng)前代碼與上一個(gè)版本不兼容掉缺,則 Footer 部分以BREAKING CHANGE開頭福也,后面是對變動的描述、以及變動理由和遷移方法
BREAKING CHANGE: isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
- (2)關(guān)閉 Issue:如果當(dāng)前 commit 針對某個(gè)issue攀圈,那么可以在 Footer 部分關(guān)閉這個(gè) issue
Closes #234
也可以一次關(guān)閉多個(gè) issue
Closes #123, #245, #992
查看提交歷史
# 顯示當(dāng)前分支的版本歷史
git log
# 顯示當(dāng)前分支的版本歷史,同時(shí)顯示每個(gè)提交發(fā)生變化的文件
git log --stat
# 按作者查看版本歷史峦甩,作者名不需要精確匹配赘来,僅需要包含即可
git log --author="Huoty"
# 按日期查看,可用 --after/--since 或 --before/--until 來按日期篩選
git log --after="2018-04-01" --before="2018-04-15"
# 搜索 commit 信息中包含指定字符串的提交凯傲,-i 參數(shù)可以忽略大小寫
git log --grep="xxx"
# 顯示每次提交中被修改文件簡要的增改行數(shù)統(tǒng)計(jì)
git log --stat
# 簡短的顯示文件的變化狀態(tài)統(tǒng)計(jì)犬辰,不顯示變化的文件名
git log --shortstat
# 展開顯示每次提交的內(nèi)容差異,-num 可只顯示開頭的提交冰单,如 -2 表示僅顯示最近的兩次更新
git log -p
# 展示每個(gè)提交所在的分支及其分化衍合情況
git log --pretty=fuller --graph
# 定制顯示的格式
git log --pretty=format:"%h - %an, %ar : %s"
# 把每個(gè)版本歷史信息壓縮到一行(decorate 表示顯示關(guān)聯(lián)的分支或 tag 等)
git --no-pager log --oneline --decorate
# 限制顯示的條數(shù) -<number>
git log -20
# 顯示某次提交的內(nèi)容
git show <Commit ID>
git log \--pretty=format
常用的選項(xiàng):
選項(xiàng) | 說明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的簡寫哈希值 |
%T | 樹的完整哈希值 |
%t | 樹的簡寫哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的簡寫哈希值 |
%an | 作者名字 |
%ae | 作者的電子郵件地址 |
%ad | 作者修訂日期(可以用 --date=選項(xiàng) 來定制格式) |
%ar | 作者修訂日期幌缝,按多久以前的方式顯示 |
%cn | 提交者的名字 |
%ce | 提交者的電子郵件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多長時(shí)間) |
%s | 提交說明 |
更多關(guān)于 查看提交歷史 的方法還可以參考 Git Book 中文文檔。
單文件歷史
# 顯示某個(gè)文件的歷史版本的所有改動
git log --follow -p [file]
git whatchanged -p [file]
# 顯示指定文件的每一行內(nèi)容的作者和修改時(shí)間
git blame [file]
shortlog
git shortlog
將 commit 按照作者分組诫欠,顯示每個(gè) commit 的第一行描述涵卵,這樣便于看到每個(gè)作者都做哪些工作』牡穑可以認(rèn)為它是一個(gè)特殊版本的 git log轿偎,其對各個(gè)作者的提交進(jìn)行匯總。
# 統(tǒng)計(jì)每個(gè)作者的提交情況
git shortlog -snec
-s 參數(shù)省略每次 commit 的注釋被廓,僅僅返回一個(gè)簡單的統(tǒng)計(jì)坏晦。
-n 參數(shù)按照 commit 數(shù)量從多到少的順序?qū)τ脩暨M(jìn)行排序
-e 顯示作者的郵件地址
-c 按提交者的身份,而不是作者
差異比較
# 查看工作區(qū)域暫存區(qū)的差異
git diff
# 查看暫存區(qū)與版本庫的差異
git diff --cached
git diff --staged
# 查看 工作區(qū)嫁乘、暫存區(qū) 與 HEAD 的差異
git diff HEAD
# 僅列出存在差異的文件的文件名
git diff --name-only
# 查看 branch2 分支的哪些改動不存在于 branch1 上
git diff branch1..branch2
# 查看當(dāng)前分支與主分支最近公共祖先的差異
git diff master...
# 顯示兩個(gè)版本間的差異
git diff version1 version2
# 顯示兩個(gè)版本間所有有差異的文件列表
git diff version1 version2 --stat
# 顯示兩個(gè)版本間指定文件的詳細(xì)差異
git diff version1 version2 -- <file path>
暫存工作區(qū)
git stash
可以在不提交當(dāng)前修改的情況下將工作區(qū)的修改進(jìn)行暫存昆婿,等到合適的時(shí)候再恢復(fù)。它的用途是暫停當(dāng)前工作蜓斧,臨時(shí)去干別的事仓蛆。
# 保存當(dāng)前的工作進(jìn)度。會分別對暫存區(qū)和工作區(qū)的狀態(tài)進(jìn)行保存
git stash
# 顯示進(jìn)度列表挎春。git stash 可以多次保存工作進(jìn)度多律,并可在恢復(fù)時(shí)候進(jìn)行選擇
git stash list
# 恢復(fù)暫存痴突。如果不使用任何參數(shù),會恢復(fù)最新保存的工作進(jìn)度
git stash pop [--index] [<stash>]
# 恢復(fù)暫存狼荞,但不刪除進(jìn)度
git stash apply [--index] [<stash>]
# 清除所有暫存
git stash clear
找回丟失的提交
git reflog
可以列出 HEAD 曾經(jīng)指向過的一系列 commit辽装。reflog
(relog is Reference logs),它是一個(gè)分支的頂端或者每次更新到本地倉庫的引用的一個(gè)記錄相味,簡單的說就是 HEAD 曾經(jīng)指向過引用拾积。該命令可用于在錯(cuò)誤操作時(shí)找回丟失的提交。
如果引起 commit 丟失的原因并沒有記錄在 reflog 中丰涉,則使用 git fsck
工具拓巧,該工具會檢查倉庫的數(shù)據(jù)完整性。如果指定 --full 選項(xiàng)一死,可以顯示所有未被其他對象引用 (指向) 的對象肛度。指定 --lost-found 會嘗試搜索被刪除的 commit。
git reflog
git fsck --full
git fsck --lost-found
cherry-pick
git cherry-pick
能夠?qū)⑵渌种系哪硞€(gè)或者多個(gè)提交應(yīng)用到當(dāng)前分支中投慈,而不必將整個(gè)分支的內(nèi)容都合并到當(dāng)前分支承耿。
# 將任意分支中的 commit 應(yīng)用到當(dāng)前分支
git cherry-pick <Commit ID>
如果 cherry-pick 多個(gè)連續(xù) commit,應(yīng)注意如下幾點(diǎn):
- 1. 使用兩個(gè)點(diǎn)(..)來指明 commit 的區(qū)間
- 2. git cherry-pick A..B 中伪煤,A 的 commit 應(yīng)該在 B 之前
- 3. 默認(rèn)的選取范圍不包含 A 但包含 B加袋,類似于數(shù)學(xué)上開閉區(qū)間 (A,B]
- 4. 若要包含 A,請使用 git cherry-pick A^..B抱既,即可做到 [A,B]
如果 cherry-pick 的是一個(gè) merge commit职烧,則會存在歧義,如下示例:
- A - B - E - F - master
\ /
C - D fix
節(jié)點(diǎn) E 既來自 master 分支 B - E 的改動防泵,也來自 fix 分支 D - E 的改動蚀之,所以當(dāng) git cherry-pick E 的時(shí)候,git 無法決定取來自哪個(gè)分支的改動捷泞,于是就需要加上 -m
協(xié)助 git 確定恬总。
使用 B - E 的改動
git cherry-pick E -m 1
# 使用 D - E 的改動
git cherry-pick E -m 2
即 -m 1
表示取 主干,也就是被 merge 了代碼的分支肚邢,-m 2
表示取被 merge 的分支壹堰,也就是 merge 來源。
revert
git revert
用于只撤銷歷史上的某個(gè)或者某幾個(gè)提交骡湖,而不改變前后的提交歷史贱纠,并且將撤銷操作作為一次最新的提交。
# 撤銷 commit 并新生成一個(gè) commit
git revert <Commit ID>
一定要理解响蕴,revert 操作是提交一個(gè)新的版本谆焊,將需要 revert 的版本的內(nèi)容再反向修改回去,版本會遞增浦夷,之前的提交歷史不會有任務(wù)改動辖试。
注意與 reset 的區(qū)分辜王,revert 應(yīng)該被稱之為 恢復(fù),而 reset 則是回退的意思罐孝,它會修改歷史版本呐馆。
整理提交歷史
# 修改最新一個(gè)提交
git commit --amend
# 整理某一提交之后的所有提交
git rebase -i <Commit ID>
# 修改歷史上任意提交
git commit --fixup <Commit ID>
git commit --squash <Commit ID>
- git commit --amend:
該命令可以修改最新一次提交,包括 commit message 和 內(nèi)容莲兢。如果你在提交工作后發(fā)現(xiàn)有哪里不對汹来,可以繼續(xù)在工作區(qū)進(jìn)行修改,然后使用該命令對最新一次錯(cuò)誤提交進(jìn)行補(bǔ)充或者修改改艇。
- git rebase -i:
rebase
被理解為 變基收班,所以變基就是相對于一個(gè)基點(diǎn)來進(jìn)行調(diào)整。-i
即 --interactive
的簡寫谒兄。該命令需要指定一個(gè) commit 作為基點(diǎn)摔桦,在該 commit 之后的提交都可在交互式的文本編輯器中進(jìn)行修改。其可以對 commit 進(jìn)行修改承疲、合并邻耕、刪除、調(diào)整順序等操作纪隙。可操作的命令有:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
他們的含義分別是:
pick:正常選中扛或,即保持不變绵咱,這個(gè)默認(rèn)的操作命令
reword:修改該提交的 commit message
edit:此時(shí) rebase 時(shí)會暫停,允許你修改這個(gè)提交熙兔,可用于拆分提交
squash:把內(nèi)容和 commit message 都合并到前一個(gè)提交
fixup:與 squash 類似悲伶,內(nèi)容會被合并到前一個(gè)提交中,但 commit message 會被拋棄
exec:執(zhí)行其他 shell 命令
drop:刪除該提交不再保留住涉,或者直接將改行刪掉也是同樣的效果
- git commit [--fixup | --squash]:
該命令用于修改歷史上任意一個(gè)提交麸锉,如果發(fā)現(xiàn)之前的某個(gè)提交有錯(cuò)誤,可以說用該命令舆声。使用 --fixup
會自動多出一個(gè) fixup! 開頭的提交花沉。而使用 --squash
則允許編輯 message,然后生成一個(gè) squash! 開頭的提交媳握。最后使用 git rebase \-i \--autosquash
則可以完成對歷史提交的修改碱屁。假設(shè)需要修改的 commit 為 abc123,則操作命令如下所示:
git commit --fixup abc123
git rebase -i --autosquash abc123^
撤銷暫存區(qū)
如果執(zhí)行 git add 操作后發(fā)現(xiàn)修改的內(nèi)容有誤蛾找,需要重新修改時(shí)娩脾,可以使用 reset
撤銷提交到暫存區(qū)的修改到工作區(qū)中。
# 撤銷某一文件
git rest file
git reset HEAD file
# 撤銷整個(gè)暫存區(qū)
get reset
git reset HEAD
代碼回滾
# 撤銷指定文件在工作區(qū)中的修改
git checkout [file]
# 建立一個(gè)臨時(shí)分支打毛,并將 HEAD 指向指定的 commit
git checkout [commit]
# 恢復(fù)某個(gè)文件的內(nèi)容為指定的 commit 或者 branch
git checkout [commit/branch] [file]
# 從其他分支檢出某個(gè)目錄下的所有內(nèi)容到當(dāng)前分支
git checkout [branch] -- [path]
# 撤銷工作區(qū)中當(dāng)前目錄下的所有修改
git checkout .
# 恢復(fù)添加到暫存區(qū)的內(nèi)容到工作中
git reset [file]
# 重置暫存區(qū)與工作區(qū)為指定的 commit
git reset --hard [commit]
# 重置當(dāng)前分支的指針為指定 commit柿赊,同時(shí)重置暫存區(qū)俩功,但工作區(qū)不變
git reset [commit]
# 保持暫存區(qū)和工作區(qū)不變,但重置當(dāng)前 HEAD 為指定的 commit
git reset --keep [commit]
# 撤銷指定 commit 的修改并生成一個(gè)新的 commit
git revert [commit]
拯救出錯(cuò)的 rebase 操作
如果分支上有新的提交還沒 push碰声,可以用 reflog 查看操作歷史诡蜓,然后用 reset 回退:
$ git reflog
b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...
$ git reset HEAD@{2} --hard
如果分支上沒有提交,或者不關(guān)心這個(gè)分支上新的提交奥邮,只是想做 rebase 操作万牺,那么可以先切換到別的分支,把 rebase 出問題的分支刪掉再重新 rebase:
$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch
或者更簡單一些洽腺,讓 HEAD 指向遠(yuǎn)程分支的 HEAD:
$ git reset --hard origin/my-branch
分支管理
命令 git branch
可用于管理分支脚粟,實(shí)現(xiàn)分支的查看、創(chuàng)建和刪除功能蘸朋。不帶任何參數(shù)時(shí)會列出所有分支:
$ git branch
add-rhesis
dev
embed-ipynb
* master
上例輸出中 master 分支前的 *
字符表示當(dāng)前所在的分支核无。加上 -v
參數(shù)可以顯示分支的最后一個(gè)提交對象:
$ git branch -v
add-rhesis 9b37bf7 [ahead 18, behind 2] 重新設(shè)計(jì) server 架構(gòu)
dev e087d4f Merge branch 'master' into dev
embed-ipynb d1611a8 fix url
* master 351233c update posts
其它一些命令介紹:
# 新建分支
git branch [name]
# 新建分支并切換到新分支
git checkout -b [name]
# 列出遠(yuǎn)程跟蹤分支
git branch -r
# 使用通配符列出匹配的分支(示例列出 featrue/ 開頭的分支)
git branch --list 'featrue/*'
# 列出本地分支和遠(yuǎn)程跟蹤分支
git branch -a
# 列出其他分支被合并到當(dāng)前分支的情況
git branch --merged
git branch --no-merged
# 分支重命名
git branch -m [old-name] [new-name]
# 刪除分支
git branch -d [name] # 刪除已合并的分支
git branch -D [name] # 強(qiáng)制刪除分支即使未被合并
# 刪除遠(yuǎn)程分支
git push origin --delete [branch]
# 獲取當(dāng)前分支名
git rev-parse --abbrev-ref HEAD
# 列舉出所有的分支以及它們的上游和最后一次提交
git branch -vv
分支替換,即用一個(gè)分支完全替換另一個(gè)分支藕坯。如果要替換遠(yuǎn)程分支团南,可以直接將本地分支強(qiáng)行推送到遠(yuǎn)程分支:
$ git push -f origin develop:master
即把本地的 develop 分支強(qiáng)制(-f)推送到遠(yuǎn)程 master。但這樣做之后炼彪,本地的 master 分支還是舊的吐根,如果希望本地的 master 分支與遠(yuǎn)程的 master 分之同步,則需要先替換到本地的 master 分支辐马,再推送到遠(yuǎn)程倉庫:
# 切換到舊的分支
$ git checkout master
# 將本地的舊分支 master 重置成 develop
$ git reset --hard develop
# 再推送到遠(yuǎn)程倉庫
$ git push origin master --force
何時(shí)保留分支歷史
合并其他分支代碼 git merge
模式采用 fast-forward 方式進(jìn)行合并拷橘。fast-forward
方式就是當(dāng)條件允許的時(shí)候,git 直接把 HEAD 指針指向合并分支的頭喜爷,完成合并冗疮。屬于 “快進(jìn)方式”,不過這種情況如果刪除分支檩帐,則會丟失分支信息术幔。因?yàn)樵谶@個(gè)過程中沒有創(chuàng)建 commit。
在 merge 其他分支時(shí)湃密,建議保留其他分支的歷史诅挑,即期望 merge 過來的分支具體都干了啥。所以建議將 merge 加上 --no-ff 參數(shù)泛源。--no-ff
指的是強(qiáng)行關(guān)閉 fast-forward 方式揍障,而刻意制造分叉。區(qū)別如下圖所以:
[圖片上傳失敗...(image-ec7f8-1606895200195)]
在 pull 代碼時(shí)俩由,實(shí)際上 pull 操作做了兩個(gè)操作毒嫡,即 fetch 和 merge。也就是說,git 先取得遠(yuǎn)程倉庫的代碼兜畸,然后將遠(yuǎn)程分支與本地合并努释,這樣會使分支分叉,如果倉庫有很多協(xié)作開發(fā)者咬摇,則分支歷史看上去會很亂伐蒂。所以建議 pull 時(shí)不采用 merge 方式,而是用 rebase 的方式肛鹏,即 pull 加上 --rebase
參數(shù)逸邦。可以通過配置使 pull 默認(rèn)采用 rebase:
git config --global pull.rebase true
# 將提交約線圖平坦化
git pull --rebase
# 刻意制造分叉
git merge --no-ff
標(biāo)簽管理
Git 有兩種類型的標(biāo)簽在扰,即 輕量級的(lightweight) 和 含附注的(annotated)缕减。輕量級類似一個(gè)指針,其指向一個(gè)特定的提交對象芒珠。含附注標(biāo)簽桥狡,是存儲在倉庫中一個(gè)獨(dú)立的對象,其有自身的校驗(yàn)和信息皱卓,且包含標(biāo)簽的名字裹芝,郵件地址和日期,以及標(biāo)簽說明娜汁,創(chuàng)建含附注類型的標(biāo)簽需要指定 -a
參數(shù)(取 annotated 的首字母)嫂易。
# 列出所有標(biāo)簽
git tag
# 新建輕量級標(biāo)簽:
git tag [tagname]
# 新建帶附注標(biāo)簽
git tag -a [tagname] -m [message]
# 刪除本地標(biāo)簽
git tag -d [tagname]
# 查看標(biāo)簽信息
git show [tagname]
# 推送標(biāo)簽
git push [remote] [tagname]
# 提交所有標(biāo)簽
git push [remote] --tags
# 獲取遠(yuǎn)程單個(gè)標(biāo)簽
git fetch [remote] tag [tagname]
# 或者:
git fetch origin [tagname] # fetch remote tag to FETCH_HEAD
git tag [tagname] FETCH_HEAD
# 獲取遠(yuǎn)程所有標(biāo)簽
git fetch [remote] --tags
# 新建一個(gè)分支,指向某個(gè)標(biāo)簽
git checkout -b [branch] [tagname]
刪除遠(yuǎn)程標(biāo)簽有三種方式:
# 1. 使用參數(shù) --delete:
git push origin --delete tag <tagname>
# 2. 相當(dāng)于推送一個(gè)空分支到遠(yuǎn)程分支:
git push origin :<tagname>
# 3. 先刪除本地 tag掐禁,在推送一個(gè)空的 tag 到遠(yuǎn)程倉庫:
git tag -d
git push origin :refs/tags/<tagname>
取消跟蹤
如果要取消對文件的跟蹤怜械,需要使用 rm 命令。命令常用參數(shù):
--cached 僅從索引中刪除穆桂,不刪除文件
-f, --force 從索引中刪除宫盔,同時(shí)也將文件刪除
-r 遞歸刪除
示例:
# 不再跟蹤文件, 但是文件仍保留
git rm --cached <filename>
# 不再跟蹤文件, 同時(shí)文件被刪除
git rm -f <filename>
# 不再跟蹤目錄
git rm -r --cached <dir>
git rm -r --force <dir>
遠(yuǎn)程倉庫
# 顯示所有遠(yuǎn)程倉庫
git remote -v
# 顯示某個(gè)遠(yuǎn)程倉庫的信息
git remote show [remote]
# 增加一個(gè)新的遠(yuǎn)程倉庫融虽,并命名
git remote add [remote] [url]
# 修改遠(yuǎn)程倉庫地址
git remote set-url [remote] [url]
# 拉取遠(yuǎn)程倉庫的所有變動
git fetch [remote]
git remote update [remote]
# 拉取遠(yuǎn)程倉庫中的指定分支并與本地分支合并
git pull [remote] [branch]
# 上傳本地指定分支到遠(yuǎn)程倉庫
git push [remote] [branch]
# 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉庫享完,即使有沖突
git push [remote] [branch] --force
# 推送所有分支到遠(yuǎn)程倉庫
git push [remote] --all
# 從遠(yuǎn)程倉庫刪除分支
#(謹(jǐn)慎操作,一般不建議這么做有额,生產(chǎn)倉庫應(yīng)禁止該功能)
git push [remote] --delete [branch]
遠(yuǎn)程倉庫的 url 地址可以是 http 協(xié)議般又,也可以是 ssh 協(xié)議,還可以是本機(jī)的路徑巍佑。如:
# 本機(jī)路徑作為遠(yuǎn)程倉庫地址
origin /home/server/test/ (fetch)
origin /home/server/test/ (push)
# 或者:/home/server/test/.git
# 使用 ssh 協(xié)議的遠(yuǎn)程倉庫地址
origin ssh://git@127.0.0.1:23456/test.git (fetch)
origin ssh://git@127.0.0.1:23456/test.git (push)
# 使用 http 協(xié)議的遠(yuǎn)程倉庫地址
origin https://gitee.com/kuanghy/test.git (fetch)
origin https://gitee.com/kuanghy/test.git (push)
指定 sshkey 訪問遠(yuǎn)程倉庫
有時(shí)候茴迁,由于可能會在機(jī)器上維護(hù)多個(gè) sshkey,那么某些地方用默認(rèn) key 可能會有問題萤衰。這時(shí)就需要做些配置來滿足需求堕义。
編輯文件:
vi ~/.ssh/config
加入以下內(nèi)容:
Host git.company.com
User git
IdentityFile /Users/guanliyuan/.ssh/test
IdentitiesOnly yes
其中:
- git.company.com 是你的遠(yuǎn)程倉庫域名
- User git 這樣配置表示這是給 git 命令使用的
- IdentityFile 表示私鑰文件地址
- IdentitiesOnly 配置為 yes,表示只使用這里的 key脆栋,防止使用默認(rèn)的
清理工作區(qū)
使用 git clean
可以清除工作區(qū)未被添加到索引中的文件倦卖。參數(shù)說明如下:
# 以下參數(shù)必須提供一個(gè)
-i --interactive 交互方式顯示將要完成的操作和清理文件
-n --dry-run 僅打印要?jiǎng)h除的文件洒擦,但不實(shí)際執(zhí)行刪除操作
-f --force 確定移除,即無論如何都強(qiáng)制移除
# 以下參數(shù)為可選參數(shù)
-d 連同目錄一起刪除
-x 刪除所有未跟蹤的文件怕膛,不管是否包含在 .gitignore 文件中
-X 僅刪除 .gitignore 文件中包含的文件
打包歸檔
使用 git archive
可以把代碼倉庫中的某一分支熟嫩、標(biāo)簽、提交點(diǎn)打包為歸檔文件褐捻,一共發(fā)布等用途掸茅。部分參數(shù)說明:
--format <fmt> 指定歸檔格式
--prefix <prefix> 歸檔文件前綴,即在檔案中的每個(gè)文件名前加上 <prefix>/
-o, --output <file> 指定輸出文件柠逞,而不是直接輸出到 stdout 中
-0 僅存儲而不壓縮
-1 最低的壓縮級別昧狮,當(dāng)速度快
-9 最高的壓縮級別,但速度慢
-l, --list 列出支持的壓縮格式
--remote <repo> 指定歸檔的來源為遠(yuǎn)程的倉庫边苹,即從遠(yuǎn)程下載歸檔文件
--exec <command> 用于指定 git-upload-archive 遠(yuǎn)程端的路徑
常用格式:
git archive \
--format=[archive format] \
--prefix=[archive prefix path] \
[branch] \
> [archive path]
使用示例:
# 列出支持的歸檔格式
$ git archive --list
tar
tgz
tar.gz
zip
# 打包 HEAD 指向的分支陵且,一般是當(dāng)前分支
$ git archive --format=tar.gz --prefix=test/ HEAD > test.tar.gz
# 創(chuàng)建一個(gè)包含當(dāng)前分支上最新提交內(nèi)容的 tar 歸檔文件,并將其提取到 /var/tmp/junk 目錄中
$ git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)
# 將指定 tag 進(jìn)行打包歸檔
$ git archive --format=tar.gz --prefix=test-1.4.0/ -o test-1.4.0.tar.gz v1.4.0
# 使用 zip 格式壓縮
$ git archive --format=zip --prefix=test/ HEAD > test.zip
更新詳細(xì)的說明和使用可參見:https://git-scm.com/docs/git-archive.
其他
# 交互式的一段一段的添加修改到工作區(qū)
git add -p
# 僅將新增加的文件路徑添加到暫存區(qū)个束,但不添加內(nèi)容
git add -N
# 刪除本地已經(jīng)合并的分支
git branch -d [branch]
# 強(qiáng)制刪除本地分支慕购,即使沒被合并
git branch -D [branch]
# 在提交的時(shí)候指定作者信息
git commit --author="name <email@mail.com>" ...
轉(zhuǎn)載來源:https://blog.konghy.cn/2018/05/06/git-notes/