Git基礎操作及共同作業流程

2023-02-25 18:02:26

一整套流程幫你實踐整個 Git 操作基礎流程。

來源:https://docs.microsoft.com/zh-cn/learn/paths/intro-to-vc-git/

Git 介紹

設定 Git

確認已經安裝 git

git --version

輸出

git version 2.30.1 (Apple Git-130)

設定 Git,必須定義一些全域性變數:user.nameuser.email

git config --global user.name "<USER_NAME>"
git config --global user.email "<USER_EMAIL>"

檢查更改是否成功。

git config --list

輸出

user.name=User Name
[email protected]

設定 Git 儲存庫

建立名為「Cats」的資料夾,此資料夾為專案目錄(也稱為「工作樹」)

mkdir Cats
cd Cats

初始化新儲存庫,將預設分支名稱設定為 main

git init --initial-branch=main
git init -b main

使用 git status 顯示工作樹的狀態:

git status

輸出

On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

使用 ls -a 顯示工作樹的內容:

ls -a

確認目錄包含一個名為.git 的子目錄。此資料夾為 Git 儲存庫——用於儲存工作樹的後設資料和歷史記錄的目錄。

從 Git 獲取幫助

git --help

輸出

usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone             Clone a repository into a new directory
   init              Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add               Add file contents to the index
   mv                Move or rename a file, a directory, or a symlink
   restore           Restore working tree files
   rm                Remove files from the working tree and from the index
   sparse-checkout   Initialize and modify the sparse-checkout

examine the history and state (see also: git help revisions)
   bisect            Use binary search to find the commit that introduced a bug
   diff              Show changes between commits, commit and working tree, etc
   grep              Print lines matching a pattern
   log               Show commit logs
   show              Show various types of objects
   status            Show the working tree status

grow, mark and tweak your common history
   branch            List, create, or delete branches
   commit            Record changes to the repository
   merge             Join two or more development histories together
   rebase            Reapply commits on top of another base tip
   reset             Reset current HEAD to the specified state
   switch            Switch branches
   tag               Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch             Download objects and refs from another repository
   pull              Fetch from and integrate with another repository or a local branch
   push              Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.

建立和修改 Git 專案

建立和新增(暫存)檔案

使用 touch建立名為 index.html 的檔案

touch index.html

如果檔案存在,touch 會更新檔案的上次修改時間。

使用 git status 獲取工作樹的狀態:

git status

輸出:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
  index.html

nothing added to commit but untracked files present (use "git add" to track)

使用 git add 將新檔案新增到 Git 的「index」,然後是用 git status 檢查狀態。. 表示為當前目錄中的所有檔案新增編制索引。

git add .

使用 git status 以確保更改已暫存無誤:

git status

輸出

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
  new file:   index.html

進行首次提交

使用以下命令建立新提交

git commit index.html -m "Create an empty index.html file"

輸出

[main (root-commit) 166b2d9] Create an empty index.html file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index.html

使用 git log 顯式有關提交的資訊:

git log

輸出

commit 166b2d94a49ecbe6008aa027e9d2f7d870c78724 (HEAD -> main)
Author: duzhida <[email protected]>
Date:   Fri Feb 25 19:54:08 2022 +0800

    Create an empty index.html file

修改 index.html 並提交更改

修改 index.html,將以下語句貼上到編輯器。

<h1>Our Feline Friends</h1>

使用 git status 檢查工作樹狀態:

git status

輸出

On branch main
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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

提交更改

git commit -a -m "Add a heading to index.html"

輸出

[main 57cdf5c] Add a heading to index.html
 1 file changed, 1 insertion(+)

修改 index.html

將 index.html 修改為以下內容

<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Our Feline Friends</title>
  </head>
  <body>
    <h1>Our Feline Friends</h1>
    <p>Eventually we will put cat pictures here.</p>
    <hr>
  </body>
</html>

使用 git diff 命令檢視更改的內容

git diff

輸出

On branch main
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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

預設使用 git diff 將工作樹與索引進行比較。若要將工作樹與上次提交進行比較,可以使用git diff HEAD

提交更改。如果在索引中已具有檔案,可以顯示命令要暫存和提交的檔案,而不是使用-a 標誌。

git commit -m "Add HTML boilerplate to index.html" index.html

再次使用 git diff 將工作樹與索引進行比較:

git diff

git diff 不會生成任何輸出,因為工作樹、索引和 HEAD 全部一致。

建立忽略提交的檔案

新建名為.gitignore 的檔案,將以下行新增到該檔案中:

*.bak
*~

此行指示 Git 忽略名稱以.bak~結尾的檔案。

使用以下命令來提交更改:

git add -A
git commit -m "Make small wording change; ignore editor backups"

-A 選項與 git add 結合使用,以新增所有未跟蹤(和未忽略)的檔案,以及已更改並受 Git 控制的檔案。

建立新的檔案

在 CSS 目錄下建立一個名為 site.css 的檔案,並將以下內容新增到site.css 中。

mkdir CSS
cd CSS
code site.css
h1, h2, h3, h4, h5, h6 { font-family: sans-serif; }
body { font-family: serif; }

修改 index.html,並將以下內容新增到 index.html 中,在<title>行之後。

<link rel="stylesheet" href="CS/site.css">

使用 git status 檢視已更改檔案的摘要,並將未跟蹤檔案暫存到版本控制,並將所做更改提交。

git add .
git commit -m "Add a simple stylesheet"

列出提交

使用 git log 檢視所有提交:

git log

輸出

commit 184bff431ac0c16b798d2dc5636d22fef68cbcaf (HEAD -> main)
Author: duzhida <[email protected]>
Date:   Fri Feb 25 20:07:24 2022 +0800

    Add HTML boilerplate to index.html

commit 57cdf5c28b8b20fa75cc34aa0481308e2347f257
Author: duzhida <[email protected]>
Date:   Fri Feb 25 20:00:05 2022 +0800

    Add a heading to index.html

commit 166b2d94a49ecbe6008aa027e9d2f7d870c78724
Author: duzhida <[email protected]>
Date:   Fri Feb 25 19:54:08 2022 +0800

    Create an empty index.html file

新增—-oneline 引數可以使輸出更加簡潔:

git log --oneline
184bff4 (HEAD -> main) Add HTML boilerplate to index.html
57cdf5c Add a heading to index.html
166b2d9 Create an empty index.html file

修改提交:--amend 標誌

在上一個練習中,連結樣式表的目錄檔案路徑出現了錯誤,因此在 index.html 中更新了正確的路徑。此時可以直接提交 index.html 的已更正版本,可以選擇將其放在與原始版本相同的提交中。利用 git commit--amend 選項可以更改歷史記錄。

git commit --amend --no-edit

--no-edit 選項指示 Git 在不更改提交訊息的情況下進行更改。 你還可以使用 --amend 來編輯提交訊息、新增意外遺留在提交之外的檔案或刪除錯誤新增的檔案。

更改歷史記錄是 Git 最強大的功能之一。 與使用大多數功能強大的工具一樣,必須謹慎使用此功能。 特別注意,建議不要更改已與另一開發人員共用或已釋出在共用儲存庫(如 GitHub)中的提交。

恢復已刪除的檔案

刪除 index.html

rm index.html

恢復 index.html。使用 git checkout 恢復 index.html

git checkout -- index.html

輸出

Updated 1 path from the index

恢復檔案已刪除的檔案:git rm

使用 git rm 來刪除檔案,此命令會把檔案從磁碟和 Git 索引中的記錄檔案刪除。此時 git checkout -- index.html 將無法順利恢復。

此時必須使用 git reset 取消暫存更改。

git rm index.html

此時使用 git checkout 無法恢復 index.html。因為這次 Git 不僅刪除了該檔案,還將刪除操作記錄在索引中。

輸出

error: pathspec 'index.html' did not match any file(s) known to git

git reset 從 Git 取消檔案刪除的暫存。此命令會將檔案返回到索引,但仍會在磁碟上刪除該檔案,此時就可以用 git checkout 將其從索引還原到磁碟。

git reset HEAD index.html

Git 提供多種重置型別。 預設型別為 --mixed,它會重置索引,但不會重置工作樹;如果指定其他提交,它也會移動 HEAD。 --soft 選項僅移動 HEAD,且保持索引和工作樹不變。 此選項會像 git status 那樣,將所有更改保留為「待提交更改」。 --hard 重置會同時更改索引和工作樹以匹配指定的提交;對跟蹤檔案所做的所有更改都會被丟棄。

輸出

Unstaged changes after reset:
D  index.html

現在可以使用 git checkout -- index.html 來恢復檔案。

還原提交

假設修改了檔案導致錯誤,要將檔案恢復到先前的版本,但是更改已提交。這樣就要還原先前的提交。

修改 index.html,用一下程式碼替換 index.html 中的內容並儲存提交。

<h1>That was a mistake!</h1>
git commit -m "Purposely overwrite the contents of index.html" index.html
git log -n1

此時使用 git revert 復原已提交的更改

git revert --no-edit HEAD

--no-edit 表示不需要為此操作新增提交訊息。

輸出

[main e2276d3] Revert "Purposely overwrite the contents of index.html"
 Date: Sun Feb 27 10:46:19 2022 +0800
 1 file changed, 13 insertions(+), 1 deletion(-)

使用 git log 顯式最新的提交

git log -n1

輸出

commit e2276d3b8876d749315a11ac526f469afaee18c1 (HEAD -> main)
Author: duzhida <[email protected]>
Date:   Sun Feb 27 10:46:19 2022 +0800

    Revert "Purposely overwrite the contents of index.html"
    
    This reverts commit 229660d415c197288b499d1c7d2913534ae995f3.

與 Git 共同作業

設定

mkdir Cats
cd Cats
git init --initial-branch=main
git init -b main
git config user.name "cats"
git config user.email "[email protected]"
touch index.html
mkdir CSS
touch CSS/site.css
git add .
git commit -m "Create empty index.html, site.css files"
code index.html
code CSS/site.css
git add .
git commit -m "Add simple HTML and stylesheet"
git log --oneline
<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Our Feline Friends</title>
    <link rel="stylesheet" href="CSS/site.css">
  </head>
  <body>
    <h1>Our Feline Friends</h1>
    <p>Eventually we will put cat pictures here.</p>
    <hr>
  </body>
</html>
h1, h2, h3, h4, h5, h6 { font-family: sans-serif; }
body { font-family: serif; }

輸出

0d5e59f (HEAD -> main) Add simple HTML and stylesheet
07d4229 Create empty index.html, site.css files

克隆儲存庫

模擬 Alice 將儲存庫克隆到他們的計算機上。在實際中,可以通過設定網路共用或可通過 URL 存取的遠端儲存庫來完成此操作。

cd ..
mkdir Alice
cd Alice

使用 git clone 將專案目錄中的儲存庫可能到 Alice 目錄中。

git clone ../Cats .

輸出

Cloning into '.'...
done.

拉取請求

若儲存倉庫作出修改,可以使用 git pull 拉取最新的更改。

git pull

做出更改並提交拉取請求

Alice 更改了網站的背景色。

設定Alice本地儲存庫標識:

git config user.name "alice"
git config user.email "[email protected]"
code CSS/site.css
body { font-family: serif; background-color: #F0FFF8; }

提交更改

git commit -a -m "Change background color to light blue"

然後必須對原始儲存庫發出拉取請求

git request-pull -p origin/main .

輸出

warn: refs/heads/main found at . but points to a different object
warn: Are you sure you pushed 'HEAD' there?
The following changes since commit 0d5e59f17b0f6e6f8c7c6515abb55e398465fb59:

  Add simple HTML and stylesheet (2022-02-27 10:58:42 +0800)

are available in the Git repository at:

  . 

for you to fetch changes up to 825aab8e6500f896f21b6c5aba8bdf4bec18dbe3:

  Change background color to light blue (2022-02-27 11:30:27 +0800)

----------------------------------------------------------------
alice (1):
      Change background color to light blue

 CSS/site.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CSS/site.css b/CSS/site.css
index caefc86..86d41e8 100644
--- a/CSS/site.css
+++ b/CSS/site.css
@@ -1,2 +1,2 @@
 h1, h2, h3, h4, h5, h6 { font-family: sans-serif; }
-body { font-family: serif; }
\ No newline at end of file
+body { font-family: serif; background-color: #F0FFF8; }
\ No newline at end of fil

建立遠端儲存庫並完成拉取操作

在實際中,Alice 目錄位於 Alice 的計算機上。通過使用 git remote 命令設定遠端儲存庫,然後將該遠端庫用於拉取和推播請求。

cd ../Cats
git remote add remote-alice ../Alice

執行拉取,必須在拉取命令中指定分支 main

git pull remote-alice main

輸出

remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 363 bytes | 363.00 KiB/s, done.
From ../Alice
 * branch            main       -> FETCH_HEAD
 * [new branch]      main       -> remote-alice/main
Updating 0d5e59f..825aab8
Fast-forward
 CSS/site.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

建立共用儲存庫進行共同作業

你需要的是不包含工作樹的儲存庫。 與工作樹相比,空儲存庫具有多個優點:

  • 沒有工作樹,每個人都可以推播更改,而不必擔心簽出了哪個分支。
  • Git 可以輕鬆檢測到其他使用者是否推播了可能與你的更改衝突的更改。
  • 共用儲存庫可以擴充套件到任意數量的開發人員。 使用空儲存庫,你只需瞭解共用儲存庫,而不需要了解可能需要向其拉取的所有其他共同作業者。
  • 共用儲存庫放置在你們都可以完全存取的伺服器上,無需擔心防火牆和許可權。
  • 你在伺服器上不需要單獨的帳戶,因為 Git 會跟蹤每個提交者。 (GitHub 有數百萬使用者共用 git 帳戶。 每個人都使用安全外殼 (SSH) 加密網路協定,並且使用者通過其公鑰進行區分。)

在 Alice 和 Cats 目錄的同一級建立一個名為 Shared.git 的新目錄。

mkdir Shared.git
cd Shared.git

建立空儲存庫:

git init -bare

當儲存庫仍為空時,git checkout 命令不能用於設定預設分支的名稱。 若要完成此任務,可以將 HEAD 分支更改為指向不同的分支;在本例中,它是 main 分支:

git symbolic-ref HEAD refs/heads/main

將儲存庫內容放入共用儲存庫,設定 origin 遠端儲存庫,並執行初始推播。

cd ../Cats
git remote add origin ../Shared.git
git push origin main

輸出

Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 8 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (13/13), 1.14 KiB | 1.14 MiB/s, done.
Total 13 (delta 1), reused 0 (delta 0), pack-reused 0
To ../Shared.git
 * [new branch]      main -> main

如果希望 pushpull 在預設情況下使用 originmain 分支,那你就需要告知 Git 需要跟蹤的分支。

git branch --set-upstream-to origin/main

輸出

Branch 'main' set up to track remote branch 'main' from 'origin'.

為共同作業者設定

讓 Bob 克隆空儲存庫,然後讓 Alice 在其儲存庫中設定元,以將共用記憶卡庫作為推播和拉取的目標。

cd ..
mkdir Bob
cd Bob

克隆共用儲存庫

git clone ../Shared.git .

目前 Alice 的儲存庫設定為從其自身的儲存庫進行推播和拉取,使用以下命令將 Alice 的 origin 指向共用儲存庫。

cd ../Alice
git remote set-url origin ../Shared.git

開始共同作業

Bob 準備在網站的頁面底部新增一個頁尾。

cd ../Bob
git config user.name "bob"
git config user.email "[email protected]"

開啟 index.html,並將<hr>元素替換為此行。

<footer><hr>Copyright (c) 2021 Contoso Cats</footer>

提交更改並推播到遠端源。

git commit -a -m "Put a footer at the bottom of the page"
git push

輸出

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 379 bytes | 379.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
To /Users/entercoder/Desktop/bob/../Shared.git
   825aab8..6594c56  main -> main

Alice 決定在頁面上新增導航欄。

cd ../Alice
code index.html
code CSS/site.css
<nav><a href="./index.html">home</a></nav>
nav { background-color: #C0D8DF; }

Alice 在進行提交前應該拉取 bob 的更改。

git pull

輸出

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 359 bytes | 359.00 KiB/s, done.
From ../Shared
   825aab8..6594c56  main       -> origin/main
Updating 825aab8..6594c56
error: Your local changes to the following files would be overwritten by merge:
  index.html
Please commit your changes or stash them before you merge.
Aborting

使用 git diff 檢視 bob 對 index.html 所做的修改。

git diff origin -- index.html

在嘗試拉取之前應該儲藏或提交更改。拉取到一個髒的工作樹是有風險的,它會執行一些你不容易恢復的操作。

git stash 通過執行一些臨時提交來儲存工作樹和索引的狀態。 將儲藏視為在執行其他操作時儲存當前工作的一種方法,而不會做出「真正的」提交或影響儲存庫歷史記錄。

git stash push
# 彈出儲藏
git stash pop

提交更改到共用儲存庫中。

git push

返回專案目錄執行拉取操作。

cd ../Cats
git pull

bob 的儲存庫也要同步更新保持最新的狀態。

git pull

建立分支與合併編輯程式碼

設定共用儲存庫

mkdir Shared.git
cd Shared.git
git init --bare
git symbolic-ref HEAD refs/heads/main

克隆共用儲存庫

為 Bob 克隆共用儲存庫

cd ..
mkdir bob
git clone ../Shared.git .
git config user.name bob
git config user.email [email protected]
git symbolic-ref HEAD refs/heads/main

新增基本檔案

touch index.html
mkdir Assets
touch Assets/site.css
git add .
git commit -m "Create empty index.html and site.css file"
code index.html
code Assets/site.css
git add .
git commit -m "Add simple HTML and stylesheet"
git push --set-upstream origin main
<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Our Feline Friends</title>
    <link rel="stylesheet" href="CSS/site.css">
  </head>
  <body>
    <nav><a href="./index.html">home</a></nav>
    <h1>Our Feline Friends</h1>
    <p>Eventually we will put cat pictures here.</p>
    <footer><hr>Copyright (c) 2021 Contoso Cats</footer>
  </body>
</html>
h1, h2, h3, h4, h5, h6 { font-family: sans-serif; }
body { font-family: serif; background-color: #F0FFF8; }
nav, footer { background-color: #C0D8DF; }

輸出

Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 952 bytes | 952.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
To /Users/entercoder/bob/../Shared.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

為 Alice 建立分支

Alice 建立了一個 add-style 的主題分支以完成工作。

cd ..
mkdir Alice
cd Alice
git clone ../Shared.git .
git config user.name alice
git config user.email [email protected]
git branch add-style
git checkout add-style

開啟 site.css,新增以下程式碼。

.cat { max-width: 40%; padding: 5 }

儲存檔案並提交。

git commit -a -m "Add style for cat pictures"

Alice將更改推播到共用儲存庫。

git checkout main
git pull

輸出顯式 main 分支是最新的。因此 Alice 通過執行 git merge --ff-only 執行快速合併來向 add-style 分支合併到 main 分支。然後將 main 從其儲存庫推播到共用儲存庫。

git merge --ff-only add-style
git push

輸出

Updating ba17c91..592b108
Fast-forward
 Assets/site.css | 3 ++-

Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 391 bytes | 391.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
To /Users/entercoder/alice/../Shared.git
   ba17c91..592b108  main -> main

為 Bob 建立分支

返回 Bob 目錄,建立 add-cat 分支。

cd ../bob
git checkout -b add-cat

下載網站資源並將 bobcat2 圖片移動到 Assets 目錄,並刪除其他檔案。

wget https://github.com/MicrosoftDocs/mslearn-branch-merge-git/raw/main/git-resources.zip
unzip git-resources.zip
mv bobcat2-317x240.jpg Assets/bobcat2-317x240.jpg
rm git-resources.zip
rm bombay-cat-180x240.jpg

修改 index.html並將顯示「Eventually we will put cat pictures here」的行替換為以下行:

<img src="Assets/bobcat2-317x240.jpg" />

儲存檔案並更改。

git add .
git commit -a -m "Add picture of Bob's cat"

現在執行與 Alice 前面執行的操作相同。

git checkout main
git pull

輸出表示共用儲存庫中的 main 分支已進行過更改。並且已經與 bob 的儲存庫的 main 分支合併。

remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 371 bytes | 185.00 KiB/s, done.
From /Users/entercoder/bob/../Shared
   ba17c91..592b108  main       -> origin/main
Updating ba17c91..592b108
Fast-forward
 Assets/site.css | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

接下來將其他分支合併到 main 分支,然後將自己儲存庫的 main 分支推播到共用儲存庫的 main 分支。

git merge add-cat --no-edit
git push

同步儲存庫

切換到 Alice 目錄下,使用 git pull 從共用儲存庫拉取最新版本。

cd ../alice
git pull

解決合併衝突

為 alice 和 bob 分別建立一個分支,並同時進行修改。

git checkout -b add-cat
cd ../bob
git checkout -b style-cat

Alice 進行修改

cd ../alice
wget https://github.com/MicrosoftDocs/mslearn-branch-merge-git/raw/main/git-resources.zip
unzip git-resources.zip
mv bombay-cat-180x240.jpg Assets/bombay-cat-180x240.jpg
rm git-resources.zip
rm bobcat2-317x240.jpg

開啟 index.html,將 bob 的圖片替換為 alice 的圖片。

code index.html

<img class="cat" src="Assets/bombay-cat-180x240.jpg" />

alice 提交更改並將 add-cat 分支合併到 main 分支,並推播到儲存庫中。

git add Assets
git commit -a -m "Add picture of Alice's cat"
git checkout main
git pull
git merge --ff-only-add-cat
git push

Bob 進行修改

開啟 bob 的目錄,將 class="cat"屬性新增到<img>元素

<img class="cat" src="Assets/bobcat2-317x240.jpg" />

儲存提交,切換到 main 分支,執行 git pull,然後合併樣式更改。

git commit -a -m "Style Bob's cat"
git checkout main
git pull
git merge style-cat

輸出顯示合併衝突了,兩個人更改了同一行。

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Removing Assets/bobcat2-317x240.jpg
Automatic merge failed; fix conflicts and then commit the result.

解決合併衝突

此時 Bob 有幾種選擇。 Bob 可以執行下列操作之一:

  • 使用 git merge --abort 命令將 main分支還原到它嘗試合併之前分支所處於的狀態。 執行 git pull 命令獲取 Alice 做出的更改。 然後,建立一個新分支,完成更改,並將其分支合併到main分支中。 最後,推播其更改。
  • 執行 git reset --hard 命令返回到他們啟動合併之前的狀態。
  • 使用 Git 在受影響的檔案中插入的資訊手動解決衝突。
<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Our Feline Friends</title>
    <link rel="stylesheet" href="CSS/site.css">
  </head>
  <body>
    <nav><a href="./index.html">home</a></nav>
    <h1>Our Feline Friends</h1>
<<<<<<< HEAD
    <img class="cat" src="Assets/bobcat2-317x240.jpg" />
=======
    <img class="cat" src="Assets/bombay-cat-180x240.jpg" />
>>>>>>> 139f75ab70619612b1f597f72d949d0ec1955d79
    <footer><hr>Copyright (c) 2021 Contoso Cats</footer>
  </body>
</html>

Git 使用特殊格式來幫助你識別和解決衝突:左尖括號 <<<<<<<、雙短劃線(等於號)=======和右尖括號 >>>>>>>。 短劃線 ======= 上方的內容顯示你的分支中的更改。 分隔符下面的內容顯示你嘗試合併到的分支中相應內容的版本。

我們通過編輯「index.html」檔案來解決此合併衝突。 由於此合併衝突可快速修復,因此你可直接在main分支中進行更改。
刪除特殊的格式設定行,保留兩個圖片。

<<<<<<< HEAD
=======
>>>>>>> style-cat

執行一下命令提交更改。並推播到遠端 main 分支。

git add index.html
git commit -a -m "Style Bob's cat"
git push

將更改同步到 alice 的儲存庫。

cd ../alice
git pull