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