一整套流程帮你实践整个 Git 操作基础流程。
来源:https://docs.microsoft.com/zh-cn/learn/paths/intro-to-vc-git/
配置 Git
确认已经安装 git
git --version
输出
git version 2.30.1 (Apple Git-130)
配置 Git,必须定义一些全局变量:user.name
和 user.email
。
git config --global user.name "<USER_NAME>"
git config --global user.email "<USER_EMAIL>"
检查更改是否成功。
git config --list
输出
user.name=User Name
user.email=user-name@contoso.com
配置 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 <entercoder1993@gmail.com>
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 <entercoder1993@gmail.com>
Date: Fri Feb 25 20:07:24 2022 +0800
Add HTML boilerplate to index.html
commit 57cdf5c28b8b20fa75cc34aa0481308e2347f257
Author: duzhida <entercoder1993@gmail.com>
Date: Fri Feb 25 20:00:05 2022 +0800
Add a heading to index.html
commit 166b2d94a49ecbe6008aa027e9d2f7d870c78724
Author: duzhida <entercoder1993@gmail.com>
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 <entercoder1993@gmail.com>
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 "cats@gmail.com"
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 "alice@gmail.com"
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
如果希望 push
和 pull
在默认情况下使用 origin
和 main
分支,那你就需要告知 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 "bob@gmail.com"
打开 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 bob@gmail.com
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 alice@gmail.com
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