【问题标题】:How do I clean up my Github fork so I can make clean pull requests?如何清理我的 Github 分叉,以便发出干净的拉取请求?
【发布时间】:2011-05-23 19:57:33
【问题描述】:

我在 Github 上创建了一个仓库。我做了一些小的更改并向上游提交了拉取请求,但是在此过程中,我的分叉变得如此混乱,我无法生成干净的拉取请求;当我从一个有六个更改的分支开始拉取请求时,Github 想要提交 13 个,其中 7 个已经存在于上游(natch)。

我的问题似乎与only pulling the latest commits 有关,但是当我创建一个新分支并进行cherry-pick 提交时,我仍然有额外的东西。我也对rebasing 感到厌烦,但现在看来,即使my master 也搞砸了,我无法生成upstream 的干净副本。这显然是因为我不明白我需要rebase instead of merging,所以很明显我犯了错误;我正在尝试做的是弄清楚如何解开那个结并回到一个干净的状态,在那里我可以有用地前进。

我有点想吹掉我的叉子并在上游创建一个新的叉子,但我认为这也很困难。

在承认了我的 Git 罪之后,我如何获得 github 的赦免?

【问题讨论】:

  • 喜欢你的忏悔和请求被赦免:-)
  • 什么,有些人认为 git 不是宗教? ;-)

标签: git github


【解决方案1】:

第 1 步:拉取上游更改
建议按照Fork a Repo 页面上的说明将上游存储库添加为“上游”:

git pull --rebase upstream master

--rebase 选项将您的更改置于最新提交之上,无需合并。

第 2 步:(可选)将您的提交合并为 1 个提交

git reset --soft upstream/master

此命令将“撤消”您的所有提交,但不会更改文件。因此,您可以在一次提交中提交所有更改。

git commit -a

第 3 步:检查并测试您的更改

要显示更改,请使用内置的 gitkSourcetreeTortoiseGitTower 等 GUI (付费) 等。

第 4 步:推送

git push 会抛出错误,因为推送会更改目标存储库的历史记录。
如果您确信步骤 3 中显示的更改是正确的,请使用“-f”进行推送

git push -f origin master


其他信息
添加遥控器的命令是:

git remote add upstream git://github.com/[username]/[project].git

您也可以从直接 URL 中提取:

git pull --rebase  git://github.com/[username]/[project].git

但是在其他步骤中,您将需要最新上游提交的哈希而不是“upstream/master”。

【讨论】:

  • 非常感谢。 GitHub 应该更新他们的Fork A Repo
  • 谢谢!我尝试了很多方法来解决这个问题,但没有任何效果。在找到这个答案之前,我正准备把我的叉子吹走……它奏效了。谢谢!
  • 嗨,@JudahHimango。您是否也遵循了“步骤 2”。因为我和你的情况一样。你能帮帮我吗?
  • 这是一个很好的资源。谢谢!
  • 我的分叉存储库一直说它与上游不同步,所以我会拉下并合并——这导致我的分叉上的提交是不必要的。使用这种方法并强制推送已对此进行了排序。我还使用 rebase 来合并我之前的一些提交: git rebase -i HEAD~n [其中 n 是提交次数]
【解决方案2】:

据我了解,对于 Git 和 Mercurial(我只使用过后者,所以我可能错了),吹掉一个叉子并重新叉子根本不是什么大问题。我一直在做我的项目。如果您可以这样做(可以备份您的更改,或者在您的分叉中没有任何重大更改),我会说这可能是要走的路。

请记住,使用 DVCS,分叉存储库会完整克隆该整个存储库。如果您删除当前的分叉,然后再次分叉原始存储库,您将拥有一个完全干净的工作状态。

【讨论】:

  • fork 在这种情况下是 github 的一个特殊功能,而不是核心 git,尽管它使用了核心 git 功能。您可以使用 github-forks 执行特殊的 github 管理功能。
  • 啊,我明白了。我主要使用 BitBucket,当您使用个人工作副本时,“Fork”是“克隆”的同义词。不过以防万一,我还是把答案留在这里。
  • 是的,我已经删除了本地克隆并重新克隆了好几次。我用另一个 repo 做了一个实验,看起来删除一个 fork 并从同一源创建一个新的没有问题。
  • 注:我正在使用git format-patch 来保留我想先保存的提交。
  • 删除您的分叉存储库并重新分叉是不必要的,使用git format-patch 来保存您的工作有点绕开了 git 用于管理分支的所有有用工具。将来,使用git rebase -i 选择性地在新的上游master 分支的顶部重写您的提交是正确的做法。
【解决方案3】:

在您的私人仓库中,将 forkee 的仓库添加为远程仓库。从远程分支重新设置/重置您的分支。强制推送到您的 github 存储库。

如果您需要确切的命令,请告诉我。也让我知道您是否想尝试保留本地提交,或者“吹走”是否可以。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 2021-07-17
    • 2018-02-04
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多