git 操作筆記

基本配置

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茬底,隨后出現(xiàn)的幾起案子沪悲,更是在濱河造成了極大的恐慌,老刑警劉巖阱表,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿如,死亡現(xiàn)場離奇詭異,居然都是意外死亡最爬,警方通過查閱死者的電腦和手機(jī)涉馁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱致,“玉大人烤送,你說我怎么就攤上這事】访酰” “怎么了帮坚?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長互艾。 經(jīng)常有香客問我试和,道長,這世上最難降的妖魔是什么纫普? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任阅悍,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘节视。我一直安慰自己晦墙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布肴茄。 她就那樣靜靜地躺著晌畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寡痰。 梳的紋絲不亂的頭發(fā)上抗楔,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音拦坠,去河邊找鬼连躏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贞滨,可吹牛的內(nèi)容都是我干的入热。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼晓铆,長吁一口氣:“原來是場噩夢啊……” “哼勺良!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骄噪,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤尚困,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后链蕊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事甜,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年滔韵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逻谦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陪蜻,死狀恐怖邦马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囱皿,我是刑警寧澤勇婴,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布忱嘹,位于F島的核電站嘱腥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拘悦。R本人自食惡果不足惜齿兔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧分苇,春花似錦添诉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至靖秩,卻和暖如春须眷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沟突。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工花颗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惠拭。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓扩劝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親职辅。 傳聞我的和親對象是個(gè)殘疾皇子棒呛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在項(xiàng)目開發(fā)過程中,總是免不了使用版本管理工具域携。否則可能經(jīng)常出現(xiàn) HBO出版的電視劇《硅谷(Silicon Vall...
    BillGrim閱讀 453評論 0 0
  • GitBook中文版 1. 刷新遠(yuǎn)程branch 在Android Studio的terminal中:git fe...
    CaiBird閱讀 1,239評論 0 1
  • git工作區(qū)条霜、暫存區(qū)、本地倉庫涵亏、遠(yuǎn)程倉庫 git 常用操作命令 git init 初始化git倉庫(在改目錄下生成...
    nnnnxcj閱讀 202評論 0 0
  • git tag操作 git tag -l 查看本地tag git ls-remote --tag 查看當(dāng)前分支遠(yuǎn)程...
    瓢鰭小蝦虎閱讀 64評論 0 1
  • 創(chuàng)建新文件夾mkdir filename 然后創(chuàng)建新倉庫: 從遠(yuǎn)程庫克略姿: 添加和提交: 查看當(dāng)前文件狀態(tài): 如果...
    hui_he閱讀 364評論 0 1