git安装后-指定名称和邮箱

1
2
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

创建版本库

1
2
3
4
mkdir learngit	//创建
cd learngit //使用
pwd //查看当前目录
git init //初始化,生成.git文件(若该文件隐藏,则使用ls -ah)

提交与推送

1
2
3
4
5
6
7
git add <file>   //放到暂存区
git add . //把所有文件放到暂存区

git commint -m "提示信息" //提交到本地仓库

git push <远程仓库名称> <本地分支名称> //推送到远程仓库
# 将你当前所在分支的所有提交推送到远程仓库,示例:git push origin main

首次推送新分支

当你创建一个新的本地分支后,它默认只存在于你的本地仓库。要将它推送到远程,你需要使用 -u 参数(--set-upstream),这个参数会把本地分支与远程同名分支关联起来。

1
2
# 推送新分支 new-branch 到远程,并与远程的同名分支建立关联
git push -u origin new-branch

一旦建立了关联,之后你就可以只用 git push 来推送该分支的更新了。

拉取

1
2
3
4
git pull <远程仓库名称> <远程分支名称>

# 示例:从远程的 main 分支拉取最新代码,并自动合并到你当前的 main 分支
git pull origin main

git pull 实际上是两个命令的组合:

  1. git fetch:从远程仓库下载最新的提交,但不会自动合并到你的本地分支。
  2. git merge:将下载下来的提交合并到你当前的分支。

更换远端仓库地址

1
git remote -v

输出会显示你的 fetch(拉取)和 push(推送)地址,通常是相同的。

1
2
origin  https://github.com/your-username/your-repo.git (fetch)
origin https://github.com/your-username/your-repo.git (push)

更换新的仓库

1
git remote set-url origin <新的云端仓库网址>

分支的创建与更换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git branch <新的分支名称>
# 创建一个新分支,但不会切换到该分支

git checkout <新的分支名称>
# 切换到这个新创建的分支,这样你之后的所有修改和提交都会在这个新分支上

git checkout -b <新的分支名称>
# 最常用、最快捷的方法,它将创建分支和切换分支合并成一个命令
# 这会基于你当前所在的分支,创建一个新的分支,并立即切换到它。

git branch
# 查看当前所有分支,标*的是当前所在分支

# 查看远程分支
git branch -r
# 查看所有分支
git branch -a

分支合并(Branch Merging)

当你完成一个分支上的开发工作后,就需要将它合并到目标分支(通常是 developmain)。

1. 合并前的准备

在合并前,你需要做两件事来避免潜在的冲突:

  • 切换到目标分支:确保你在准备接收修改的分支上。
  • 拉取最新代码:确保你的本地目标分支是最新的,这样可以减少合并冲突。
1
2
3
4
5
# 切换到目标分支
git checkout develop

# 拉取远程仓库的最新代码
git pull origin develop

2. 执行合并

使用 git merge <来源分支名称> 命令,将你的工作分支合并到当前所在的分支。

1
2
# 将 feature-login 分支的修改合并到 develop 分支
git merge feature-login
  • 快进合并(Fast-Forward Merge):如果目标分支在你开发期间没有任何新提交,Git 会直接将分支指针移动到新分支的最新提交上,合并过程非常快。
  • 三方合并(Three-way Merge):如果目标分支也有了新的提交,Git 会创建一个合并提交(merge commit),它会把两个分支的所有修改整合在一起。

3. 解决合并冲突

如果 git merge 告诉你存在冲突,这意味着 Git 无法自动合并两个分支的修改。

  1. Git 会在冲突文件中标记出冲突的部分,用 <<<<<<<=======>>>>>>> 分隔。
  2. 手动编辑文件,保留你需要的代码,并删除所有冲突标记。
  3. 解决所有冲突后,使用 git add 将文件标记为已解决。
  4. 最后,使用 git commit 完成合并提交。
1
2
3
4
5
# 标记冲突文件为已解决
git add conflicted_file.py

# 提交合并结果
git commit

4. 删除已合并的分支

合并完成后,你的工作分支的历史已经并入了目标分支。为了保持仓库的整洁,你可以删除这个不再需要的本地分支。

1
2
# 删除本地分支
git branch -d feature-login

如果分支还没有合并,git branch -d 会报错。如果你确定要删除,可以使用 -D 参数强制删除。

1
2
# 强制删除未合并的分支
git branch -D feature-login

如果你想删除远程仓库的分支,可以使用以下命令:

1
git push origin --delete feature-login

如何手动解决冲突

冲突标记的含义

当 Git 发现两个分支修改了同一个文件的同一部分时,它会把两边的代码都保留下来,并用特殊的标记分隔开。

我们来看一个例子。假设你在 main 分支上修改了 my_script.py 文件,内容如下:

my_script.py (在 main 分支上)

1
2
def greeting():
print("Hello, World!")

同时,你的同事在 feature-new 分支上也修改了同一个文件的同一部分,内容如下:

my_script.py (在 feature-new 分支上)

1
2
def greeting():
print("Welcome!")

当你尝试将 feature-new 分支合并到 main 分支时,Git 就会产生冲突,它会将 my_script.py 文件变成这样:

1
2
3
4
5
6
def greeting():
<<<<<<< HEAD
print("Hello, World!")
=======
print("Welcome!")
>>>>>>> feature-new

如何看这些标记

  • <<<<<<< HEAD:这行标记的下面,是你在当前分支(也就是 HEAD 所指向的 main 分支)上的代码。

  • =======:这是分隔符,用于分隔两个不同的版本。

  • >>>>>>> feature-new:这行标记的上面,是来自要合并的那个分支(feature-new)的代码。

简单来说,从 <<<<<<< HEAD======= 是你的版本,从 =======>>>>>>> feature-new 是另一个分支的版本。


手动解决冲突就是在这两个版本中做出选择,或者将它们融合。

1. 选择其中一个版本

比如,你决定使用 main 分支的版本,那么你需要删除 =======>>>>>>> feature-new 之间的所有内容,并删除这三个冲突标记。

解决后的代码

1
2
def greeting():
print("Hello, World!")

2. 融合两个版本

如果你觉得两个版本的代码都需要,你可以手动将它们整合在一起。

解决后的代码

1
2
3
def greeting():
print("Hello, World!")
print("Welcome!")

3. 提交解决后的代码

当你手动编辑完所有冲突文件后,需要告诉 Git 冲突已经解决。

  1. 添加文件到暂存区:使用 git add 命令将已解决的文件添加到暂存区。

    1
    git add my_script.py
  2. 完成合并提交:最后,使用 git commit 来完成合并。Git 会自动为你准备一个提交信息,你可以直接保存并退出。

    1
    git commit

手动解决冲突是 Git 中一项必备技能。虽然一开始可能看起来有点复杂,但当你理解了这些标记的含义后,解决冲突就会变得非常简单。