【转】汇总项目中遇到的git使用场景

转自https://blog.csdn.net/baidu_27652997/article/details/130728645

文章目录
1.gitLab之间迁移(保留提交记录和分支)
2.合并多个项目为一个(保留所有提交记录)
3.将项目中某个文件夹拆分出来单独使用(保留提交记录)
4.分支的单文件合并到主分支(保留提交记录)
5.更改文件夹名称(只改大小写)
6.撤销中间的某次提交
7.更改分支名称
1.gitLab之间迁移(保留提交记录和分支)
项目中总会时不时遇到项目代码仓库的迁移,从一个gitlab/github迁移到另一个gitlab/github。

场景:假设原有仓库项目为 myOrigin,git地址为 https://xxx/myOrigin.git
先在新仓库创建一个空项目 myNewOrigin。则需要迁移到新仓库的git地址为 https://xxx/myNewOrigin.git

完整步骤如下:

# 克隆原有项目
git clone https://xxx/myOrigin.git

# 保证本地有旧有仓库的所有分支,最后git push origin --all的时候才会把所有分支迁移过去
git checkout branch_name

# 保证本地有旧有仓库的所有tag,最后git push origin --tags的时候才会把所有tag迁移过去
git checkout tag_name

# 显示本地所有的远程仓库地址
git remote -v
# 注意:若有关联,先删除本地代码分支与旧Gitlab分支的关联关系
# 没有就不需要执行
# git remote remove origin

# 把旧远端仓库改个名字,当前的一般默认origin,
# 注意:想回到旧仓库就要切换回去 git remote rm origin; git remote rename old-origin origin
git remote rename origin old-origin

# 旧仓库与新的仓库关联起来, https://xxx/myNewOrigin.git 为新仓库地址
git remote add origin https://xxx/myNewOrigin.git 

# 将本地的所有分支都推送到新仓库的远程分支
# 此步骤若报错,详见下面报错详情
git push origin --all 
# 将本地的所有tags都推送到新仓库的远程分支
git push origin --tags

报错:git push origin --all 的时候报错
hint: Updates wear rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref.You may want to first integrate the remote changes
hint: (e.g., 'git puhh ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决:

# 切换到报错的对应分支
git checkout main
# 此处main是分支,根据实际情况哪一个分支报错来解决
git pull origin main --allow-unrelated-histories

2.合并多个项目为一个(保留所有提交记录)

场景:
假设有三个项目a,b,c

a:远程地址为:https://xxx.xx/a.git ,分支为master
b:远程地址为:https://xxx.xx/b.git ,分支为master
c:远程地址为:https://xxx.xx/c.git ,分支为master

合并后的仓库地址为https://xxx.xx/all.git, 目录结构为

all 
  - a_new   # 对应原项目a
  - b_new   # 对应原项目b
  - c_new   # 对应原项目c

步骤:

# 1.本地新建 all 目录,并初始化
mkdir all
cd all
git init

# 2.在 all 中添加 a,b,c 的远程分支
git remote add origin_a https://xxx.xx/a.git
git remote add origin_b https://xxx.xx/b.git
git remote add origin_c https://xxx.xx/c.git

# 3.验证是否添加成功
git remote -v

# 4.在 all 目录下,获取 a, b,c 的 master 分支数据,如果是其他分支修改master即可
git fetch origin_a master
git fetch origin_b master
git fetch origin_c master

# 5.开始合并,并移动到子目录中
# 合并a项目
git merge origin_a/master --allow-unrelated-histories  # 合并,并保留历史。--allow-unrelated-histories:允许合并不相关历史
mkdir a_new   # 新建子文件夹
# 移动到此文件中(mv!排除需要忽略的文件夹,此处排除了.git, a_new文件夹,需根据实际情况排除相关的文件夹不移动)
# 注意:报错的话执行下shopt -s extglob
mv !(.|..|.git|a_new) a_new
git add . && git commit -m "merge a_master and mv to a_new"  # 生成一条commit日志

# 合并b项目
git merge origin_b/master --allow-unrelated-histories
mkdir b_new
mv !(.|..|.git|a_new|b_new) b_new
git add . && git commit -m "merge b_master and mv to b_new"

# 合并c项目
git merge origin_c/master --allow-unrelated-histories
mkdir c_new
mv !(.|..|.git|a_new|b_new|c_new) c_new
git add . && git commit -m "merge c_master and mv to c_new"

# 6.推送 all 的 master 分支到远程
git remote add origin https://xxx.xx/all.git
git push -u origin master

 

3.将项目中某个文件夹拆分出来单独使用(保留提交记录)

场景:
项目A 的src 下有两个文件夹 activity/ 和 plugin/
假定 activity/ 需要拆出来
注意:此方法拆分出来的只是activity/文件夹下的文件,并不包括其关联的其他目录中的文件

步骤:

# 1.进入 A 项目,创建一个临时分支
# git subtree:合并子树并将存储库拆分为子树
# split:从<prefix>子树的历史中提取一个新的合成项目历史。新的历史记录仅包括影响<prefix>的提交(包括合并),并且这些提交中的每个现在都在项目的根目录而不是子目录中具有<prefix>的内容。因此,新创建的历史记录适合作为单独的 git 存储库导出。
# -P <prefix> = –prefix=<prefix> 在存储库中指定的子树的路径
# -b <branch> 创建一个分支
cd A
git subtree split -P src/activity -b my-activity

# 2.创建一个新的 git 空项目
# 与 A 平级的路径下,创建一个文件夹,例如 my-activity
cd ..
mkdir my-activity
cd my-activity
git init

# 3.将原仓库的临时分支my-activity拉到新仓库
git pull ../A my-activity

4.分支的单文件合并到主分支(保留提交记录)

# 1.切换到主分支
git checkout master

# 2.选择合并的文件
git checkout --patch 分支名称 要合并的文件路径

# 3.提交
git add -A 文件路径
git commit -m "注释"
git push

5.更改文件夹名称(只改大小写)

场景:这里将文件夹Folder改成folder,即只更改文件夹名称的大小写
git命令对大小写不敏感,想要更改文件夹名字的大小写可以弄个中间商过渡下

# 先把大写的Folder文件夹名字改成temp
git mv Folder temp
# 再将temp 改成小写的folder,从而实现大写的Folder到小写的folder转化
git mv temp folder

6.撤销中间的某次提交

git revert用于撤销历史提交。它创建一个新的提交,以撤销之前的提交。

# commit_id为某次提交版本号
git revert commit_id

7.更改分支名称

# 重命名分支
# 如果修改的分支只是在本地,还没有推送到远程,只需要执行该操作即可。后面的操作步骤是针对已经推送到远程的分支。
git branch -m oldBranch newBranch

# 删除远程分支
git push --delete origin oldBranch
# 上传新命名的本地分支,并于远程关联
git push -u origin newBranch

 

posted @ 2023-06-06 16:55  意如柳  阅读(36)  评论(0编辑  收藏  举报