git主分支切换,将自己在一个分支的提交迁移到新的主分支

我能像今天这般秀,不是我有多努力,实在是碰到的问题太棘手了。
队伍里一个岁数不大的老年人,我们叫ta小A,每隔一段时间就要把代码结构大调整。包括:

  1. 文件所在的文件夹变更
  2. 定义和声明所在的文件
  3. 文件夹所在的文件夹变更

比如团队还在v1.6上开发v1.7功能呢,ta从v1.4切出去分支直接进行上述大调整操作。结果就是,我们在原来分支上的v1.5 v1.6乃至v1.7功能,全都消失不见。
以下为操作记录。

第一步,定位同事A从哪个提交切的分支

一个图片丢失了,在它所在的资源文件夹,进行git log,看到最根源有一个提交C1,切换到C1,

git co C1

查看C1的parents们,目的是为了确认小A到底是从何提交切出去的分支(ta自己也不记得了)

git log

在打印的结果中看到同事B的名字,同事B的提交是C2,以及C2的child C3

git branch -r --contains C2
git branch -r --contains C3

发现C2果然就是小A切出去的提交。因为C3就已经在新分支上,而C2还有原分支。

第二步,找出我的没有合并进去的提交

找到我在旧分支上,没有包括在新分支里的提交。首先,看看我在原分支C2之后进行了哪些提交。
C2提交的时间是12月2日。所以打印我、和同事B提交的所以记录:

git log --committer="myname" --committer="Bname" --after="2021-12-1" --pretty=format:"%h %an %ad : %s" --date=short --no-merges --reverse

h,表示提交的hash
an,表示author name
ad,表示add date
s,表示comment
no-merges,表示不想看merge dev into dev这类合并的提交

从打印的结果,找到C1。C1的child提交,再用一遍author过滤。
上面的git log 详见:https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History

第三步,试试看能不能cherry-pick

如果你跟程序员说cp,ta肯定理解成cherry-pick。
我喜欢在做复杂事情之前做到心中有数,所以我打印出我在旧的分支里变更的文件及其在新分支里的路径,tmp文件包括了第二步输出的所有我的提交,假设他们是Ca, Cb, Cc, Cd

h=`grep 'myname' tmp | awk '{print $1}'`
changes=`git show --name-only $h | grep src.* | sort | uniq`
old_folder="../../branchA/projectA/"
new_folder="."
echo "log"
echo "old"
echo "new"
for a in $changes
do
        file_name="${a##*/}"  # basename command
        old_file=`find $old_folder -name $file_name`
        new_file=`find $new_folder -name $file_name`
        echo $a
        echo ${old_file#"$old_folder"}
        echo ${new_file#"$new_folder"}
        echo
done

第四步,将自己的提交拉到临时新分支,归类合并后,再拉到主分支

接下来,首先把自己的提交弄到一个单独的分支。新建一个临时分支my_commit,然后把步骤二里的提交cherry-pick过来。

git co -b my_commit
git cherry-pick Ca
git cherry-pick Cb
git cherry-pick Cc
git cherry-pick Cd

根据内容合并,这一步很重要,否则在merge到新的主分支时,有无穷尽的conflict要处理。假设Ca的parent分支时C,将Cb,Cc, Cd从pick状态改为squash,这样他们就都坍塌(squash)到Ca。

git rebase -i C 

经过了几次rebase -i之后,得到新的提交Ck, Cp和Cq
切换回主分支,将这些合并后的分支,cherry-pick进主分支:

git cherry-pick Ck
git cherry-pick Cp
git cherry-pick Cq

解决冲突…
经过数个小时,搞定…

总结

主分支切换时,将自己在原先主分支上的所有提交迁移到新的主分支时,通过git log的时间段查询功能,找到自己所有的提交;再通过新建临时分支,把自己的提交拉到临时分支,归类合并后,再迁移回新的主分支。可以最大程度的降低,解决conflict的时间。以及避免更新的内容丢失。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值