git pull是否会拉取未合并到master的Pull Request?误操作如何撤销?
Git Pull相关问题解答
git pull是否会拉取未合并到master的Pull Request
默认情况下,git pull 不会 拉取尚未合并到目标分支的Pull Request内容。git pull的本质是依次执行git fetch + git merge(或git rebase,取决于你的本地配置),默认只会拉取你当前本地分支所追踪的远程对应分支的已提交内容。
仅当你手动配置了远程仓库的PR refs拉取规则,或是执行pull时显式指定了PR对应的远程分支/引用时,才会拉取到未合并的PR内容。
确认git pull拉取的变更来源
你可以按以下步骤核对变更来源:
- 执行
git branch -vv,查看当前分支对应的远程追踪分支,输出结果中中括号包裹的内容即为对应远程分支名,格式一般为origin/分支名 - 执行
git reflog,找到你执行pull操作之前的提交记录,记录对应的标识(格式一般为HEAD@{n},n为数字,代表操作的倒序序号,最近一次操作的序号为0) - 执行
git log HEAD..[你查询到的远程追踪分支名],查看当前本地分支和远程目标分支的提交差异,如果列出的提交和你pull后出现的变更对应,说明变更来自对应远程分支的已合入改动 - 若要确认是否拉取了未合入的PR内容,可以执行
git log --oneline | grep 'Merge pull request'查看是否有不属于master分支的PR合并记录,也可以直接对比当前分支和master分支的全量差异:git diff master
误执行git pull的撤销方法
根据操作后的状态不同,可选择对应的撤销方案:
情况1:pull后未执行新的提交、也没有未提交的本地改动
直接执行git reset --hard HEAD@{1}即可回退到pull之前的代码状态(如果pull不是最近一次操作,将HEAD@{1}替换为你在reflog中查到的pull前对应标识即可)。
注意:
git reset --hard会丢弃工作区和暂存区的所有改动,执行前请确认没有需要保留的未提交修改。
情况2:pull后已经做了新的提交/有未提交的本地改动
- 先执行
git stash暂存你当前未提交的本地改动 - 执行
git reflog找到pull操作前的提交哈希值,假设为abc123,执行git reset --mixed abc123,此时pull拉取的变更会回到工作区,不会影响你之前的提交记录 - 执行
git stash pop恢复你暂存的本地改动,自行筛选需要保留的内容即可
内容的提问来源于stack exchange,提问作者Rija Saleem
相关产品推荐
相关产品推荐

