相关问题

最近写自己的辣鸡代码使用git时,因为个人不大熟悉git又是个强迫症,被来回不同的版本折腾来折腾去的,十分不爽,于是在此小结下sourcetree怎么使用变基。

变基rebase这个操作说白了就是,重新选定当前提交的根节点
而根据使用分支不同,也产生了不同类型的变基操作的需求。

解决方案

在不同分支之间使用变基

现在有master和dev两个分支:

Sourcetree 将本地目录 与远程仓库关联_git


想要把dev分支变基到master上,形成一条干净整洁的直线。切换到自己的dev分支:

Sourcetree 将本地目录 与远程仓库关联_右键_02


右键点击master分支,选择交互式变基:

Sourcetree 将本地目录 与远程仓库关联_命令行_03


此处可以编辑变基后的各个提交的信息,以及是否把每个提交都变基,然后点击确定:

Sourcetree 将本地目录 与远程仓库关联_右键_04


如果变基出现冲突(同个文件同一行前后版本不同),会报错(sourcetree感觉还是不够智能),需要自己手动解决,请不要点击右下角的关闭:(当然没有冲突就万事大吉也不需要以下操作)

Sourcetree 将本地目录 与远程仓库关联_git_05


按照指示先自己合并,先打开自己的文件,显示的是master尝试加入第一个dev提交产生的冲突信息:

Sourcetree 将本地目录 与远程仓库关联_命令行_06


删去多余的信息,留下“add dev 1”这次提交的有用代码,并保存就可以了:

Sourcetree 将本地目录 与远程仓库关联_命令行_07


然后打开sourcetree右上方的命令行模式,输入命令添加该文件:

git add me.txt
git rebase --continue

接下来会要求你填写“add dev 1”提交变基时的注释信息,根据自己需要更改或者不改,这里使用的是vim编辑器,输入i进入编辑模式,修改完成输入Esc返回,然后输入:wq保存即可:

Sourcetree 将本地目录 与远程仓库关联_命令行_08


修改成功后,这里同时提示接下来还要进行“add dev 2”的手动变基合并:

Sourcetree 将本地目录 与远程仓库关联_命令行_09


接下来进行“add dev 2”的变基合并,同理略。。。

最后输出这个信息说明成功了:

Sourcetree 将本地目录 与远程仓库关联_命令行_10


这时可以在sourcetree界面把报错界面关闭掉,你会发现已经变成一条直线:

Sourcetree 将本地目录 与远程仓库关联_git_11

在分支内部使用变基

当前分支树如图,当前所在分支为dev

Sourcetree 将本地目录 与远程仓库关联_命令行_12


想要把最近的一次提交”add dev 2…“的根节点之间变为”add 1“,简单的说就是删掉/合并(本文是删除)”add dev 1“和”master 2“。首先,确认当前为dev分支,然后右键点击”add 1“,选择交互式变基:

Sourcetree 将本地目录 与远程仓库关联_右键_13


右键选择删除中间两个节点(否则变基之后没有任何变化,因为本就属于一个分支),点击确认:

Sourcetree 将本地目录 与远程仓库关联_git_14


然后又出现了熟悉的画面,存在冲突时需要手动解决,注意不要关闭该窗口(否则操作会取消):

Sourcetree 将本地目录 与远程仓库关联_命令行_15


打开冲突的文件,手动解决冲突后,打开sourcetree报错界面的右上角命令行模式:

Sourcetree 将本地目录 与远程仓库关联_右键_16


添加冲突解决后的文件,继续rebase,输入命令:

Sourcetree 将本地目录 与远程仓库关联_右键_17


本文第一部分已提到,此处可修改commit信息,保存退出:

Sourcetree 将本地目录 与远程仓库关联_命令行_18


命令行提示successful即可,回到sourcetree关闭报错窗口结束,现在dev分支结构如图:

Sourcetree 将本地目录 与远程仓库关联_git_19

PS

sourcetree的交互式变基实质就是代替执行命令行的git reabse -i,还可以实现很多其他的功能,比如历史记录的删除、排序、修改、拆分、合并等等,利用sourcetree的gui都可以实现,但是出现文件冲突时还需要手动进行命令行的调整(要是能完全脱离命令行就好了)。

个人使用sourcetree体会

  1. 很多时候使用sourcetree,莫名其妙的总是各种错误,如果不需要本地的未提交修改,可以直接用sourcetree的丢弃命令,并且点重置所有,即可以从合并状态中退出。但如果要退出rebase状态,还是需要进入命令行输入git rebase --abort来终止
  2. 很多时候一不小心rebase或者reset,又或者执行某个命令又想撤销,任何历史信息都可以在命令行输入git reflog查询,并用git reset <id> 即可恢复之前的版本
  3. 任何突发的任务来临,首先用git stash封存当前状态,然后就可以丢弃本地修改去干临时的任务