- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的一个队友错误地将一些提交推送到我们的主要开发分支。我们是一个小型的、同地协作的团队。我们的远程存储库托管在内部服务器上。
这是我们提交日志的顶部(所有这些提交都已推送):
$ git log develop -6 --pretty=oneline --abbrev-commit
faada93 Merge branch 'develop' of <our_repo_path>.git
244d174 Support classes again
a97a877 Pruned all unused references (again).
8c29252 Merge branch 'develop' of <our_repo_path>.git
a78b993 Support models & methods - product types & categories
da8b496 Resolved JIRA issue PPF-182
da8b496
是我们希望保留在 develop
分支中的最后一次提交,因此我们需要恢复最后 5 次提交。我们从 8c29252
创建了一个新分支,以继续在“功能分支”中工作。
我在 this answer 的指导下尝试了很多东西和 this post from Linus ,最后做了你可以在下面的终端历史记录中看到的事情。但我不确定我最终做的是否是“正确的方式”。我找到的信息很复杂;对于这个特定问题,我无法找出“最佳解决方案”。
我选择的方法(参见下面的详细信息)是否是在不损害我们的历史记录的情况下恢复这 5 次提交的好方法?是否有更简单或“更正确”的方法来完成同样的事情?
除其他事项外,我考虑过从 da8b496
(git checkout -b new-develop da8b496
) 创建一个新分支并放弃我们当前的 develop
分支,但感觉不对。
首先,我为提交 a78b993
和 8c29252
创建了一个新分支,因为这些提交包含我们想要保留并最终 merge 回我们的主要开发分支的工作.
$ git checkout -b new-feature-brach 8c29252
然后我开始在我们的开发分支中恢复有问题的提交。
我先尝试了这个,但没有用(可能是因为一些提交是 merge ):
$ git revert a78b993..HEAD
error: a cherry-pick or revert is already in progress
hint: try "git cherry-pick (--continue | --quit | --abort)"
fatal: revert failed
所以……我手动恢复了每个提交;一个一个:
$ git revert -m 1 faada93
[develop 40965a5] Revert "Merge branch 'develop' of <our_repo_path>.git"
8 files changed, 167 insertions(+), 3 deletions(-)
$ git revert 244d174
[develop 3cebd68] Revert "Support classes again"
45 files changed, 557 insertions(+), 1572 deletions(-)
(list of affected files)
$ git revert a97a877
error: could not revert a97a877... Pruned all unused references (again).
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ git mergetool
Merging:
exampleFile1.cs
exampleFile2.cs
Deleted merge conflict for 'exampleFile1.cs':
{local}: deleted
{remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? m
Deleted merge conflict for 'exampleFile2.cs':
{local}: deleted
{remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? m
$ git commit -m "Adding files to be reverted along with the next commit."
[develop 15bc02b] Adding files to be able to revert the next commit in line.
2 files changed, 239 insertions(+)
(list of affected files here)
$ git revert -m 1 8c29252
# On branch develop
# Your branch is ahead of 'origin/develop' by 3 commits.
# (use "git push" to publish your local commits)
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# exampleFile1.cs.orig
# exampleFile2.cs.orig
nothing added to commit but untracked files present (use "git add" to track)
$ git revert a78b993
[develop 841e77c] Revert "Support models & methods - product types & categories"
2 files changed, 239 deletions(-)
(list of affected files here)
完成所有还原后提交日志:
$ git log develop -10 --pretty=oneline --abbrev-commit
841e77c Revert "Support models & methods - product types & categories"
15bc02b Adding files to be able to revert the next commit in line.
3cebd68 Revert "Support classes again"
40965a5 Revert "Merge branch 'develop' of <our_repo_path>.git"
faada93 Merge branch 'develop' of <our_repo_path>.git
244d174 Support classes again
a97a877 Pruned all unused references (again).
8c29252 Merge branch 'develop' of <our_repo_path>.git
a78b993 Support models & methods - product types & categories
da8b496 Resolved JIRA issue PPF-182
还原后的图表:
$ git log --graph --oneline -8 develop
* 841e77c Revert "Support models & methods - product types & categories"
* 15bc02b Adding files to be able to revert the next commit in line.
* 3cebd68 Revert "Support classes again"
* 40965a5 Revert "Merge branch 'develop' of <our_repo_path>.git"
* faada93 Merge branch 'develop' of <our_repo_path>.git
|\
| * a97a877 Pruned all unused references (again).
| * 8c29252 Merge branch 'develop' of <our_repo_path>.git
| |\
| | * da8b496 Resolved JIRA issue PPF-182
对我来说似乎是正确的。最后,我删除了一些我不想保留的备份文件:
$ git clean -fd
(list of affected files here)
当前状态是干净的:
$ git status
# On branch develop
# Your branch is ahead of 'origin/develop' by 4 commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
然后我将所有内容推送回远程:
git push origin develop
最佳答案
即使您的历史已经改变,您也可以创建分支让您返回并进行试验。 Git means never having to say, “you should have.”如果你专注于你更喜欢的现实,那就顺其自然吧。否则,将其丢弃。
下面的示例将创建新的分支,将所有其他内容单独留在您的存储库中。
首先在您开始冒险的地方创建一个临时分支。
$ git checkout -b tmp-revert faada93
通过指定提交范围,git revert
将撤消多次提交。
$ git revert da8b496..faada93
考虑下图 Git Internals — Git Objects ,第二版第 10.2 节 Pro Git斯科特查孔和本斯特劳布。最顶层的提交(“第三次提交”)有一个以 1a410e
开头的 SHA1 散列。在此历史的上下文中,1a410e^{tree}
将解析为 3c4e9c
,即紧邻第三次提交右侧的树对象。
图 151 来自 Pro Git ,第 2 版。
研究此模型以了解 git 如何跟踪内容。创建一个新的第四次提交,其树与第二次提交的相同(即 0155eb
)将添加一个新的提交对象,该对象将共享或“指向”现有树和 blob 而不是添加新的重复对象。
继续阅读以了解如何使用 git commit-tree
执行此低级拼接.
首先创建另一个要处理的临时分支。
$ git checkout -b tmp-ctree faada93
此时,您想要创建一个新的提交,其树(即提交的代码)与 da8b496
的树相同,这是您要保留的最后一次提交。这棵树可以在 git 中直接寻址:da8b496^{tree}
。
git commit-tree
是“管道”,是 git 中的一个低级命令,而不是“瓷器”。使用起来可能会感到尴尬或不熟悉,但在这种情况下,它可以精确控制您想要的结果。
创建一个新的独立提交,其树与 da8b496
相同,其父级 (-p
) 是当前分支的顶端,faada93
在你的情况下。请注意,git commit-tree
读取标准输入上新提交的提交消息,下面的命令通过 echo
命令提供。
$ echo Revert back to da8b496 | \ git commit-tree da8b496^{tree} -p $(git rev-parse tmp-ctree)new-commit-sha1
上面的斜体部分不是命令的一部分。它表示 git commit-tree
输出新创建的提交的 SHA1 哈希。知道新提交的 SHA1,您可以将分支移动到该点,例如,
$ git merge new-commit-sha1
在上面的命令中,将 new-commit-sha1 替换为 git commit-tree
的输出。 (您可以执行相同的 git reset --hard new-commit-sha1
,但硬重置是最好避免随意使用的利器。)
您可以将以上所有内容整合到一个复合命令中。
$ git merge --ff-only $(echo Revert back to da8b496 | \ git commit-tree da8b496^{tree} -p $(git rev-parse tmp-ctree))
--ff-only
切换到git merge
是为了防止意外。您的意图是让新提交成为当前分支头的快进或后代——实际上是它的直接子代!
要删除上面的临时分支,请切换到另一个并开火,McManus 先生。您的其他分支将与您离开时一样。
$ git checkout develop$ git branch -D tmp-revert tmp-ctree
这两个应该是相同的,你可以验证
$ git diff tmp-revert tmp-ctree
要保留一个,请将其 merge 到您的 develop
分支中。
$ git checkout develop$ git merge --ff-only tmp-ctree$ git push origin develop
关于git - 在 Git 中恢复一系列推送的 merge 和提交(不重写历史),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082830/
我正在尝试将多个值放入数组中。 当我使用时: csvData.push('data[0][index],data[1][index],data[2][index],data[3][index]');
我想在数组声明中直接使用函数 push(),但它不能正常工作。在我的示例中,我的数组返回值 2 : var j = ["b"].push("a"); document.write(j); // ret
我编写了以下Powershell,它为所选文件夹中的所有驱动程序创建了一个bat安装程序,然后应重新启动PC。 New-Item C:\Tools\Drivers\DellLatitude3450.b
例: $ git clone git@gitlab:carlos/test.git Cloning into 'asd'... ssh: connect to host gitlab port 22:
我正在构建一个具有数组类型属性的对象数组: 这里是一些简化的代码: var _data = []; for(var i=0;i<10;i++) { var element = {
我有一个简单的 PHP/MySql 应用程序,它通常会选择几个数据库之一(假设每个客户一个)进行操作。但是,经常调用访问公共(public)数据库的实用程序函数。 我不想在我的代码中散布 USE 子句
我在推送 View Controller 时遇到问题。这就是我所做的:单击一个按钮,我使用这段代码添加了一个模态视图,我工作正常: - (void)addAction:(id)sender {
我想为socket can写一个android系统服务器。我目前正在设计这个,想知道是否有任何方法可以在 Linux/POSIX 套接字上的数据是否可用而无需调用 read() 并随时轮询结果的情况下
我正在编写一个 Bootstrap 站点,我想知道这是否可以接受。该网站看起来像我想要的那样,但我想知道这是否是最佳做法? 我采用的方法是对每两个缺失的列使用 1 个偏
删除远程分支是通过: git push origin :master 如果本地在远程之后,则需要完成: git push --force origin :master 但是强制删除例如master 基
假设我有一个 git 服务器。在每次推送时,我都需要启动一个进程,我可以通过一个钩子(Hook)来完成。 需要将进程的标准输出写入执行推送的 git 客户端。这与 Heroku 或 Openshift
我刚刚开始学习 Git,有些事情我无法解决。在我的 Mac 上本地创建和使用 git 存储库后,我可以将副本推送到其他地方的另一台服务器吗?我在防火墙后面,所以不幸的是我无法从另一台机器运行 git
这个问题在这里已经有了答案: warning: remote HEAD refers to nonexistent ref, unable to checkout (13 个答案) 关闭 7 年前。
我已经安装了 SCM Sync 配置插件(0.0.10)来将我的 jenkins 设置保存在我的 git 存储库中。 我已经设置了 git url 存储库但插件没有提交/推送,请看截图 我试过: 私钥
这可能看起来很矛盾,我知道 secret 变更集是私有(private)的,但是如果我想备份这些 secret 变更集怎么办? 我与一些分支并行工作,有时我想插入一个,而不是其他的。为了实现这一点,我
我正在使用 TortoiseHg用于版本控制。提交到本地后,我推送到远程存储库。如何撤消到特定的提交点? 有三个不同的插入,我想恢复到第一个插入。我读到了 Mercurial 回滚和 hg 撤销 命令
我知道以前有人问过这个问题,但我似乎无法理解这件事...... git checkout master git pull git git checkout feature git rebase ori
下面的代码片段中 return { Push:function ..... 的含义是什么?当我用谷歌搜索时,我发现push()方法将新项目添加到数组的末尾,并返回新的长度。所以我不确定什么是push:
我正在使用 Mercurial 1.6。我有一个带有几个子存储库的存储库 (11)。我想将父存储库推送到默认远程存储库,而不推送子存储库。想要这样做的原因包括: 我使用的是 SSH 存储库,需要很长时
我分配了一个按钮来将 segue 推送到另一个 View Controller ,但是当我执行这部分代码时,我得到以下信息: 2014-02-20 10:44:29.357 nar[20244:70b
我是一名优秀的程序员,十分优秀!