- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是的,我知道我应该从一开始就 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/
有3个 repo : 有 OpenAI Baselines 存储库:https://github.com/openai/baselines . 我有它的 fork :https://github.co
我试图了解在调用 fork() 后复制文件描述符的含义及其对争用的可能影响。 在“Linux 编程接口(interface)”24.2.1 (p517) 中: When a fork() is per
我对 systemd 如何跟踪主进程存在后仍然存在的主进程的子进程感兴趣? 最佳答案 Systemd 为此使用了 cgroups。在启动任何使用服务文件定义的可执行文件之前,systemd 会创建一个
这是输出--- 家长:我的pid是4525 parent :我 parent 的 pid 是 3350 parent 开始- 4525 3350 fork 前 fork 前 child 4526 45
我之前 fork 了 jockm/vert.x 并向他发送了拉取请求。现在我想 fork vert-x/vert.x (jockm/vert.x 的上游)并向他们发送不同的拉取请求。但是,当我单击“F
我想控制从 Perl 脚本派生的进程的名称 a。理想情况下它会像这样: ./forker.pl | ... | | fork("forked.pl"); |\ | \ | `--------\ |
我知道 fork() 在更高级别上做什么。我想知道的是这个—— 一旦有 fork 调用,trap 指令就会跟随并且控制跳转以执行 fork “处理程序”。现在,这个创建子进程的处理程序如何通过创建另一
我正在研究操作系统测验,但我不知道输出什么 if(fork()) fork() 会产生。有人可以解释吗? 我不明白这一行: if(fork()) 编辑: 我所说的“输出”是指如果执行此代码,将
这个问题在这里已经有了答案: Why does this program print "forked!" 4 times? (6 个答案) 关闭 3 年前。 在 C 中,fork() 函数将为父进程
有什么方法可以区分程序中不同 fork() 函数创建的子进程。 global variable i; SIGCHLD handler function() { i--; } handle() {
我正在重新开发一个系统,该系统将通过 http 向多个供应商之一发送消息。原来是perl脚本,重新开发很可能也会用perl。 在旧系统中,同时运行多个 perl 脚本,每个供应商运行 5 个。当一条消
Git 的新手,仍然有点困惑。我在 github 上 fork 了一个项目,想将项目所有者最近对原始项目所做的一些更改引入/merge 到我的 fork 中。这可能吗?该项目是只读的,但基本上,我想让
根据维基百科(可能是错误的) When a fork() system call is issued, a copy of all the pages corresponding to the par
我需要帮助了解如何在 Go 中妖魔化进程。 package main import ( "fmt" "os" ) func start() { var procAttr os.Pro
我已经执行了这段代码。我知道消息的顺序是任意顺序的(因为我明确没有使用信号量)我的程序流程如何?为什么? 父级被执行,因此“baz”被打印一次。有人可以解释为什么不打印“bar”吗?为什么我得到“fo
这个问题已经有答案了: Why does this program print "forked!" 4 times? (6 个回答) 已关闭 5 年前。 我对 fork 进程有疑问。我有一个代码是 i
我在弄清楚如何使用在不同进程之间创建的列表时遇到了麻烦。我所拥有的是: FileList.h - 我创建的列表 #include "Node.h" typedef struct FileList {
好吧,所以我一直在 stackoverflow 上查找这个问题,并且肯定在谷歌上搜索了半个小时,但我得到的答案似乎与我真正想做的事情几乎没有任何关系,希望有人能提供帮助我在这方面,代码如下: int
我正在尝试了解 fork-join 的工作原理。 维基百科有以下合并排序示例,其中左半部分被 fork ,右半部分由当前线程处理。 mergesort(A, lo, hi): if lo t
下面的代码输出了一系列的过程,它到底做了什么: _PARENT_ / \ /
我是一名优秀的程序员,十分优秀!