• 软件开源
  • [已解决]如何修改人家贡献的PR,不想先合并再修改

Cloud2016 普通青年的办法、也是最简单、也是我推荐的办法是到文件列表页面点编辑按钮直接在线编辑: https://github.com/cosname/cosx.org/pull/771/files

文艺青年可以用 GIT 命令行本地操作,我不太想展开说这个办法,你要想知道的话,翻到底部“view command line instructions”展开看,但光那几个命令还不足以实现你的目标,你最好是会用 git rebase

    yihui 先做做普通青年吧,等我研究完 git rebase 再把文艺青年的做法补上

    rebase跟merge功能类似吧,我本地跟服务器端的代码的配置文件不一样,用了不同分支,所以merge还挺常用的

    # 新建分支
    git checkout -b lalzzy-patch-2
    # 分支拉到本地
    git pull https://github.com/LalZzy/cosx.org patch-2
    
    # 一顿编辑,commit到lalzzy-patch-2分支
    
    # rebase到主分支
    git rebase master
    
    # 或者使用merge合并入主分支
    git checkout master
    git merge lalzzy-patch-2

      之前一直有一个思想在阻止自己,就是别人的 repo 我是不能修改的,但是在这里,我既然拥有修改原始仓的权限,那么别人的复制品衍生的分支,我也有修改权限,修改 PR 实际是修改分支

      所以文艺青年的做法就是

      1. 克隆 PR 所在的 repo
      git clone --depth=1 https://github.com/LalZzy/cosx.org.git
      cd cosx.org
      1. 切换到 PR 所在的分支,然后拉取内容
      git checkout -b patch-2 master
      git pull --rebase https://github.com/LalZzy/cosx.org.git patch-2
      1. 一波编辑操作后在 patch-2 分支下提交你修改的内容
      git add -A
      git commit -m "描述你的修改"
      git push --set-upstream origin patch-2

      虽然经过实践,这波操作是正确的,但是感觉不够简洁,尤其是第一步,我干嘛要克隆别人的 repo ?

      tctcab 你这波操作是不是会把别人提交的 PR 合并了?
      另外,第二步会失败,拒绝你拉取,因为拉取的内容有些是落后于原始仓主分支的,所以造成很多冲突

      git pull https://github.com/LalZzy/cosx.org patch-2
      remote: Enumerating objects: 7975, done.
      remote: Counting objects: 100% (7975/7975), done.
      remote: Compressing objects: 100% (1433/1433), done.
      remote: Total 7479 (delta 6454), reused 7007 (delta 5982), pack-reused 0
      Receiving objects: 100% (7479/7479), 3.80 MiB | 227.00 KiB/s, done.
      Resolving deltas: 100% (6454/6454), completed with 458 local objects.
      From https://github.com/LalZzy/cosx.org
       * branch            patch-2    -> FETCH_HEAD
      fatal: refusing to merge unrelated histories

        Cloud2016

        原来会冲突的说!

        又查了一些关于rebase/merge以及本地操作PR的资料,原来rebase可以避免merge的冗余信息精简commit历史,在cosx这样多人同时合作的repo里确实比merge更合适。

        这个SO问题里说的比较清楚

        You should use git pull --rebase when your changes do not deserve a separate branch

        另外的发现是创建PR分支并不需要重新克隆整个repo
        参考Checking out pull requests locally
        在本地repo里创建PR分支:

        # Fetch the reference to the pull request based on its ID number, creating a new branch in the process.
        
        git fetch origin pull/ID/head:BRANCHNAME
        
        # Switch to the new branch that's based on this pull request:
        git checkout BRANCHNAME

          恭喜你们,差不多到坑底了!

          别人的库你是否有权限修改取决于他提交 PR 时是否允许你修改(有个复选框),GitHub 默认是允许,但也许有小心翼翼的用户会拒绝,虽然我还从来没碰到过一次这样的情况。

            yihui tctcab

            文艺青年原来可以长这样

            git fetch origin refs/pull/771/head:patch-2
            # 771 是 PR 对应的编号
            git checkout patch-2
            
            # 你的修改
            
            git add -u
            git commit -m "描述你的修改"
            
            git remote add LalZzy https://github.com/LalZzy/cosx.org.git
            
            git push --set-upstream LalZzy patch-2
              Cloud2016 更改标题为「[已解决]如何修改人家贡献的PR,不想先合并再修改

              Cloud2016 用 git 协议能省去你输密码的麻烦(如果你配置好了 SSH 密钥的话):

              git remote add LalZzy git@github.com:LalZzy/cosx.org.git
                1 年 后

                Cloud2016

                我执行这条语句 git fetch origin refs/pull/47/head:patch-1 会报错,提示拒绝 fetch,于是我换成了下面这条指令就可以了:git pull origin pull/47/head:patch-1,给其他人作参考。

                5 个月 后
                2 年 后

                Cloud2016
                我想修改https://github.com/cosname/cosx.org/pull/1019里面文章的内容,但是没看明白你们上面讨论的东西。

                我从这里git fetch origin refs/pull/771/head:patch-2开始执行就报错了。

                $ git fetch origin git@github.com:cosname/cosx.org/pull/1019/head:patch-1
                fatal: invalid refspec 'git@github.com:cosname/cosx.org/pull/1019/head:patch-1'

                没琢磨出来refs是什么意思,于是照着https://tighten.com/blog/adding-commits-to-a-pull-request/又鼓捣了一下,我是这么操作的:

                #克隆仓库到本地
                git clone git@github.com:cosname/cosx.org.git
                #为了查看别人提交的PR,增加一个remote?
                git remote add XiangyunHuang git@github.com:cosname/cosx.org.git
                #查看分支目录
                git remote -v
                #看到了
                `XiangyunHuang   git@github.com:cosname/cosx.org.git (fetch)`
                `XiangyunHuang   git@github.com:cosname/cosx.org.git (push)`
                #又抓取了什么?
                git fetch XiangyunHuang
                ```
                remote: Enumerating objects: 10258, done.
                remote: Counting objects: 100% (936/936), done.
                remote: Compressing objects: 100% (616/616), done.
                remote: Total 10258 (delta 597), reused 525 (delta 289), pack-reused 9322
                Receiving objects: 100% (10258/10258), 9.49 MiB | 16.00 KiB/s, done.
                Resolving deltas: 100% (7973/7973), done.
                From github.com:cosname/cosx.org
                 * [new branch]      beamer-down         -> XiangyunHuang/beamer-down
                 * [new branch]      master              -> XiangyunHuang/master
                 * [new branch]      scihub              -> XiangyunHuang/scihub
                 * [new branch]      鏇存柊澶氬閿欏埆瀛?缂栧彿 -> XiangyunHuang/鏇存柊澶氬閿欏埆瀛?缂栧彿
                ```

                但是好像并没有把我想改的内容抓到本地,而是只是把cosname/cosx.org的内容抓到了本地。

                  yuanfan 好了,眼看你快要掉到无底洞里,快别折腾了,我把你加到编辑组里,你在 Github 上接受一下邀请,然后对 cosx.org 这个库就有写的权限了。接下来有且仅有一步操作:

                  usethis::pr_fetch(1019)

                  改完了就是普通的 git commit/push 操作,都可以在 RStudio 的 GIT 栏中点击操作。等到将来 PR 合并之后:

                  usethis::pr_finish()

                  清扫干净历史痕迹。

                  以上对任何一个你有写权限的 GitHub 库都适用。上面的所有回复全都可以丢进历史垃圾箱不用再看了。

                    8 天 后

                    yihui
                    在运行下面这步之前,我是不是漏了什么常识性操作?或者我是不是还应该先学点git常识?

                    usethis::pr_fetch(1019)

                    我直接在RStudio里面执行,报错了,错误如下:

                    由于我也很迷,不知道还应该提供点什么参考信息,附上我电脑上现在装了git那个文件夹的目录:

                    在单击git-bash.exe后弹出来那个黑色窗口执行以后也是报错:

                    $ usethis::pr_fetch(1019)
                    bash: syntax error near unexpected token `1019'

                    本来我想当个普通青年的,因为给了我一个什么权限以后,就可以直接去修改稿件中的 index.rmd 文档,然而我现在需要照着三水大人所言重新上传一部分数据,以及修改一个 index.html 文档,所以还是得琢磨下怎么把内容抓到本地来修改。哈哈,还好审稿的tc君还没审,我还可以继续漫长卡关。

                      yuanfan 你这个 D 盘下的 R/Git 目录看得我好晕,文件们怎么会乱成如此这般一锅粥咧……本来我打算睡觉去了,这一锅粥看得我又清醒了。你好像把至少三样东西杂糅到同一个文件夹下了:git 软件(git-bash.exe 等)、cosx.org 库(cosx.org 文件夹)、cosx.org 库下的文件和文件夹(content 等文件夹)。

                      首先,Git 不用和某个 Git 库放在一起,安装的时候按默认路径装就可以了(当然,修改安装路径也行,只是别和 Git 库混在一起)。

                      然后,克隆库;如果你在 Github 上正确配置了 SSH 公钥,那么用 git@github.com:cosname/cosx.org.git 地址克隆。如果不会配置,那明天我再看看用 https 协议是怎么配置密码的(相应地用 https://github.com/cosname/cosx.org.git 地址克隆)。我自己一直都是用 SSH 钥匙的,但我不熟悉 Windows 下的 SSH 配置。

                      最后,假设上面的库克隆到了单独的文件夹下,那么进入那个文件夹,打开 cosx.Rproj,再运行 usethis::pr_fetch(1019) 应该就可以了。它是 R 代码,不能在 git-bash 窗口中运行。

                      yuanfan 或者我是不是还应该先学点git常识?

                      只要你以前曾经从本地成功向 Github 提交过任何更改,那么就说明你的 Git 配置都是好的,也不需要任何其它 Git 知识了。感觉你好像通常都是在 Github 网站界面上直接操作的。

                      yuanfan 我直接在RStudio里面执行,报错了,错误如下:

                      报错可能是因为你打开的并不是一个正常克隆下来 Git 库。否则这个 Git 库应该会有远端地址(而你打开的没有,Git 不知道你的库的远端地址,所以无法从远端拉取记录)。


                      突然感觉 Git 对我来说是最难解释清楚的技术问题,尤其是 Windows 下,分分钟让我有种黔驴技穷、穷途末路、路见不平拔刀自刎的感觉……

                        yihui
                        我的git配置应该是好的,但只有一点是好的,打开rstudio是能连上github上面我的账号的。大约一周多以前卡关的时候,我照着网上搜来的信息瞎改了一些东西,你所述的SSH配置,我这边长这样,但不知道是不是好使的:

                        虽然我是2021年开始写博客,但是其实我建博客前前后后卡了半年多(因为不会科学上网,用不了netlify,后来改用vercel),只有第一次把各种文件一股脑传到github上是git commit然后push,后来2021年1月底春节期间打算学习git,瞎操作把博客整崩了,又瞎操作一通恢复以后就不用命令了,全都是“Add files via upload”。所以说,我写我缺乏常识不是表示我自卑,也不是菲薄自己,哈哈,是真得觉得缺乏常识。但我也不知道缺乏些什么常识。哈哈,好绕。

                        如你所说,我之前确实抓取过cosx.org库到本地,现在进入这个文件夹,里面有个cosx.Rproj,单击一下直接就打开了Rstudio,执行你给的代码报错如下:

                        Error in libgit2::git_remote_fetch : Authentication failure

                        这个错看字面意思是说身份验证失败,这一通绕回来,好像还是我哪里配置的不对。

                          yuanfan 打开 Git Bash 窗口,输入如下命令

                          ssh -T git@github.com

                          是否可以看到类似如下的信息?

                          Hi XiangyunHuang! You've successfully authenticated, but GitHub does not provide shell access.