本地庫操作
- 本地庫初始化
- 命令:git init【初始化Git本地庫】
- 效果:
- 注意:.git 目錄中存放的是本地庫相關的子目錄和文件,不要刪除,也不要胡亂修改。
- 設置簽名
- 形式:
- 用戶名:tom
- Email 地址:[email protected]
- 作用:區分不同開發人員的身份
- 辨析:這裏設置的簽名和登錄遠程庫(代碼託管中心)的賬號、密碼沒有任何關係。
- 命令:
- 項目級別/倉庫級別:僅在當前本地庫範圍內有效
- git config user.name tom_pro
- git config user.email [email protected]
- 信息保存位置:./.git/config 文件
- 系統用戶級別:登錄當前操作系統的用戶範圍
- git config --global user.name tom_glb
- git config --global [email protected]
- 信息保存位置:~/.gitconfig 文件
- 級別優先級
- 就近原則:項目級別優先於系統用戶級別,二者都有時採用項目級別的簽名
- 如果只有系統用戶級別的簽名,就以系統用戶級別的簽名爲準
- 二者都沒有則不允許,後邊的操作會報錯
- 基本操作
- 狀態查看
- git status
- 查看工作區、暫存區狀態
- 含義:
- On branch master:在一個叫master的分支
- No commits yet:本地庫還沒有任何的提交
- 最後一行:暫存區中還沒有什麼可提交的
- 當我們在該路徑下隨便寫一個文件時,再次git status
- 灰色框:表示一個未追蹤的文件,我們可以使用git add命令進行提交
- 添加
- git add [file name]
- 將工作區的“新建/修改”添加到暫存區
- 再次使用git status,會發現文件已經提交到了暫存區
- 上圖也說明了,如果不想文件提交到暫存區,恢復到之前的狀態,那麼可以使用git rm --cached <file>命令
- 提交
- git commit [file name]
- 如果輸入這個命令,那麼會跳轉到vim編輯器,我們需要在打開的編輯器的第一行加入我們的 "commit message",之後使用 :wq 保存退出
- 或者使用如下的方式不需要進入vim編輯器
- git commit -m "commit message" [file name]
- 將暫存區的內容提交到本地庫
- 1 file changed:文件的改變數量
- 1 insertion(+):更改文件的行數,如果是第一次提交,那麼這個值就是該文件的所有行數
- 查看歷史記錄
- git log
- 假設當git log的時候記錄很多,那麼會有如下圖所示的效果,爲了方便演示,我把窗口調小了
- 屏幕底下會有冒號顯示
- 多屏顯示控制方式:
- 空格向下翻頁
- b 向上翻頁
- q 退出
- git log --pretty=oneline【每條日誌只顯示一行】
- git log --oneline【與上一條命令類似,只是前邊的hash值只顯示了一部分】
- git reflog【會顯示回退到某一版本,需要HEAD指針移動的次數】
- HEAD@{移動到當前版本需要多少步}
- 前進後退本質
- 本質:
- 基於索引值操作[推薦]
- git reset --hard [局部索引值] 【包括前進和後退】
- git reset --hard 56e9925
- 使用 ^ 符號:只能後退【這個版本有個問題,如果有很多個版本,那麼如果使用很多歌^會很不方便】
- git reset --hard HEAD^^^
- 注:一個^表示後退一步,n 個^表示後退 n 步
- 使用 ~ 符號:只能後退【所以纔有了~這個符號】
- git reset --hard HEAD~n
- 注:表示後退 n 步
- git reset 命令的三個參數對比
- 獲取Git命令文檔:git help [命令]
- --soft 參數
- Does not touch the index file【暫存區】or the working tree【工作區】at all (but resets the head to
<commit>
, just like all modes do).This leaves all your changed files "Changes to be committed", asgit status
would put it.- 僅僅在本地庫移動 HEAD 指針,所以原先本地庫和暫存區的對應關係本來一致,但是現在被打破了,曹成了不對等的關係,也就是說只有本地庫變了,暫存區和工作區都沒變
- --mixed 參數
Resets the index【暫存區】but not the working tree【工作區】 (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
If
-N
is specified, removed paths are marked as intent-to-add (see git-add(1)).在本地庫移動 HEAD 指針,也重置暫存區,也就是說只有本地庫和暫存區變了,工作區沒變
- --hard 參數
- Resets the index and working tree. Any changes to tracked files in the working tree since
<commit>
are discarded.- 在本地庫移動 HEAD 指針
- 重置暫存區
- 重置工作區
- 恢復當前指針指向的位置:
- git reset --hard HEAD
- 刪除文件並找回
- 在本地倉庫刪除指定文件
- git rm [file] 或者 git rm -r [folder]
- 將刪除操作的文件提交到本地倉庫
- git commit -m "delete message" [file/folder]
- 只是用 rm [file] 也可以進行刪除,不過需要將刪除操作對暫存區和本地庫進行提交 git add / git commit
- 最好使用 rm 的方式進行刪除
- 前提:刪除前,文件存在時的狀態提交到了本地庫,也就是說找回只是回到上一個版本沒有被刪除的狀態
- “找回”操作:git reset --hard [局部索引值]
- 這樣就相當於刪除文件並找回
- 刪除操作已經提交到本地庫:指針位置指向歷史記錄
- 刪除操作尚未提交到本地庫:指針位置使用 HEAD
- 比較文件差異
- git diff [文件名]
- 將工作區中的文件和暫存區進行比較
- 上圖我只是在第三行的結尾添加了一些@符號,但是在Git認爲,我們是把第三行刪除了,重新添加了一行,所以上圖中,紅色表示刪除,綠色表示添加
- git diff [本地庫中歷史版本] [文件名]
- 將工作區中的文件和本地庫歷史記錄比較
- 不帶文件名比較多個文件,比較工作區多個文件的差異
- 分支管理
- 什麼是分支?
- 在版本控制過程中,使用多條線同時推進多個任務
- 獨立開發彼此互不干擾
- 多個項目的交互運作
- 分支的好處?
- 同時並行推進多個功能開發,提高開發效率
- 各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。
- 開發失敗的分支刪除重新開始即可。
- 分支操作
- 創建分支
- git branch [分支名]
- 查看分支
- git branch -v
- 切換分支
- git checkout [分支名]
- 合併分支
- 第一步:切換到接受修改的分支(被合併,增加新內容)上
- git checkout [被合併分支名]
- 第二步:執行 merge 命令
- git merge [有新內容分支名]
- 前提:要被合併的分支必須包含接收修改的分支或者說被合併的分支要大於【包含】接收修改的分支,這樣才能保證成功合併
- 解決衝突
- 衝突的表現
- 衝突的解決
- 第一步:編輯文件,刪除特殊符號【如果是上圖刪除:<<<<<<< HEAD / ======= / >>>>>>> master】
- 第二步:把文件修改到滿意的程度,保存退出
- 第三步:git add [文件名]
- 第四步:git commit -m "日誌信息"
- 注意:此時 commit 一定不能帶具體文件名