三個區域
下面三個區域,是Git虛擬的區域,看不到,摸不著。
- 工作區
- 工作區,指的是使用Git管理后的文件,這些文件顯示在磁盤上,供我們使用或修改的區域。所以,粗略的說,項目文件夾就是工作區。
- 暫存區域
- 執行
git add .
之后,文件由工作區,添加到了暫存區。 暫存區保存了下次將提交的文件列表信息。
- 執行
- Git 倉庫區、本地倉庫
- 執行
git commit -m '提交說明'
之后,代碼會被提交到倉庫區。倉庫區是 Git 中最重要的部分,代碼只有提交到倉庫,才會形成一次歷史記錄,即才會形成一個版本。
- 執行
工作區新建的文件和Git沒有任何關系;文件被添加到暫存區,才叫做被Git管理過
記錄每次更新到倉庫
添加文件到暫存區
新文件,只有添加到暫存區,才叫做被Git管理。否則和Git沒什么關系,即使文件在項目文件夾。
# 添加指定文件到暫存區
$ git add 文件名# 以空格隔開可以一次 add 多個文件
$ git add [file1] [file2] ...# 添加指定目錄到暫存區,包括子目錄
$ git add [dir] [file] [dir] [file] [file] ...# 添加當前目錄的所有文件到暫存區,包括子目錄
$ git add .
提交文件到倉庫
提交到倉庫的文件,是暫存區中的文件。
# 提交暫存區到倉庫區
$ git commit -m [message]# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]# 提交工作區和暫存區自上次commit之后的變化,直接到倉庫區。
# 新文件,從未被Git管理過,是不能直接提交到倉庫區的
$ git commit -a -m "提交日志"
撤銷操作
撤銷操作,只能恢復暫存區或工作區,與最近一次提交的代碼一致。
# 恢復暫存區的指定文件到工作區
$ git checkout [file]# 恢復暫存區的所有文件到工作區
$ git checkout .# 恢復某個commit的指定文件到暫存區和工作區
$ git checkout [commit版本號] [file]# 重置暫存區的指定文件,與上一次 commit 保持一致,但工作區不變
$ git reset [file]# 重置暫存區與工作區,與上一次commit保持一致。該命令后不能加文件或文件夾
$ git reset --hard
前文中,
git checkout 版本號
能夠將代碼退回到歷史的任何版本,但不算是嚴格意義的回退,因為它叫做版本穿梭。具體見后文的分支管理。
分支管理
什么是分支
隨著git提交的次數越來越多,就會形成由各個版本連接而成的一條提交線。如下圖:
由Git提交而形成的提交線,稱為分支。默認的分支是主分支,叫做 master
,前面的學習,一直是在 master
分支上提交。
我們也可以創建其他分支,新創建的分支,相當于是原分支的一個拷貝。
實際開發中
- 為了保證代碼的安全性,不允許在主分支上進行開發
- 需要創建其他分支,在其他分支上進行開發,這樣不會影響主分支上的代碼
- 其他分支開發完成后,可以選擇將其他分支代碼合并到主分支上
創建其他分支
# 創建分支
git branch 分支名
# 比如
git branch dev# 切換分支到dev
git checkout dev# 也可以創建并直接切換分支
git checkout -b dev
切換分支之前,需要把當前分支的工作全部提交,否則不允許切換到其他分支。
實際開發中,鼓勵多使用分支。
快進模式合并兩個分支
快進模式合并
- 兩個分支A和B
- B分支包含A分支的最新版本,在合并的時候,叫做快進模式合并。
- 快進模式合并,相當于使用B分支的代碼覆蓋A分支的代碼;同時版本也會更新到A分支
兩個分支合并,比如把 B 分支 合并到A分支上
- 需要先切換到A分支
- 然后執行
git merge B
,表示把B分支的代碼合并到A分支上。
# 切換到A分支
git checkout A# 把B分支的代碼合并到A分支
git merge B
合并模式合并兩個分支
合并模式
- 兩個分支A和B
- A分支有獨立的提交,B分支也有獨立的提交,在合并的時候,叫做合并模式的合并。
- 合并模式,有可能會產生沖突;如果出現沖突,需要解決沖突,然后需要
添加
、提交
一次,從而完成合并。
兩個分支合并,比如把 B 分支 合并到A分支上
- 需要先切換到A分支
- 然后執行
git merge B
,表示把B分支的代碼合并到A分支上。 - 如果看到
CONFLICT
,則表示有沖突,需要打開有沖突的文件,手動解決沖突
,然后添加、提交即可。
# 切換到A分支
git checkout A# 把B分支的代碼合并到A分支
git merge B
如果有沖突,會顯示如下提示:
手動打開有沖突的文件,解決沖突,保存文件。(手動解決)
再次添加(add操作)提交(commit),即可完成合并。
其他相關命令
# 查看所有分支(本地分支)
git branch# 查看所有分支(包括遠程分支)
git branch -a# 刪除分支(需要先切換到其他分支,然后在執行刪除)
git branch -d 分支名# 創建并直接切換分支
git checkout -b dev
如果要切換分支,必須把當前分支的代碼全部提交到本地倉庫。
穿梭到歷史后,如何使用歷史版本中的代碼
- 穿梭到歷史的一個版本后,
根據該版本
創建一個分支,比如 B 分支 - 在分支B中,修改需要使用的文件,然后提交(提交之后,后面的合并就會有沖突)
- 回到之前的分支的最后一次提交的位置(切換回原來的分支)
- 合并剛剛創建的新分支(B)即可
實際上就是為了練習分支。
遠程倉庫
說明
目前,我們的操作都是一個人開發,如果涉及到多人開發呢?大家的代碼如何合并到一起呢?這個時候就需要公網上的一臺服務器了,大家可以把代碼提交到這臺服務器上,也可以從服務器上拉取所有的代碼。這個公網上的服務器就叫做遠程倉庫。
完全可以自己搭建一臺運行Git的服務器,不過現階段,為了學Git先搭個服務器絕對是小題大作。好在這個世界上有個叫 GitHub 的神奇的網站,從名字就可以看出,這個網站就是提供Git倉庫托管服務的,所以,只要注冊一個GitHub賬號,就可以免費獲得Git遠程倉庫。
實際上,除了GitHib,還有很多第三方遠程倉庫托管服務:
- GitHub(這個網站有時很難打開)
- 碼云(gitee)(打開速度快)
- coding
- Gitlab
創建遠程賬號
略
配置SSH
在本地命令行,執行下面的命令,可以生成SSH秘鑰(包含一個公鑰一個私鑰)
ssh-keygen -t rsa -C "你的郵箱地址"
# 執行完這個命令之后,后面有一些詢問,我們直接一路回車即可
最后生成的秘鑰在:
Windows:
C:\Users\用戶名\.ssh // Users--用戶 GaoWei--我的計算機用戶名mac:
你的用戶名那個文件夾中。 按shift+Commend+. 可以顯示隱藏文件,然后就可以看到 .ssh文件夾了
找到 .ssh/id_rsa.pub
,用vscode打開,復制里面全部的內容,配置到遠程倉庫
- GitHub右上角的三角號
- Settings
- 左側有 SSH and GPG keys
- 在顯示的界面中,點擊右上角的 New SSH key,然后完成添加公鑰操作
新建遠程倉庫
將本地倉庫中的代碼推送到遠程倉庫
推送的是本地倉庫的代碼。工作區和暫存區的代碼不會被推送到遠程倉庫
- 復制遠程倉庫的 ssh 地址
-
本地倉庫中,執行
# 添加遠程倉庫地址,讓我們的本地倉庫和遠程倉庫建立關聯 # origin 可以自定義 git remote add origin 遠程倉庫的ssh地址
-
首次推送之前,需要先拉取遠程倉庫的代碼(README.md)到本地
git pull origin master --rebase
-
完成首次推送
# 如果遠程沒有本地的 分支,第一次推送,需要加 -u git push -u origin master
-
后續繼續開發
# 改動了代碼,先添加到暫存區 git add . # 提交到本地倉庫 git commit -m 'xxxx'# 推送到遠程倉庫 git push
注意事項
- 什么時候需要先拉取,然后在推送
- 遠程倉庫的提交比本地倉庫的要新,或者不一樣,都需要先拉取,然后在推送
- 如果提示 “Are you sure you want to continue connecting (yes/no/[fi…])”
- 輸入yes,回車
克隆遠程倉庫到本地
-
實際開發中,有些時候,我們需要把別人倉庫的代碼克隆到本地
- 下載別人的代碼的時候,可以選擇克隆
- 多人合作開發的時候,需要克隆合作伙伴的代碼到本地
-
克隆命令
git clone 遠程倉庫的ssh地址
-
克隆別人的倉庫到你的電腦中
- 克隆,相當于下載。可以克隆下來,但是不能向別人的倉庫推送
-
克隆的是自己的倉庫
- 克隆下來,也可以推送
多人協作
- 可以先創建遠程倉庫
- 【可選】我先把基礎的代碼推送到遠程倉庫
- 合作者,需要把遠程倉庫的代碼,克隆到你的計算機中
- 管理員邀請合作者共同來開發
- 合作者,需要同意
- 然后,管理員和合作者,都可以向遠程倉庫推送代碼
- 推送之前,必須先拉取。拉取之后,如果有沖突,解決沖突。然后推送。
如果遇到:
點擊 “i” ,按上下左右鍵,調整光標的位置,然后刪除里面所有的內容,隨便寫一點也可以,但是不能太多。按esc,退出編輯模式,繼續按 “:wq” ,表示保存,并退出的意思。
后續,可以push。