举个例子,比如我想修改这条PR https://github.com/cosname/cosx.org/pull/771 的内容,然后 commit ,push 到这条PR 后面,这样最后合并该 PR 时就相当于一个大 commit,感觉对仓库来说就减少了 commit 数量
[已解决]如何修改人家贡献的PR,不想先合并再修改
Cloud2016 普通青年的办法、也是最简单、也是我推荐的办法是到文件列表页面点编辑按钮直接在线编辑: https://github.com/cosname/cosx.org/pull/771/files
文艺青年可以用 GIT 命令行本地操作,我不太想展开说这个办法,你要想知道的话,翻到底部“view command line instructions”展开看,但光那几个命令还不足以实现你的目标,你最好是会用 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 实际是修改分支
所以文艺青年的做法就是
- 克隆 PR 所在的 repo
git clone --depth=1 https://github.com/LalZzy/cosx.org.git
cd cosx.org
- 切换到 PR 所在的分支,然后拉取内容
git checkout -b patch-2 master
git pull --rebase https://github.com/LalZzy/cosx.org.git patch-2
- 一波编辑操作后在 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
- 已编辑
原来会冲突的说!
又查了一些关于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 默认是允许,但也许有小心翼翼的用户会拒绝,虽然我还从来没碰到过一次这样的情况。
https://tighten.co/blog/adding-commits-to-a-pull-request/
Google 搜到一个帖子操作起来更简单。
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
的内容抓到了本地。
- 已编辑
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
这个错看字面意思是说身份验证失败,这一通绕回来,好像还是我哪里配置的不对。