【gitHub】在提PR(pull request)时提交指定的commit
一、背景
今天在提PR
的时候,发现以前一些旧的commit
也一起被提交上去了,这样比较不友好,在网上研究了一些方法,在这里总结记录一下。
二、方法
对于方法博主研究后有两种,一种是通过版本非强制回退,然后再重新commit
一次,这样就能够合并之前的所有commit
。另外一种是通过使用cherry-pick
选择commit
进行提交。博主推荐使用第二种。
2.1.版本非强制回退,合并commit
对于这种方法,需要特别注意的是,这种方法容易产生一些问题:
- 若在这些
commit
之间,曾经从上游(upstream
)仓库中合并新代码到自己的远程仓库,在log
里面是有对应的记录的,也就是说合并commit
的时候也会将其一起合并。这样会导致自己的远程仓库与上游仓库版本不一致,以至于无法提PR
。 - 版本回退不能回退到之前提交过的
PR
版本前,也就是说只能回退到上个PR之后的第一次commit
。否则也会与上游仓库冲突,无法提PR
。
因此,使用该方法需要注意不能从上游仓库合并到远程仓库,并且版本不能回退到上一次PR
之前。命令如下:
git branch new_branch //新建本地分支
git log // 查看commit记录,记住想要回退的版本id
git reset commit_id // 版本回退,注意不能使用--hard
git add .
git commit -m “commit message” //重新提交
运行上面的命令后,可运行git log
查看新的commit
记录。最后运行以下命令将该分支推送到远程仓库,并在新分支上提PR即可。
git push origin new_branch
2.2.使用cherry-pick
进行提交
cherry-pick
是在新分支下选择本地分支的commit
记录进行合并的操作,因此只需要在本地新建一个上游仓库(注意不是远程仓库)的本地分支,再合并想要提交的commi
t即可。
-
首先,配置上游仓库地址并同步。
git remove add upstream XXX.git // XXX.git是上游仓库地址 git fetch
-
在
github
上或者在本地运行git log
选取commit记录。
注意:需要选择上次PR
之后的除了merge
操作的所有commit
的id
。 -
在本地从上游仓库中拉取新的分支。
注意:upstream
是上游仓库,在第一步配置过;origin
是自己的远程仓库;main
是主分支名。git checkout -b new_branch upstream/main
-
在
new_branch
的分支上cherry-pick
所有commit
记录。
注意:要选择所有未提交PR的所有commit
,这样才不会出错。git cherry-pick commit_id1 commit_id2 commit_id3 ......
-
将新分支推送到远程仓库。
git push origin new_branch
-
在
github
提PR
的时候选择新推送的分支即可。 -
PR
被接受后,可选择删除新建立的本地分支和远程分支。git branch -D new_branch // 在main分支删除new_branch分支 git push origin --delete new_branch // 删除远程仓库分支
三、总结
以上两种方法,更推荐使用第二种,它并不像第一种有许多坑,用起来比较安全。