gpt4 book ai didi

git - 如何在我在 github.com 上 fork 的项目之上重新播放本地 Git 存储库的提交?

转载 作者:IT王子 更新时间:2023-10-29 00:58:06 25 4
gpt4 key购买 nike

是的,我知道我应该从一开始就 fork 该项目,但这就是我现在所处的情况。 :)

我在本地计算机上有一个包含我的博客的本地 Git 存储库,它有几个月的提交历史记录。最初,我只是从存储库下载文件 http://github.com/mojombo/mojombo.github.com ,我继续使用我的本地 Git 存储库,第一次提交看起来像是 mojombo 存储库中的最新文件。

我现在想 fork 该项目并在其上重播我的本地 Git 存储库提交,所以看起来我从一开始就 fork 了该项目,然后将其推回到我的 fork 版本的 mojombo 存储库中,在我的 GitHub 帐户上:

http://github.com/program247365/mojombo.github.com

所以也许历史看起来像这样:

mobjombo repository:         1---2---3----23
\
my blog repository commits: 24---25---

我可以使用哪些 Git 命令来执行此操作?

我看过this question .我是否必须将 mojombo 的存储库作为远程添加到我的项目,然后将其 pull 入、 merge 、解决冲突,然后推送到我在 GitHub 上的 fork 项目?

最佳答案

简而言之:

一种解决方案是使用grafts连接历史,然后根据那些嫁接使用git filter-branch重写历史,然后可选做一个 merge

请注意,在原始存储库中的新开发之上重放您的更改(您的提交)的解决方案(rebase 解决方案)是另一种可行的解决方案。


更长的版本:

假设您记得,或者您可以通过检查源代码和/或使用 git 命令找到您下载快照的存储库修订版,并开始本地开发。我们称此修订为 START 或 A。

让我们假设您本地断开连接的历史记录在原始存储库的克隆中。这意味着您的本地断开连接的开发与项目的完整历史位于同一存储库中。假设您的本地分支机构位于“master”分支机构中(为简单起见,只有一个分支机构)。

如果您没有通过本地断开连接的工作将项目提取到存储库中,您可以使用:

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

历史现在看起来像下面这样:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)                                     x---y---*---*---*      <--- master (your local disconnected history)

The commit named A in above diagram is the START commit you downloaded as snapshot and started your local development off.

There are two possibilities: you have comitted snapshot of 'A' as an initial commit 'x', or the first commit you made was with your local modifications.

In first case (you committed original starting state, e.g. as 'Initial commit' or 'Import') you would want the connected history to looks like this:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)                                      \                                        \-y---*---*---*       <--- master (your local disconnected history)

i.e. your first original commit 'y' to have 'A' as a parent.

In the second case (you committed with your changes) you would want the connected history to look like this instead:

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)                                      \                                        \-x---y---*---*---*      <--- master (your local disconnected history)

i.e. you want first commit 'x' to have 'A" as a parent.

In both cases you want to find full SHA-1 identifier of commit 'A', and full SHA-1 identifiers of commits 'x' and 'y'.

You can find SHA-1 of commit 'A' (assuming that you don't know it already) with git rev-parse:

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(可能需要“^{commit}”后缀以确保您找到commit SHA-1,这很重要,例如,如果您通过其标签知道“A”,例如“v0.99';在您的情况下没有必要,因为相关存储库不使用标签)。

您可以使用 git rev-list 找到提交“x”和“y”的 SHA-1 (假设您的开发是在分支“master”上完成的):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

(“| tail -2”用于查找生成列表中的最后两个提交;如果没有,则无需使用它)。

注意: 在上面的所有示例中,完整的 SHA-1 都是示例,不应按原样使用!

让我们将您希望将“A”(或“START”)作为父项的提交命名为 FIRST(它将是“x”或“y”,具体取决于您的情况,如上所述)。现在我们使用grafts机制连接历史:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

然后你应该检查你现在是否已经正确连接(加入)历史,通过使用图形历史浏览器,如 gitk 或 QGit,或者 GitX 如果你在 MacOS X 上,甚至是“git log --graph ”,或“git show-branch”,例如:

$ gitk master origin/master    # or --all

(此处 gitk 仅作为示例;如果您使用“git show branch”,您并不总是可以使用“--all”选项)。

最后,我们可能希望使这些更改永久化,这样任何从我们的存储库中获取的人也将拥有连接的历史记录。我们可以使用 git filter-branch 来做到这一点:

$ git filter-branch master

您将在“refs/original/master”中拥有原始(断开连接的)历史记录。

现在你可以删除嫁接文件了:

$ rm .git/info/grafts

现在您可以 merge 原始存储库的新开发:

$ git merge origin/master

设置每个分支的配置,以便在分支'master'上简单地执行“git pull”以 pull ( merge )origin(al)存储库中的更改留给读者作为练习。 .:-)


注意:rebase 解决方案 会产生以下历史记录(假设我们有第一次提交是简单导入的情况):

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)                                                                     \                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(其中 y' 表示提交 y 已修改:它应该是相同的变更集,但它与提交不同)。

关于git - 如何在我在 github.com 上 fork 的项目之上重新播放本地 Git 存储库的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com