文章目錄
- 安裝git
- git學習網站
- git初始配置
- 具體配置信息
- 新建版本庫(倉庫)
- git的工作區域和文件狀態
- 工作區域
- 文件狀態
- git文件提交的基礎指令
- git基礎指令
- 1. 版本提交
- 2. 分支創建
- 3. 分支切換
- 4. 分支合并
- (1) git merge
- (2) git rebase
- 5. 在git的提交樹上移動
- (1) HEAD
- (2) 分離的HEAD
- (3) 相對引用
- (4) 強制修改分支位置
- (5) 撤銷變更
- 6. 整理提交記錄
- 7. 交互式rebase
- 8. 設定里程碑
- 9. 添加標簽
- 綁定遠程倉庫
- 克隆遠程倉庫
- 同步遠程倉庫
- 使用遠程倉庫覆蓋本地倉庫
安裝git
Windows:Git安裝
Linux(Ubuntu):
sudo apt install git
git學習網站
Git教程
git初始配置
git config --global user.name "Jasper Yang"
保存用戶名和密碼,就不用每次重復輸入:
git config --global credential.helper store
查看git的配置信息:
git config --global --list
具體配置信息
- 省略(Local):本地配置,只對本地倉庫有效
- –global:全局配置,對所有倉庫有效
- –system:系統配置,對所有用戶生效
usr.name就是說配置的是用戶名。
當需要配置郵箱則改一點就行:
git config --global user.email geekhall.cn@gmail.com
后面的就是郵箱地址。
新建版本庫(倉庫)
- 創建倉庫
上面的方法是本地創建倉庫,我們也能使用git clone來克隆一個本就存在的倉庫。git init
git的工作區域和文件狀態
工作區域
- 工作區(.git所在的目錄):也就是電腦上的本地文件
- 暫存區(.it/index):用于保存即將提交到Git倉庫的修改內容
- 本地倉庫(.git/objects):通過git init創建的倉庫
文件狀態
- 未跟蹤(untrack)
- 未修改(Unmodified)
- 已修改(Modified)
- 已暫存(Staged)
上圖中展示了各種指令的作用,因為這里也就不再贅述了。
git文件提交的基礎指令
git status # 查看倉庫的狀態
git add # 添加到暫存區
git rm --cached # 將已經添加到暫存區的文件取出
git commit (-m) # 提交# -m用于指定文件的備注信息等# 這個信息會被提交
git log # 查看提交的日志信息
git reset # 用于回退版本
git基礎指令
1. 版本提交
git commit
該命令用于在當前所處的分支上提交新版本。
但是git不會盲目得將所有的內容全部重新提交,它會與上一個版本進行比較,如果有更新,就會在其基礎上進行更新。
2. 分支創建
git branch <name>
該命令用于創建一個分支,該分支的根節點是創建分支時所處的根節點。
3. 分支切換
git checkout <name>
先前我們已經使用了git branch對分支進行了創建,現在我們就可以使用git checkout進行分支切換了,因為git commit等操作是對當前分支進行操作。
4. 分支合并
(1) git merge
git merge
這里用圖來理解下:
現在有兩個分支,main和bugFix,現在我們根據“星號”的位置,可知現在我們處于main分支上。
此時我們使用git merge bugFix:
(2) git rebase
git rebase
git rebase其實就是取出一系列的提交記錄,“復制”它們,然后在另一個地方逐個放下去。
現在我們處于bugFix分支上,bugFix分支是基于C1的修改,main所處的C2分支也是基于C1的修改,現在使用git rebase main對分支進行合并:
需要注意的是:C3節點并沒有消失。
坦白點說:當你在bugFix分支上運行git rebase main命令時,實際上是將bugFix分支上的提交記錄復制并重新應用到main分支上。這意味著Git會先找到bugFix分支與main分支的最近共同祖先,然后將bugFix分支自該祖先以來的提交記錄依次復制并在main分支上重新應用。這樣可以使得bugFix分支的提交歷史與main分支保持在一條直線上,同時整合bugFix分支的改動到main分支上。
所以我理解這個語句為:將根節點重新設定為main所指向的節點。
5. 在git的提交樹上移動
(1) HEAD
HEAD是當先所在分支的符號引用——也就是指向你正在其基礎上進行工作的提交記錄。
HEAD總是指向當前分支上的最后一次提交記錄。
HEAD在通常情況下是指向分支名的。
(2) 分離的HEAD
分離的HEAD指向了某個具體的提交記錄而不是分支名。
在教程中使用的checkout進行切換,切換的目標是對應節點的哈希值。
節點的哈希值,我們能夠使用git log進行查看:
git log
(3) 相對引用
git中,我們能通過相對引用,從一個易于記憶的節點或者HEAD進行計算:
- ^:向上移動一個提交記錄
- ~<num>:向上移動num個提交記錄,例如:~3
這里給出兩個示例:
HEAD^^
main~3
(4) 強制修改分支位置
git branch -f main HEAD~3
上面的命令會將main分支強制指向HEAD的第3級parent提交。
(5) 撤銷變更
Git中撤銷變更的方式很多,主要的命令有兩個:git reset和git revert,這兩個是有區別的。
reset在本地好用,就是版本回退,但是如果是在分布式協作的時候就需要使用revert了,它不是直接回退,而是將更新一個版本,這個版本與需要回退的版本一樣。
git reset
git revert
需要配合參數使用,表示需要回退多少個版本:
git reset HEAD~1
6. 整理提交記錄
git cherry-pick
該指令用于將節點復制到目前分支上。
這跟之前的rebase有點類似。
cherry-pick適用于知道節點hash值的情況。
7. 交互式rebase
交互式rebase其實就是rebase使用參數"-interactive",縮寫為"-i",其余與之前rebase的一樣。
git rebase -i main~4
它會將main~4的一系列指令進行一個復制操作,然后它會彈出一個UI對話框,其中可以選擇拖拽更換節點位置,或者使用pick對節點進行一個“刪除”,這樣它不會對該節點進行復制。
8. 設定里程碑
里程碑將固定指向某個節點,因此也叫做里程碑。
git tag version1 C1
這會將節點C1命名為version1,那么現在version1就表示C1。
9. 添加標簽
這個標簽就是對該節點的描述:
git describe <ref>
其中ref可以是任意可以表示該節點的方法,不管是tag、hash值和HEAD都行。
使用后會有一個輸出,格式如下:
<tag>_<numCommits>_g<hash>
- tag:離ref最近的標簽
- numCommits:ref和tag相距多少個commit
- hash:給定的ref的hash值,若是ref有標簽,則輸出標簽
綁定遠程倉庫
我們可以使用clone指令和remote指令綁定遠程倉庫,例如在Github和Gitee創建的。
git clone <url>git remote <url>
這兩個指令相對來說比較復雜,建議看看官方的git教程。
克隆遠程倉庫
我們常常把代碼托管在遠程倉庫,當我們想要拉取自己或者別人的遠程倉庫的時候,我們通常會使用clone指令:
git clone <url>
這樣就能將倉庫中的所有文件全部完整的拉取下來,包括原本的分支情況和標簽等等信息。
==這些信息都會存儲在該文件夾的**.git**中。
同步遠程倉庫
當本地倉庫的內容發生了修改,我們想要將修改后的內容推送到遠程倉庫中,這時候,我們就需要將我們已經修改好的內容進行一個推送(push),因為是將本地已經修改好的內容推送,理所應當的是這個被修改了的文件在本地應該處于commit狀態,然后我們就能使用git push進行同步了。
git push [-option]
使用遠程倉庫覆蓋本地倉庫
首先此時我們先要確定本地倉庫已經和遠程倉庫連接了:
git remote -x
使用這個指令可以看到遠程倉庫源。
然后將遠程倉庫的內容拉取到本地:
git fetch origin
但是,這樣拉取到本地的內容不會自動合并,于是我們需要合并代碼:
- 首先切換到想要進行覆蓋的遠程分支:
這樣,工作區就被切換到需要進行覆蓋的遠程分支了。git checkout <remote-branch-name>
- 對本地倉庫進行重設:
git reset --hard origin/<remote-branch-name>
- 然后將本地進行覆蓋后的內容推送到遠程倉庫:
這段代碼會會強制推送本地倉庫內容到遠程倉庫,覆蓋遠程分支。git push origin <remote-branch-name> --force