Git與GitHub筆記
User: 洪衫仔 Post Date : 24-12-25 11:36 a.m.

https://github.com/Jordanlui2024/note.git

下載Git

設定Git

打命令:

查看git版本:

```
louis@DESKTOP-KMR7JT2 MINGW64 /d/PycharmProjects/ERB_BACKEND/script/proj1
$ git --version
git version 2.45.2.windows.1

```

第一次使用,要設定Git

在项目内打开GIT终端:

鼠标右键:选择“open git bash here”

查看项目:

```
louis@DESKTOP-KMR7JT2 MINGW64 /d/PycharmProjects/ERB_BACKEND/script/proj1
$ ls
app.js      app黄.js       package-lock.json    routes/
app.js.png  bin/           package.json         teacher.ejs.png
app原.js    mongodb01.js   progSearch.html.png  teacher.js.png
app豆.js    node_modules/  public/              views/

```

初始化:

```
louis@DESKTOP-KMR7JT2 MINGW64 /d/PycharmProjects/ERB_BACKEND/script/proj1
$ git init
Initialized empty Git repository in D:/PycharmProjects/ERB_BACKEND/script/proj1/.git/

```

這時,會在項目中看到一個隱藏的資料夾:.git

打開VSCODE

```
louis@DESKTOP-KMR7JT2 MINGW64 /d/PycharmProjects/ERB_BACKEND/script/proj1
$ code .

```

添加單個文件到快照區:

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git add .\progSearch.html.png
PS D:\PycharmProjects\ERB_BACKEND\script\proj1>
```

在項目根目錄下建立一個.gitignore文件,將不需提交的文件或文件夾寫入其中,例如:

添加所有文件到快照區(,gitignore內的除外):

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git add .
PS D:\PycharmProjects\ERB_BACKEND\script\proj1>
```

儲存進度點,做一個snapshot快照:

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git commit -m "proj1"
[master (root-commit) 441afbf] proj1
 41 files changed, 6066 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 .prettierrc
 create mode 100644 app.js
 create mode 100644 app.js.png
 create mode 100644 "app\345\216\237.js"
 create mode 100644 "app\350\261\206.js"
 create mode 100644 "app\351\273\204.js"
 create mode 100644 bin/www
 create mode 100644 mongodb01.js
 create mode 100644 node_modules/.package-lock.json
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 progSearch.html.png
 create mode 100644 public/form1.html
 create mode 100644 public/images/pic.jpg
 create mode 100644 "public/login\350\261\206.html"
 create mode 100644 "public/login\351\273\204.html"
 create mode 100644 public/progSearch.html
 create mode 100644 public/progSearch_new.html
 create mode 100644 public/progSearch_new_new.html
 create mode 100644 public/progSearch_old.html
 create mode 100644 public/stylesheets/style.css
 create mode 100644 "routes/auth\351\273\204.js"
 create mode 100644 routes/index.js
 create mode 100644 routes/teacher.js
 create mode 100644 "routes/teacher02\346\255\243\345\270\270.js"
 create mode 100644 "routes/teacher\345\216\237.js"
 create mode 100644 "routes/teacher\346\210\221.js"
 create mode 100644 routes/users.js
 create mode 100644 "routes/users\346\210\221.js"
 create mode 100644 "routes/users\351\273\204.js"
 create mode 100644 teacher.ejs.png
 create mode 100644 teacher.js.png
 create mode 100644 views/dashboard.ejs
 create mode 100644 views/error.ejs
 create mode 100644 views/fe.ejs
 create mode 100644 views/index.ejs
 create mode 100644 views/login.ejs
 create mode 100644 views/teacher.ejs
 create mode 100644 "views/teacher02\346\255\243\345\270\270.ejs"
 create mode 100644 "views/teacher\346\210\221.ejs"
PS D:\PycharmProjects\ERB_BACKEND\script\proj1>
```

圖形界面的操作

查看提交進度的日志:

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git log
commit b6ab0c12bfd85839af74f2350e3730a81621bc24 (HEAD -> master)
Author: Jordanlui2024 <[email protected]>
Date:   Sun Nov 24 17:21:58 2024 +0800

    chahge form1.htlm No.2

commit 7abf8e5e55bc23babed261601e38d0896b200cd6
Author: Jordanlui2024 <[email protected]>
Date:   Sun Nov 24 17:00:42 2024 +0800

    change form1.html

commit 441afbfef0cec987b036e456877e4b15e39898e0
Author: Jordanlui2024 <[email protected]>
Date:   Sun Nov 24 16:52:39 2024 +0800

    proj1
(END)
```

這是在 Windows 的 PowerShell 中執行`git log`命令後的輸出結果。

1. 輸出結果的含義

- `git log`命令:用於查看 Git 倉庫的提交歷史記錄。

- 每一行的含義

  :

  - `commit`行:顯示提交的哈希值(例如`b6ab0c12bfd85839af74f2350e3730a81621bc24`),這個哈希值是該次提交的唯一標識。後面括號裡的`(HEAD -> master)`表示當前所在的分支是`master`,並且`HEAD`指向這個提交。
  - `Author`行:顯示提交作者的名字(這裡是`Jordanlui2024`)和郵箱地址(`[email protected]`)。
  - `Date`行:顯示提交的日期和時間(例如`Sun Nov 24 17:21:58 2024 +0800`),表示這次提交發生的時間。
  - 提交信息:在日期行下面,是提交者在提交時輸入的簡短描述(例如`chahge form1.htlm No.2`),用於說明這次提交做了什麼更改。

2. 退出方法

在 PowerShell 中查看`git log`的結果時,如果你想退出查看狀態,可以按鍵盤上的`q`鍵,這樣就可以返回到 PowerShell 的命令提示符狀態。

如果你想進一步查看某次提交的詳細信息,還可以使用`git show`命令加上對應的提交哈希值,例如`git show b6ab0c12bfd85839af74f2350e3730a81621bc24`。

git status指令

`git status`是 Git 中非常常用的指令。

它主要的用途是查看工作目錄和暫存區的狀態。

1. 工作目錄(Working Directory)
   - 工作目錄是你在本地電腦上看到的、可以直接操作的文件和文件夾集合。當你修改、新增或者刪除文件時,首先是在工作目錄中進行操作。
   - 例如,你在本地的項目文件夾(也就是工作目錄)中修改了一個`.html`文件的內容,或者新增了一個`.js`文件。
2. 暫存區(Staging Area)
   - 暫存區是一個介於工作目錄和本地倉庫(Local Repository)之間的中間區域。你可以把想要提交(commit)的修改從工作目錄添加到暫存區。
   - 它就像是你在真正提交之前,先把要提交的內容放在一個 “臨時存放區”,可以方便你篩選哪些修改是要包含在下次提交中的。比如,你修改了三個文件,但只想提交其中兩個文件的修改,就可以先把這兩個文件添加到暫存區。

當你執行`git status`指令時:

- 如果工作目錄中的文件沒有任何修改,它會顯示類似 “沒有要提交的內容,工作目錄是乾淨的(nothing to commit, working tree clean)” 這樣的信息。
- 如果有修改,它會告訴你哪些文件被修改了,但還沒有添加到暫存區。例如,會顯示 “修改: file1.txt(modified: file1.txt)”。
- 如果文件已經添加到暫存區,它也會明確地指出。比如 “要提交的變更(Changes to be committed)”,並列舉出暫存區中的文件。

總之,`git status`可以幫助你及時了解本地工作環境的狀態,方便你更好地管理文件的修改和提交。

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   public/form1.html
        modified:   "public/login\350\261\206.html"

no changes added to commit (use "git add" and/or "git commit -a")
PS D:\PycharmProjects\ERB_BACKEND\script\proj1>
```

```
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   public/form1.html
        modified:   "public/login\350\261\206.html"

no changes added to commit (use "git add" and/or "git commit -a")
PS D:\PycharmProjects\ERB_BACKEND\script\proj1> git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   "public/login\350\261\206.html"

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   public/form1.html

PS D:\PycharmProjects\ERB_BACKEND\script\proj1>
```

Git忽視檔案  .gitignore

不需打路徑

忽視文件夾前面加“/”就可以

3種倒回以前版本的方法:

git checkout "之前版本的commit ID"與  git switch -

```
PS D:\学习专区\test> git checkout 828101620bc242e138b0b5b62c042b898073e263
Note: switching to '828101620bc242e138b0b5b62c042b898073e263'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.     
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 8281016 add  website.html
PS D:\学习专区\test> git switch -
Previous HEAD position was 8281016 add  website.html
Switched to branch 'master'
PS D:\学习专区\test>
```

Revert Commit(還原記錄)

```
Revert "加了新聞標題"

This reverts commit 2d46c2b40ccc7f0cba446341775895acd3358ba6.

Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#       modified:   website.html
#
~
.git/COMMIT_EDITMSG [unix] (09:14 25/11/2024)                                                                                                                                          1,1 All
"/d/学习专区/test/.git/COMMIT_EDITMSG" [unix] 11L, 304B                                                                                                                                      m
```

Reset Commit(重設記錄)小心使用,會永久刪除進度點!!!

```
PS D:\学习专区\test> git reset 828101620bc242e138b0b5b62c042b898073e263
Unstaged changes after reset:
M       website.html
PS D:\学习专区\test> git reset --hard 828101620bc242e138b0b5b62c042b898073e263
HEAD is now at 8281016 add  website.html
PS D:\学习专区\test>
```

Git分支(Branch)

```
PS D:\学习专区\test\branch_demo> git init
Initialized empty Git repository in D:/学习专区/test/branch_demo/.git/
PS D:\学习专区\test\branch_demo> git branch test01
PS D:\学习专区\test\branch_demo> git branch -a
* master
  test01
PS D:\学习专区\test\branch_demo> git switch test01
Switched to branch 'test01'     
PS D:\学习专区\test\branch_demo>

```

Git合併分支(Merge)和衝突(Conflict)

```
PS D:\学习专区\test\branch_demo> git merge search-feature
Updating 03ff3cb..4709c56
Fast-forward
 search-feature.js | 1 +
 test.js           | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 search-feature.js
 create mode 100644 test.js
PS D:\学习专区\test\branch_demo>


PS D:\学习专区\test\branch_demo> git branch -a
* master
  search-feature
  test01
PS D:\学习专区\test\branch_demo> git branch -D search-feature    
Deleted branch search-feature (was 4709c56).
PS D:\学习专区\test\branch_demo> git branch -a
* master
  test01
PS D:\学习专区\test\branch_demo>
```

合併分支到主線,要在當前主線上做合併!!

合併后,還要將合併的文件添加到快照區(vscode的“+”號),最后還要提交(點擊“勾”)。

GitHub

作者推薦使用gitlens插件

插件安裝后,要重啟VSCODE

在 VSCode 中把項目上傳到 GitHub 的步驟

以下是在 VSCode 中把項目上傳到 GitHub 的步驟:

一、安裝 Git 和登錄 GitHub 帳號

1. 安裝 Git
   - 首先要安裝 Git。你可以到 Git 官方網站(https://git - [scm.com/](https://scm.com/))下載符合你操作系統的版本。安裝好之後,在命令行輸入`git --version`就能檢查安裝是否成功。
2. 登錄 GitHub 帳號並創建倉庫
   - 登錄你的 GitHub 帳號,在右上角點擊 “+”,然後選擇 “New repository”。
   - 為倉庫命名,添加描述(這是可選的),還可以選擇倉庫的可見性(公開或者私有)。
   - 點擊 “Create repository” 就完成倉庫的創建了。

二、在 VSCode 中配置 Git(如果有需要)

1. 安裝 Git 擴展
   - 打開 VSCode,在左邊點擊 “擴展” 圖標(看起來像四個方塊),搜尋 “Git” 擴展並安裝。
2. 配置 Git 路徑
   - 打開 VSCode 的 “設置”(可以通過 “文件” - >“首選項” - >“設置” 打開),找到 “Git: Path” 選項。要是 Git 已經正確安裝且在系統路徑中,VSCode 一般可以自動檢測到 Git 的路徑。要是沒有,你就要手動指定 Git 可執行文件的路徑,在 Windows 系統下通常是`C:\Program Files\Git\bin\git.exe`,在 Linux 和 Mac 系統下通常是`/usr/bin/git`。

三、初始化本地項目倉庫並和遠程倉庫關聯

1. 打開項目文件夾
   - 在 VSCode 中,通過 “文件” - >“打開文件夾” 來選擇你的項目所在的文件夾。
2. 初始化本地 Git 倉庫
   - 在 VSCode 的終端(可以通過 “視圖” - >“終端” 打開)中,輸入`git init`。這樣會在你的項目文件夾中創建一個隱藏的`.git`文件夾,用來存放 Git 版本控制的相關信息。
3. 把文件添加到暫存區
   - 輸入`git add.`(注意這裡有個點,表示添加當前目錄下所有的文件和文件夾)。要是你只想添加特定的文件,可以把 “.” 換成具體的文件名或者路徑,例如`git add src/main.py`。
4. 提交更改
   - 輸入`git commit -m "Initial commit"`(“Initial commit” 是提交信息,你可以按照實際情況修改,簡要描述這次提交的內容)。這一步會把暫存區的文件提交到本地倉庫。
5. 關聯遠程倉庫
   - 在 GitHub 倉庫頁面,複製倉庫的 URL(可以通過點擊 “Code” 按鈕得到)。
   - 在 VSCode 終端中,輸入`git remote add origin <你的倉庫URL>`,把本地倉庫和遠程 GitHub 倉庫關聯起來。這裡的 “origin” 是遠程倉庫的別名,你可以自己定義,但一般都用 “origin”。

git remote add origin https://github.com/Jordanlui2024/note.git

四、把項目推送到 GitHub

1. 推送本地倉庫內容到遠程倉庫
   - 輸入`git push -u origin master`(要是你的默認分支不是 “master”,比如是 “main”,那就把 “master” 換成 “main”)。這一步會把本地倉庫的內容推送到遠程 GitHub 倉庫。第一次推送的時候,“-u” 選項會設定上游分支,之後推送只要用`git push`就行。

如果在操作過程中遇到問題,比如權限問題或者衝突問題,要根據具體的錯誤提示來解決。例如,如果是權限問題,可能要檢查你的 GitHub 帳號是否正確配置了 SSH 密鑰,或者是否提供了正確的用戶名和密碼(如果是用 HTTPS 方式)。

當多人在不同電腦協同開發一個項目時,如何避免上傳到GITHUB的文件發生衝突?

以下是一些在多人協同開發項目中避免 GitHub 文件衝突的方法:

一、分支管理策略

1. 主分支保護(Protect the Main Branch)
   - 把主分支(如`main`或`master`)設置為受保護狀態。在大多數版本控制平台(包括 GitHub)中,都可以通過倉庫設置來限制直接向主分支推送。只有在代碼經過測試、代碼審查等流程後,才允許合併到主分支。這樣可以保證主分支的代碼始終是相對穩定和可用的。
   - 例如,在 GitHub 的倉庫設置中,可以配置分支保護規則,要求合併到主分支時需要一定數量的審核通過或者特定的測試狀態達成。
2. 功能分支(Feature Branches)
   - 每位開發者在開發新功能或修改 Bug 時,都應從主分支建立自己的功能分支。比如,要開發用戶註冊功能,就可以建立一個名為`feature/user - registration`的分支。
   - 功能分支的存在使得不同的功能開發相互獨立。每個功能分支就像是一個獨立的工作空間,開發者可以在自己的功能分支上自由地編寫和提交代碼,而不會直接影響到其他開發者在其他分支上的工作。
   - 例如,開發者 A 在`feature/login - enhancement`分支上工作,他可以放心地修改登錄相關的代碼,而不用擔心與開發者 B 在`feature/product - search`分支上的代碼發生衝突。
3. 定期同步分支(Regularly Synchronize Branches)
   - 開發者要定期更新自己的分支。可以使用`git pull`或`git fetch`和`git merge`命令來更新分支。例如,在每天工作開始或者完成某一階段的任務後,開發者可以先更新自己的功能分支,把主分支或者其他相關分支的最新更改拉取到自己的分支中。
   - 另外,也可以考慮使用`git rebase`命令。它可以把分支的提交歷史整理得更加直觀,把自己分支的提交放在主分支最新提交的後面。但是使用`rebase`要小心,因為它會修改提交歷史,如果多人在同一分支上工作,可能會造成混亂。

二、溝通和協作機制

1. 任務分配和進度同步(Task Assignment and Progress Synchronization)
   - 在團隊中要有明確的任務分配。例如,通過項目管理工具(如 Jira、Trello 等)或者在團隊會議上明確每個人的工作任務和工作範圍。這樣可以避免多個開發者同時修改同一部分代碼。
   - 定期召開團隊會議,每位開發者匯報自己的工作進度和下一步計劃。在會議中,可以及時發現可能存在的代碼重疊或者衝突的地方。例如,如果有兩位開發者都打算修改某個核心模塊的功能,就可以在會議中協商,重新分配任務或者制定合作方案。
2. 即時溝通渠道(Real - time Communication Channels)
   - 建立即時溝通的渠道,如 Slack、微信工作群等。當開發者在工作中遇到可能會影響其他成員的更改時,或者遇到不清楚的代碼邏輯時,可以及時在群裡溝通。
   - 例如,開發者在修改某個全局配置文件時,可以在群裡告知其他成員,讓大家提前知道可能會有代碼合併時的衝突,或者可以一起討論更好的修改方案。

三、代碼審查(Code Review)

1. 合併前審查(Review Before Merge)
   - 在把功能分支合併到主分支或者其他分支之前,一定要進行代碼審查。可以通過 Pull Request(PR)的方式,在 GitHub 上或者其他支持的平台上提交合併請求。
   - 其他團隊成員可以在 PR 中查看代碼的修改,提出意見和建議。這樣可以在合併之前發現可能存在的衝突,比如不同的代碼修改邏輯或者命名規則不一致等問題。
   - 例如,在代碼審查中可以發現,兩個不同的功能分支對同一個函數的接口進行了不同的修改,這就需要在合併前協商解決。
2. 自動化工具輔助(Automated Tools Assistance)
   - 利用代碼格式化工具,如`Prettier`(用於多種編程語言的代碼格式化)和`ESLint`(用於 JavaScript 的代碼質量檢查)等。這些工具可以保證代碼的格式一致性,減少因代碼格式不同而引發的合併衝突。
   - 例如,在代碼提交之前,通過配置`pre - commit`鉤子(在`.git/hooks`目錄下),可以自動運行代碼格式化和質量檢查工具,要求代碼必須符合一定的格式和質量標準才能提交,從而降低合併時的風險。

==================================================================

已在這個文件添加node_modules ,D:\PycharmProjects\ERB_BACKEND\script\proj1\.gitignore,為什麽在GITHUB上還是見到node_modules?

1. 可能.gitignore 文件未生效
   - 原因分析
     - 有可能是`.gitignore`文件在添加`node_modules`之前,这些文件就已经被添加到了 Git 的暂存区。Git 在跟踪文件时,一旦文件进入暂存区,后续对`.gitignore`的修改不会自动将这些已经暂存的文件排除。
   - 解決方法
     - 你可以在项目目录下的终端(确保已经安装了 Git 并且在系统路径中可以访问)中执行`git rm -r --cached node_modules`。这个命令会将`node_modules`从 Git 的暂存区移除,但是不会删除本地文件系统中的`node_modules`文件夹。然后再提交并推送更改,这样`node_modules`就应该不会出现在 GitHub 上了。
2. 检查.gitignore 文件的语法和内容
   - 原因分析
     - 确保`.gitignore`文件的语法正确。例如,每一行应该是一个单独的模式来匹配文件或文件夹路径。如果语法错误,Git 可能无法正确解析`.gitignore`文件,导致`node_modules`没有被忽略。
   - 解決方法
     - 正确的`.gitignore`文件中排除`node_modules`的写法应该是单独一行写`node_modules`(如果要排除整个文件夹)。如果要排除特定的文件类型或名称在`node_modules`内部,例如`node_modules/*.log`(排除`node_modules`文件夹下所有.log 文件),语法需要符合 Git 的`.gitignore`规则。
3. 缓存问题或其他工具干扰
   - 原因分析
     - 有时候,IDE(如 Pycharm)或者其他版本控制工具可能会有自己的缓存或者设置,这些可能会干扰 Git 的正常操作。例如,Pycharm 可能有自己的 VCS(版本控制系统)设置,导致`.gitignore`文件没有被正确识别。
   - 解決方法
     - 尝试关闭 IDE 并重新打开项目,或者清除 IDE 相关的缓存。在 Pycharm 中,可以通过`File` - > `Invalidate Caches / Restart`来清除缓存并重新启动。同时,检查 IDE 中的版本控制相关设置,确保它们没有与 Git 的设置冲突。

如何确保.gitignore 文件的语法正确?

如果项目中存在多层级的`node_modules`文件夹,应该如何处理?

除了`.gitignore`文件,还有其他方法可以避免将`node_modules`上传到 GitHub 吗?

更新

```
git pull
```

提交筆記到GITHUB

```
git remote add origin https://github.com/Jordanlui2024/note.git

git push -u origin master
```

Replies : 0 Views :75
Login for create this forum reply