掌握Git
是一个程序员的基本必备技能,特别是多人合作中,如何进行分支管理开发,如何与他人一同协作,应对复杂的需求,我们如何通过git
代码管理我们的项目,变得尤为重要,本文是一篇笔者关于git
一些总结笔记,希望看完在项目中有所帮助。
本文主要会从以下几点
- git如何初始化一个0项目
- 如何进行
merge
操作,如何理解merge
rebase变基
替代merge
操作- 如何进行项目分支管理
正文开始...
如何提交一个初始化项目
当我们需要初始化一个项目时,我们如何将本地的代码提交到git
上
bash
# 在你本地新建一个项目目录test
mkdir test
# 命令行进入当前新建的文件夹
cd test
# 初始化仓库
git init
# 新增文件,比如新增一个readme.md文件,将当前文件添加
git add .
# 关联远程分支
git remote add origin https://github.com/xxx/xxx.git
# 推送远程分支main
git push -u origin main
在关联远程分支上注意,有两种方式,一种是https
,另一种是ssh
- https
https://github.com/maicFir/lessonNote.git
- ssh
git@github.com:maicFir/lessonNote.git
选择这两种remote方式不同,那么前提条件是,如果选择https
,那么你可以使用Person key
方式,具体可参考放弃SSH keys,拥抱Personal Access Tokens,如果是ssh,那么你需要配置本地ssh key
了,具体可参考git ssh
把本地分支推送对应分支上
bash
# 查看本地分支是哪个分支
git branch
# 假设当前是dev分支,基于dev分支创建your_branch
git checkout -b your_branch
# 将当前修改的添加,将当前修改的文件添加到提交记录中
git add .
# 提交当前分支信息
git commit -m 'fix:修复xxxbug'
# 将本地分支提交到远程分支
git push origin your_branch
git merge
以上是你在当前main
分支,然后将dev
分支的c3'
、c4'
提交merge
到了main
分支上
假设你在featureA分支,现在你的功能要上测试环境
前提在自己分支featureA已提交到remote分支的条件下,并且有把远程所有分支fetch
到本地
bash
### 1.本地切换到test分支
git checkout test
### 2.及时拉取远程对应分支
git pull origin test // pull 默认会merge操作,or git pull origin test --rebase
### 3.把featureA分支合并到test分支上
git merge featureA
### 4.合并分支后,将当前分支提交到远程对应分支
git push origin test
git rebase
变基操作,如果将当前功能分支featureA
, rebase
到dev
分支
变基操作
bash
### 1.首先切换到当前dev分支
git checkout dev
### 2.更新对应分支并使用--rebase合并远程到本地分支
git pull origin dev --rebase
### 3.将fetrueA rebase到当前分支
git rebase fetureA
### 4.提交当前分支到dev分支
git push origin dev
关于git rebase的更多思考可以参考这篇文章
分支管理
我们先想几个场景,前置条件假设我们的dev
、test
、main
同时在最初起点分支
场景一
A:开发了一个功能featureA
B:开发另一个功能featureB
A,B分别从dev拉了一个分支featureA,featrueB
现在A在featrueA
开发了一些功能,B在featureB
上也开发了一些功能,现在featureA
与featureB
分别要上测试环境?怎么办?如何让两个不同的功能同时发测试环境,但并不会互相影响?
-
你应该从dev拉一个单独分支,假设这个分支就叫dev-pre分支,然后你只需要分别把featureA与featureB分支往这个dev-pre分支合并就行,发测试环境你就发这个dev-pre分支就行【如果其他同事有要更测试环境其他功能代码,你告诉要告诉他,让他的功能合并到你当前这个dev-pre分支就行,保证当前测试环境代码不会被覆盖,并且不会因为别人的代码更新,漏到或者覆盖你的功能】
-
现在测试环境已经有了
featureA
与featureB
的功能代码,但是两个分支依旧在对应修复一些问题,不确定哪个要先上? -
假设在测试环境计划
featureA
测试没问题了,那么我们优先上featureA
功能,那么此时应该怎么办?我们只需要将featureA
分支合并到test
分支去,然后,我们再把test
分支合并到main
主干分支去【为了规范,我们遵循合并dev->test-main】分支 -
然后发生产环境,我们就是发main分支代码,一旦我们发了生产环境,我们当前的featureA已完成使命,需及时删除
-
如果你的功能featureA已合并到main分支,但此时产品发现了线上bug?那么怎么办?接下来看场景二
场景二
A: 你从dev拉了一个分支featureA,正在开发featureA功能,现在产品发现了一个线上bug,需要修复,此时应该怎么办?,如何让当前分支功能正常开发,同时也不影响产品提出的线上bug修复。
-
首先你当前分支有两种方案,一是暂存你当前的开发功能,二是直接提交到你自己当前分支。
-
然后你应该从main分支拉一个bug-fix分支,当你修复这个问题后,你需要及时合并到main分支去【建议使用rebase】到main分支
-
同时,你也需要将当前的bug-fix分支分别rebase到dev,test或者刚刚的dev-pre分支【保证测试环境有你当前修复的代码】
-
当你修复了问题后,你应该删除
bug-fix
分支【最好以main
分支打一个对应的tag】
场景三
A:假设你已经在featureA开发的功能,此时你当前功能的部分代码已提交,小功能有commit1,commit2...,但是有些功能此时暂时不上,假设只需要上commit1、commit2 功能
- 方案一:你可以在commit2的节点单独拉一个临时分支,然后将这个临时分支代码合并到你测试分支去
- 方案二:你可以使用cherry-pick的摘抄你commit,然后你再push对应分支即可
切换到你需要的分支上
bash
git checkout target_branch
查看最近提交log
bash
git log
摘抄某个指定的commit-hash
bash
git cherry-pick commit-hash
如遇到冲突,解决冲突后,继续摘抄
bash
git cherry-pick --continue
如果你想要取消摘抄
bash
git cherry-pick --abort
场景四
如果你正在你开发的新功能分支需求,你不想提交当前的功能代码,但需要你修复目前测试环境的问题,你应该怎么办?
- 当前代码stash保存
将当前功能stash到暂存中,并不会被提交
bash
git stash save "test_1"
### 将当前stash取出test_1
git stash apply test_1
### -从已开发的功能分支去修复当前的测试问题,并合并到测试分支去
总结
-
了解学习如何从零初始化一个项目
-
分别了解学习
git merge
与git rebase
操作 -
关于分支管理的一些思考,如何在复杂的需求变化,如何处理好不同场景下的分支情况
更多关于git学习资料