參考視頻:【GeekHour】一小時Git教程
一句話定義:Git是一個免費開源的分布式版本控制系統。
版本控制系統可以分為兩種,1.集中式(SVN,CVS);2.分布式(git)
git的工作區域和文件狀態
git的工作區域
git中文件也存在下面幾種狀態
添加和提交文件
git reset
默認是mixed。這三種模式實際上就是回退程度的區別。下圖可以解釋區別,其中工作區是本地實際的文件,暫存區是git add后的區域。
當然,如果誤操作了git reset也沒關系,可以使用git reflog
查看修改記錄,然后再使用git reset
回退。
git log
和git reflog
的區別
項目 | git log | git reflog |
---|---|---|
作用 | 查看分支上的提交歷史 | 查看 HEAD 或分支引用的變動歷史 |
內容 | 顯示當前分支的提交(commit)記錄 | 顯示 HEAD 或分支引用的所有變動(如 reset、rebase、commit) |
記錄范圍 | 只包含分支上可達的 commit | 包括被丟棄、回滾、rebase 覆蓋的 commit |
保留時間 | 只要 commit 沒有被垃圾回收就會一直在 | 默認保留 90 天(可配置),之后會被 Git 回收 |
常用場景 | 查看項目歷史、提交說明 | 誤操作恢復(如找回 reset 丟失的提交) |
可見性 | 用戶面向,邏輯提交歷史 | Git 內部記錄,供恢復使用 |
示例命令 | git log --oneline | git reflog |
git diff
比較工作區和暫存區之間的差異
進行git add
后,上面就無區別了。
比較工作區和版本庫之間的差異
git diff HEAD
(對比當前工作區的文件和最新一次提交(HEAD)之間的差異)
比較暫存區和版本庫之間的差異 : git diff --cached
比較兩個不同版本庫之間的差異
HEAD~n表示前n個版本
git rm刪除文件
如果不用git rm,那正常的操作流程是,先rm刪掉文件,然后git add同步到暫存區。
上面流程可以用git rm
,即同時刪除工作區和暫存區的文件。
gitignore
匹配規則例子:
SSH配置和遠程倉庫
SSH與HTTPS之辨析與實踐
關聯本地倉庫和遠程倉庫
git push -u
中的 -u
是--set-upstream
的簡寫,作用是:
把當前分支和遠程分支綁定,以后你只需輸入 git push
或git pull
就行,不用每次指定遠程和分支名。
當然,下面中遠程倉庫需要新建,然后就可以通過下面步驟把本地代碼同步到遠程倉庫了。
比如:我想要把hhh分支上的推送到遠程的main,git push origin hhh:main
分支以及合并沖突
分支合并:merge
和rebase
merge
你在哪個分支執行 git merge,就是把“別的分支”合并到“你當前所在的分支”上。
比如下面,在main分支上使用merge dev,就把dev合并到當前的main上,此時會有產生一個新的提交(如下面的“merge")。
rebase
把當前分支的提交“挪到”目標分支的最末尾,重新“重放”一遍,形成一條線性的提交歷史。
git pull 和 git fetch
git fetch 把遠程倉庫的更新拉到本地,但不影響你當前的代碼(不合并、不修改工作區)。
命令 | 拉代碼 | 自動合并 | 修改工作區 |
---|---|---|---|
git fetch | ? | ? | ?(不影響當前分支) |
git pull | ? | ? | ?(直接合并) |
git fetch 安全、可控,適合先看看有沒有沖突再決定怎么合并。
git pull 是 fetch + merge 的快捷方式,一鍵拉并合并。