Git 基本命令(持续更新)
git安装后-指定名称和邮箱
1 | git config --global user.name "Your Name" |
创建版本库
1 | mkdir learngit //创建 |
提交与推送
1 | git add <file> //放到暂存区 |
首次推送新分支
当你创建一个新的本地分支后,它默认只存在于你的本地仓库。要将它推送到远程,你需要使用 -u
参数(--set-upstream
),这个参数会把本地分支与远程同名分支关联起来。
1 | # 推送新分支 new-branch 到远程,并与远程的同名分支建立关联 |
一旦建立了关联,之后你就可以只用 git push
来推送该分支的更新了。
拉取
1 | git pull <远程仓库名称> <远程分支名称> |
git pull
实际上是两个命令的组合:
git fetch
:从远程仓库下载最新的提交,但不会自动合并到你的本地分支。git merge
:将下载下来的提交合并到你当前的分支。
更换远端仓库地址
1 | git remote -v |
输出会显示你的 fetch(拉取)和 push(推送)地址,通常是相同的。
1 | origin https://github.com/your-username/your-repo.git (fetch) |
更换新的仓库
1 | git remote set-url origin <新的云端仓库网址> |
分支的创建与更换
1 | git branch <新的分支名称> |
分支合并(Branch Merging)
当你完成一个分支上的开发工作后,就需要将它合并到目标分支(通常是 develop
或 main
)。
1. 合并前的准备
在合并前,你需要做两件事来避免潜在的冲突:
- 切换到目标分支:确保你在准备接收修改的分支上。
- 拉取最新代码:确保你的本地目标分支是最新的,这样可以减少合并冲突。
1 | # 切换到目标分支 |
2. 执行合并
使用 git merge <来源分支名称>
命令,将你的工作分支合并到当前所在的分支。
1 | # 将 feature-login 分支的修改合并到 develop 分支 |
- 快进合并(Fast-Forward Merge):如果目标分支在你开发期间没有任何新提交,Git 会直接将分支指针移动到新分支的最新提交上,合并过程非常快。
- 三方合并(Three-way Merge):如果目标分支也有了新的提交,Git 会创建一个合并提交(merge commit),它会把两个分支的所有修改整合在一起。
3. 解决合并冲突
如果 git merge
告诉你存在冲突,这意味着 Git 无法自动合并两个分支的修改。
- Git 会在冲突文件中标记出冲突的部分,用
<<<<<<<
、=======
、>>>>>>>
分隔。 - 手动编辑文件,保留你需要的代码,并删除所有冲突标记。
- 解决所有冲突后,使用
git add
将文件标记为已解决。 - 最后,使用
git commit
完成合并提交。
1 | # 标记冲突文件为已解决 |
4. 删除已合并的分支
合并完成后,你的工作分支的历史已经并入了目标分支。为了保持仓库的整洁,你可以删除这个不再需要的本地分支。
1 | # 删除本地分支 |
如果分支还没有合并,git branch -d
会报错。如果你确定要删除,可以使用 -D
参数强制删除。
1 | # 强制删除未合并的分支 |
如果你想删除远程仓库的分支,可以使用以下命令:
1 | git push origin --delete feature-login |
如何手动解决冲突
冲突标记的含义
当 Git 发现两个分支修改了同一个文件的同一部分时,它会把两边的代码都保留下来,并用特殊的标记分隔开。
我们来看一个例子。假设你在 main
分支上修改了 my_script.py
文件,内容如下:
my_script.py
(在 main
分支上)
1 | def greeting(): |
同时,你的同事在 feature-new
分支上也修改了同一个文件的同一部分,内容如下:
my_script.py
(在 feature-new
分支上)
1 | def greeting(): |
当你尝试将 feature-new
分支合并到 main
分支时,Git 就会产生冲突,它会将 my_script.py
文件变成这样:
1 | def greeting(): |
如何看这些标记
<<<<<<< HEAD
:这行标记的下面,是你在当前分支(也就是HEAD
所指向的main
分支)上的代码。=======
:这是分隔符,用于分隔两个不同的版本。>>>>>>> feature-new
:这行标记的上面,是来自要合并的那个分支(feature-new
)的代码。
简单来说,从 <<<<<<< HEAD
到 =======
是你的版本,从 =======
到 >>>>>>> feature-new
是另一个分支的版本。
手动解决冲突就是在这两个版本中做出选择,或者将它们融合。
1. 选择其中一个版本
比如,你决定使用 main
分支的版本,那么你需要删除 =======
和 >>>>>>> feature-new
之间的所有内容,并删除这三个冲突标记。
解决后的代码
1 | def greeting(): |
2. 融合两个版本
如果你觉得两个版本的代码都需要,你可以手动将它们整合在一起。
解决后的代码
1 | def greeting(): |
3. 提交解决后的代码
当你手动编辑完所有冲突文件后,需要告诉 Git 冲突已经解决。
添加文件到暂存区:使用
git add
命令将已解决的文件添加到暂存区。1
git add my_script.py
完成合并提交:最后,使用
git commit
来完成合并。Git 会自动为你准备一个提交信息,你可以直接保存并退出。1
git commit
手动解决冲突是 Git 中一项必备技能。虽然一开始可能看起来有点复杂,但当你理解了这些标记的含义后,解决冲突就会变得非常简单。