Git 基础 —— 安装 配置 别名 对象
Git 基礎學習系列
- Git 基礎 —— 安裝 配置 別名 對象
- Git 基礎 —— 常用命令
- Git 基礎 —— 常見使用場景
- Git基礎 —— Github 的使用
Git 安裝
Git下載地址
Windows 安裝時需要注意在Configuring the line ending conversions界面,選擇Checkout as-is,commit as -s,避免Windows的換行符問題。如果忘記設置,可以使用如下命令后期設置:
git config --global core.autocrlf false參考:
- GitHub 第一坑:換行符自動轉換
Git 配置
可以通過 查看配置:
- git config -l/--list
- git config --list [--local | --global | --system]
說明:
- system 不常用
- local 需要在一個 Git 倉庫下使用,它的配置,優先級是最高的,代表僅針對單倉庫的配置
設置 Git 賬號
配置 user 信息
git config --global user.name "michael728" git config --global user.email "649168982@qq.com"- --local:區域為本倉庫
- --global: 當前用戶的所有倉庫
- --system: 本系統的所有用戶
運行 git config --help 可以看到幫助文檔,比如,配置錯誤了,可以刪除:git config --unset usr.name 將 usr.name 刪除,應該是 user.name。
生成 SSH Key
1.先查看有沒有 SSH Key,ls -al ~/.ssh,如果沒有,采用如下方法生成。
2.生成 ssh 公鑰,不要重命名生成的文件,否則會導致 ssh 方式下載 Git 代碼庫失敗:
參數說明:
- -t 用來指定加密算法為 rsa;
- -C 后面是個注釋信息,并不一定要和你 Git 賬戶的郵箱或者 Git 賬戶名保持一致,只是常常是和你賬戶郵箱保持一致,這樣設置,就能知道這個公鑰被綁定在哪個 Git 賬戶上了。
3.生成公鑰之后,拷貝公鑰的內容,粘貼到你 Github 賬戶的 SSH Key 設置中;
pbcopy < ~/.ssh/id_rsa.pub如果沒有 pbcopy 命令,就直接打開 id_rsa.pub 內容,復制即可;
關于公鑰私鑰的一些探究:
- 一個 ssh key 只能綁定在一個 Git 賬戶上,而一個 Git 賬戶可以綁定多個 ssh key;
- 公鑰就相當于一個 fingerprint ,公鑰和唯一一個 Git 賬戶綁定,那么凡是機器上有這個公鑰對應的私鑰,機器就有綁定賬戶的權限去操作相關的代碼庫,即在 A 機器上生成的私鑰發送到 B 機器上,那么,B 機器也會有權限下載了;
參考:
- Github Add SSH Key 文檔
- 簡書-圖解SSH原理
- 簡書-SSH key的介紹與在Git中的使用
- archlinux-SSH keys (簡體中文)
Git 配置別名
git config命令可以輕松為每一個命令設置別名。例如:
git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status演示將git visual定義為 gitk 的別名:
git config --global alias.visual '!gitk'設置命令的別名,可以提高操作效率。查看.gitconfig文件vim ~/.gitconfig:
[user]name = xxxemail = xxx [i18n]commitencoding = utf-8logoutputencoding = utf-8 [core]quotepath = false [filter "lfs"]clean = git-lfs clean -- %fsmudge = git-lfs smudge -- %fprocess = git-lfs filter-processrequired = true [alias]co = checkoutbr = branchc = commits = statusunstage = reset HEAD --last = log -1 HEADlg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative[color]ui = true我們可以體驗一個 log 的別名命令設置:
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative這是超厲害的別名縮寫命令,試試現在的 git lg 有多酷炫吧!
探秘 .git 目錄
.git 裸倉庫文件夾,反映了 Git 良好的文件存儲機制。
- HEAD 文件,指向當前所在的分支,表示一個「引用」。例如當前在 develop 分支,HEAD 內容就是 ref: refs/heads/develop
- config 文件,是本地倉庫的配置文件,git config --local --list
- refs 文件夾,包含了 heads 和 tags 文件夾。heads 歸檔的分支,tags 歸檔的標簽,也叫做「里程碑」。
- heads 文件夾下有多個文件,每個文件和倉庫本地存在的分支名一致,文件內容是 commit id。文件當中存放的其實是這個分支的指針指向的 commit id。git branch -av 可以看到分支信息和 commit id。它是個 commit 類型的對象。
- tags 中也有多個文件,文件名和存在 tag 名一致,內容也是 commit id。它也是個 commit 類型的對象。
- objects 文件夾(核心),存放所有的 git 對象,對象哈希值前 2 位作為文件夾名稱,后 38 位作為對象文件名, 可通過 git cat-file -p <2位+38位> 命令查看文件內容。git cat-file -t <2位+38位> 查看對象類型,這是一個 tree 類型的對象。內容本身是一個 blob 對象。任何文件的內容相同,在 Git 眼里,它就是唯一的一個 blob 對象。
還有一些暫可以不了解的文件:
- COMMIT_EDITMSG 文件
- ORIG_HEAD 文件,好像是上一次的 commit id
- description 文件,倉庫的描述信息文件
- index 文件
- hooks 文件夾
- info 文件夾
- logs 文件夾
知道了一個 sha1 值,如何查看它的對象類型、對象內容、對象大小?
- git cat-file -t 命令 , 查看 git 對象的類型
- git cat-file -p 命令, 查看 git 對象的內容
- git cat-file -s 命令, 查看 git 對象的大小
Git 對象彼此關系
commit tree blob 三個對象之間的關系:
一次 commit id 對應一棵樹(tree),一次快照,整個項目的快照,包含了哪些文件夾(tree)、哪些文件(blob)。blob 可以看做是一個文件,但是和文件名是沒關系的,不管文件名是什么,只要文件內容相同,就是一個 blob,這種設計大大節約了存儲空間。
實驗
新建一個 git 倉庫,創建一個 doc 文件夾,在 doc 文件夾中創建 readme 文件
- 在單純創建 doc 文件夾時, git 不會理會;
- 創建 readme 文件之后,會提示有文件可以添加跟蹤;
- 這時候執行 find .git/objects --type f, 沒有發現有對象生成;
- 接著執行 git add doc 將文件添加到暫存區,這時候有文件對象生成了:
- 接著創建 commit,git commit -m "add readme",這時候文件對象內容:
1 個 commit 對象,2 個 tree 對象,1 個 blob 對象。
為何會有2個 tree 對象呢,其中,整個工作目錄是一個 tree 對象,工作目錄下的 doc 文件夾對應了一個 tree 對象。
擴充:我又將之前 doc 文件夾的 readme 文件復制在倉庫的根目錄下,此時在 git add readme 之后,文件對象仍然無變化;但是,當 commit 之后,文件對象變多了,多了 1 個 commit,1個 tree 對象。這個多出來的 tree 對象,就是因為工作目錄變化了,那么就多出來了一個 tree 對象。
HEAD 與 branch
分離頭指針
$ git checkout 20824e0 Note: checking out '20824e0'.You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.detached HEAD就表示你當前處于「分離頭指針」的狀態。,其實,「分離頭指針」就是表示正工作在一個沒有分支的情況下,沒有與分支進行掛鉤, HEAD 沒有指向任何分支。 處于「分離頭指針」狀態進行提交后,當你切換到其他分支,例如 git checkout master ,之前產生的 commit 可能會被 Git 當為垃圾清除掉。
分離頭指針的應用場景
在處于分支頭指針狀態時,你產生了一次 commit 0635f24,當你切換到其他分支后,有可能就找不到剛剛的提交了,你用 gitk --all 之后,看不到剛剛的提交的。
如果想保存剛剛的提交,需要使用如下命令將其與分支掛鉤:
git branch <new-branch-name> 0635f24如果臨時想基于某個 commit 做變更,試試新方案是否可行,就可以采用分離頭指針的方式。測試后發現新方案不成熟,直接 reset 回其他分支即可,省卻了建、刪分支的麻煩。
進一步理解 HEAD 和 branch
HEAD 既可以指向當前分支的最新 commit,也可以指向歷史中的某一次 commit (「分離頭指針」的情況)。歸根結底,HEAD 指向的就是一次 commit。
當我們做分支切換時,HEAD 會跟著切換。
例如比較最近兩次提交的差異,可以用命令:
# 下面三個命令等效 git diff xxx1 xxx2 git diff HEAD HEAD^ Git diff HEAD HEAD~1- HEAD^1 表示 HEAD 的父親,HEAD^^ 表示 HEAD 父親的父親。
- HEAD^^ 和 HEAD~2等效。
Git 小技巧
Git 幫助文檔
授人以魚不如授人以漁,先知道怎么通過幫助文檔查看常用命令的說明吧:
git help git help <cmd> # 與 git <cmd> --help 等價 git help <cmd> --web # 使用瀏覽器頁面打開 git <cmd> -h # 顯示簡略的命令幫助gitk 圖形界面
gitk 后面可以跟上文件的路徑, 這樣能看單個文件的修改歷史的具體內容。
- Patch 表示的是「變更集」,某一次 commit 修改的文件集合;
- Author 作者
- Commiter 提交人
- Cherry 挑選一個 commit,放到另一個分支上,這時候,Author 和 Commiter 就有可能不是一個人了,因為你挑選的那個 commit 作者可能是 A,你 cherry pick 過來之后提交,提交人是你,但是作者信息還是 A,版權考慮。
- Parent 上一次的 commit id
- Child 下一次的 commit id
- 菜單 View ,選擇 All refs 可以看到所有的分支演變圖
gitignore 指定不需要 Git 管理的文件
.gitignore 指定哪些文件不需要納入版本管理的。
- *.d 任何 .d 結尾的文件都不需要;
- *.dSYN/ 任何以 .dSYM 結尾的文件夾下的文件都不要;
加不加 / 作用是不一樣的,很微妙。比如,有一個文件夾叫 doc,那么,.gitignore 中寫 doc, Git 既會忽略 doc 文件夾,也會忽略 doc 文件!只有 doc/ 這么寫,才會只忽略 doc 文件夾而不忽略 doc 文件,作用才很明確。
所以,如果要忽略的是文件夾,那么就顯示的加上 / 吧。
Github 現在創建倉庫時,可以選擇生成什么 .gitignore ,附上鏈接作為參考:
- github/gitignore/maven
- github/gitignore/java
這里有一個帖子討論了為何 .idea 文件夾沒有加入到 .gitignore 中,這是因為每個開發者的編輯器不一樣,大部分習慣是將編輯器產生的文件夾添加到全局的忽略配置中:
# file: ~/.gitignore_global .DS_Store .idea此外,還要配置指定全局的忽略文件配置在哪兒:
git config --global core.excludesfile/Users/michael/.gitignore_global或者編輯全局配置文件 ~/.gitconfig:
[core]excludesfile=/Users/michael/.gitignore_global參考:
- Git中全局忽略.DS_Store文件
解決沖突的工具
diffmerge是一個可以用來文件對比軟件。相較于 git mergetool 使用的自帶的界面,diffmerge 提供了一個可交互的編輯窗口,大大提高了效率。我們可以通過簡單的配置,在使用 git difftool git mergetool 時,默認使用 diffmerge 工具來進行展示差異。當然,你要是有錢,也可以選擇 Beyond Compare 來作為對比軟件。
選擇 OS X 10.6+ Installer (Intel) 版本,安裝好之后進行配置:
$ git config --global diff.tool diffmerge $ git config --global difftool.diffmerge.cmd "/usr/local/bin/diffmerge \"\$LOCAL\" \"\$REMOTE\""$ git config --global merge.tool diffmerge $ git config --global mergetool.diffmerge.trustExitCode true $ git config --global mergetool.diffmerge.cmd "/usr/local/bin/diffmerge --merge --result=\"\$MERGED\"\"\$LOCAL\" \"\$BASE\" \"\$REMOTE\""為了避免每次運行git difftool都有提示信息,可以輸入如下命令
$ git config --global difftool.prompt false為了能夠支持顯示中文,需要對編碼進行設置:
diffmerge 的使用:
- git difftool [fileName]
- git mergetool [fileName]
使用 git mergetool 合并分支時,默認會生成以 *.orig 為擴展名的備份文件,每次都要手動刪除。可以修改 Git 配置,禁止產生備份文件:
git config --global mergetool.keepBackup false參考:
- 油管-git mergetool explained 對自帶的 git mergetool 命令的使用介紹
- 油管-Git Tutorial: Diff and Merge Tools
- diffmerge 下載 選擇 OS X 10.6+ Installer (Intel) 版本
- diffmerge 幫助文檔
- 博客園-DiffMerge安裝配置使用 講了如何配置 UTF-8
- 對于解決 Git 的 Merge Conflict 你有哪些經驗和技巧
- SOF-How to resolve merge conflicts in Git
轉載于:https://www.cnblogs.com/michael-xiang/p/10465857.html
總結
以上是生活随笔為你收集整理的Git 基础 —— 安装 配置 别名 对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox 65.0.2 发布,Fi
- 下一篇: 成功打开华三模拟器后,创建设备完成却启动