前言
前段时间,由于sh的git仓库缺少运维,所以迁移到bj。迁移之后发现其中某个git的commit信息丢失。
下面记录下一种,git commit 合并的方式。同时满足以下所有情况特别适用。
- old和new是两个仓库
- new的代码和old是同一个项目的代码
- old包含所有历史commit记录的仓库
- new包含old所有代码,只是丢弃了old的所有commit记录
- new在此基础又多了很多commit记录
操作new仓库生成patch
首先把某个commit(不包含这个commit本身)的后面提交都生成path
1
2
3
|
# be19a5a42c1ffeba1df02090c574fe12e59d1990 commit之前的所有commit都会生成一个个patch文件
# 不包含be19a5a42c1ffeba1df02090c574fe12e59d1990 本身
git format-patch -s be19a5a42c1ffeba1df02090c574fe12e59d1990
|
拷贝*.pcath
到新的仓库
1
2
|
cp new/*.path ~/old #把new的path拷贝到old
git am *.patch #把new生成处理的path引用到old, 这么操作是old仓库有历时所有记录
|
可能遇到的问题
1.少文件
1
2
3
4
5
6
7
8
9
10
11
|
应用:修改
应用:升级gomod版本
应用:修改参数报错问题,修改日志入库错误问题
.git/rebase-apply/patch:49: new blank line at EOF.
+
error: start.sh:不存在于索引中
打补丁失败于 0003 修改参数报错问题,修改日志入库错误问题
用 'git am --show-current-patch' 命令查看失败的补丁
当您解决这一问题,执行 "git am --continue"。
如果您想要跳过这一补丁,则执行 "git am --skip"。
若要复原至原始分支并停止补丁操作,执行 "git am --abort"。
|
- 分析:少文件一般是patch里面没有包含这个文件的修改
- 解决方法:把new仓库的这个文件copy过来
2.文件冲突
1
2
3
4
5
6
7
8
9
10
|
应用:up Makefile
error: 打补丁失败:.gitignore:2
error: .gitignore:补丁未应用
.git/rebase-apply/patch:70: new blank line at EOF.
+
打补丁失败于 0007 up Makefile
用 'git am --show-current-patch' 命令查看失败的补丁
当您解决这一问题,执行 "git am --continue"。
如果您想要跳过这一补丁,则执行 "git am --skip"。
若要复原至原始分支并停止补丁操作,执行 "git am --abort"。
|
- 分析: 文件冲突
- 解决方法: 使用new仓库的文件为基础