git tips

2019/08/12 Tips

1. head detach

git branch显示detach是一种特殊的状态,表明目前的HEAD指针指向一个具体的commit id而不是一个分支,是一种较危险状态,是一个临时的状态,一旦丢弃,似乎就不 好找回了。这个出现在repo download-topic时会出现这种detach的情况。

解决方法很暴力,就是从这个临时状态新建一个分支,然后换到这个新建的分支tmp上,此时head指针指向新建的tmp分支,临时的修改也在新建的tmp的分支上。

git branch tmp
git checkout tmp

然后,从tmp分支切换回正常分支dev,将tmp分支merge进入dev分支,如果出现conflict,处理之。最后删除tmp分支,happy ending!

git checkout dev
git merge tmp
git branch -d tmp

2. git cherry-pick

考虑下面这种情况,有一个稳定的master分支,在dev分支上进行新功能的开发。如果现在需要进行demo,希望展示dev分支上的一个功能,但是不希望将整个dev分支合并,只希望合并某个commit。此时可以使用git cherry-pick.

下面是在master上的Git log

master-before-cherry-pick

下面是dev上的Git log

master-after-cherry-pick

# 切换到master分支
git checkout master
git cherry-pick 10d307d1bbe56fc7047db47378bcacee102eec45

这样,就将dev上的特定commit合并进入了master,log如下图所示。当然,可能会出现conflict,需要手动solve。

master-after-cherry-pick

3. rebase

rebase有几个典型的应用场景。

彻底搞懂 Git-Rebase

3.1 合并多次commit

某些代码管理网站中,一次的commit就会对应一条修改记录,这样如果在开发同一个功能时,进行了多次commit,就可以rebase进行commit的合并。

git rebase -i HEAD^3

HEAD^3表示合并当前三个的commit。执行完上一句命令后,会弹出选择界面,选择需要保留的commit前面写p(pick),选择需要合并的commit前面写s(squash)。然后,又会弹出界面,将不需要的commets注释掉即可。

3.2 合并线上版本

基于master进行开发后,master很可能会有新的提交,如果之间merge则会出现关于merge的commit,显得commit历史并“不干净”。可以在提交前,rebase一下。

git rebase master

Search

    Table of Contents