Git 是一个分布式版本控制系统,广泛用于代码管理和协作开发。无论是个人项目还是团队协作,Git 都能帮助你高效地管理代码的版本、记录变更历史、解决冲突等。
1. 安装 Git 和基本配置
1.1 安装 Git
在 Linux 上安装
在大多数 Linux 发行版上,Git 可以通过包管理器安装。以 Ubuntu 为例:
1 | sudo apt update |
在 macOS 上安装
macOS 用户可以通过 Homebrew 安装 Git:
1 | brew install git |
在 Windows 上安装
Windows 用户可以从 Git 官网 下载安装程序,按照提示完成安装。
1.2 验证安装
安装完成后,可以通过以下命令验证 Git 是否安装成功:
1 | git --version |
如果看到类似 git version 2.x.x 的输出,说明 Git 安装成功。
1.3 配置 Git
安装完成后,需要配置 Git 的用户名和邮箱,这些信息会记录在每次提交中。
1 | git config --global user.name "你的名字" |
可以通过以下命令查看配置信息:
1 | git config --list |
一、Git基础
拉取远程仓库到本地
1
git clone 地址连接(https/ssh)
查看分支提交记录
1
git log
查看当前本地使用的分支
1
git branch
查看远程主仓库使用的分支
1
git branch -r
查看文件提交状态
1
git status
将文件改动添加到暂存区
1
2git add 文件名(只添加特定文件)
git add .(提交全部)将暂存区中的文件改动提交到本地仓库的代码分支上
1
git commit -m "说明,介绍内容"
将本地仓库推送到远程仓库
1
git push origin master:master
将本地的master(第一个)分支提交到远程的origin/master分支上
如果本地仓库和远程仓库名称相同,则可以省略为:git push origin master
拉取(更新)远程代码到本地
1
git pull origin <branch-name>
二、进阶-Git各阶段版本回退
2.1、工作区修改,但未提交到暂存区
1 | 1.比较简单,可以手动删除修改 |
原理:使用本地仓库中的文件或内容覆盖掉已修改的文件或内容
2.2、已添加到暂存区,但未提交
1 | git reset HEAD |
使用上面 的命令从暂存区中删除
2.3、已提交到本地仓库,但未发布到远程仓库
1 | 1.撤销提交,但保留所有代码更改在暂存区: |
2.4、已提交到远程仓库
1 | 1.先回退本地仓库,再强制更新远程仓库(不推荐,注意别把别人的代码也回退了!) |
revert创建的提交与MySQL的undo log类似,它根据错误提交的修改,生成一个反向操作,抵消掉错误操作
三、冲突处理
场景:
起始点: 小张和小亮都从远程仓库拉取了最新代码。此时,他们本地的版本 (V1) 和远程仓库的版本 (V1) 是同步的。
小张的工作: 小张完成了他的业务代码,并将本地代码更新到 V2。当他尝试推送时,成功了。为什么呢?因为他之前的本地版本 (V1) 与远程仓库的 V1 是同步的。Git 认为这是一个从 V1 到 V2 的直接、线性的更新,所以接受了。现在,远程仓库的版本是 V2。
小亮的困境: 当小张在工作并推送时,小亮也在进行修改。他的本地版本仍然是 V1,但远程仓库已经更新到了 V2。当小亮尝试推送他的 V1 更改时,Git 检测到冲突。Git 的规则是,如果你的本地分支落后于远程分支,你不能直接推送更改。这是为了防止无意中覆盖他人的工作。
解决方案:
拉取最新更改
1 | git pull origin <branch-name> |
拉取后,Git 可能会自动合并更改。但是,如果小张和小亮修改了同一个文件中的相同行,Git 将无法判断应该保留哪个更改。这时就会发生合并冲突。小亮需要手动编辑冲突的文件,决定保留哪些更改(或将它们组合),然后将冲突标记为已解决。解决所有冲突后,小亮将合并后的更改提交到他的本地仓库。最后就能提交到远程仓库了
四、分支处理
4.1、查看当前所在分支
1 | git branch -vv |
4.2、创建并切换到分支
1 | git checkout -b 分支名 |
创建分支的好处,减少在主分支上直接修改代码,减少在提交时发生冲突
4.3、切换分支
1 | git checkout 分支名 |
4.4、合并分支
1 | git merge 分支名 |
注意,merge操作需要切换到你要合并到的分支,正常情况下是主分支
第二,这里合并是在本地仓库上合并,此时还没有在远程仓库上合并,所以需要将master的最新合并后的代码推送到远程仓库
分支合并也可以不切换到master分支,可以使用如下命令推送到远程仓库的主分支上
1 | git push orgin 分支名:master |
4.5、删除分支
1 | git branch -d 分支名 |
4.6、合并分支时的冲突处理
有一个远程仓库,小张和小亮都从远程拉取了最新的代码。小张创建了一个新分支来实现新业务功能,而小亮直接在本地 master 分支上修改代码,并推送到了远程仓库。小张在本地切换到 master 分支并执行 pull 操作后,尝试将自己的新分支合并到 master 时,出现错误:自动合并失败,因为代码存在冲突。
解决方案:手动修改冲突文件,保留正确代码,然后重新将修改后的文件添加到暂存区,提交并推送到远程
4.7、切换远程分支开发
由于迭代开发,第一代稳定了,为了拓展新功能打算开发第二代,于是在远程仓库上创建了一个新的分支dev,我们需要切换本地分支用于追踪这个dev分支。
创建一个同名的本地分支并最终远程dev分支
1 | git fetch origin #先拉取远程仓库的最新信息,否则会找不到远程的dev分支 |
后续推送到dev分支使用如下命令
1 | git push origin dev |
五、git 一般工作流
- 在远程仓库上创建个人开发分支并在本地创建一个分支关联个人开发分支(git push -u origin 远程分支名)
- 个人本地分支推送到远程分支
- 提交个人远程代码分支和目标代码合入分支的MR(PR),相关负责人负责CR
- 相关负责人提出意见,本人修改相应代码后推送到对应的远程代码分支上
- 代码意见处理完,相关负责人进行代码merge
- 删除个人远程代码分支 (git push origin :远程分支名)