- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 git 来跟踪我们的开发团队所做的更改并提交到我们的中央 cvs 样式存储库中。由于它的 cvs,它跟踪文件而不是提交,因此有时很难准确判断哪些文件构成了错误修复的完整补丁。我刚遇到一个并做了以下事情:
1) trolling,检查 CVS 日志并将它们作为完整补丁提交给 git
A--B--C--D
2) 发现另一个实际上是针对工单 (B) 的文件更改,所以我使用
将当前分支重置为 Bgit reset --soft <sha1 ID for commit B>
3) 我复制了更改,并将其附加到提交 (B) 中
git commit --amend
4) 令我惊讶的是,树现在显示为
A--B
仅在工作树中提交 (C) 和 (D)。他们的详细信息从日志中消失了,我认为我无法找回它们。我哪里做错了?我唯一的选择是在 (D) 之上进行额外的提交,并且只知道它确实是 (B) 的一部分吗?
最佳答案
你的意思是修改,而不是追加,对吧?为了方便起见,我将假装这是在一个名为 master 的分支上。这是您的存储库现在的样子:
A---B' (master)
\
\-B---C---D
Git 提交明确依赖于它们的父级 - 不同父级之上的相同补丁是不同的提交。
您可以通过几种方式恢复之前的位置。以前的职位有一个很好的简写,您可以使用它直接 checkout 或创建分支:
git checkout master@{1}
git branch oldmaster master@{1}
这是假设它是前一个位置。它可能是第二个 (master@{2}
)...或者如果您知道它是什么时候,您可以使用 master@{7:35}
或 master@{23.hours.ago}
。有关这些形式的摘要,请参阅 man git-rev-parse
( online here ) 的“指定修订”部分。
如果您不确定如何到达它,请尝试
git reflog show master
这将为您提供 master
以前职位的列表,您应该能够从描述中分辨出您想要哪个(或者尝试几个)。您可以简单地从列表中复制散列,然后使用 git checkout
或 git branch
如上所述。
警告:如果历史已经发布,则编辑历史是个坏主意 - 在这种情况下,您应该简单地提交修复。是的,在存储库中将它分成两个提交有点丑陋,但其他用户必须能够相信他们在公共(public)存储库中看到的内容不会更改!
也就是说,要进行这种特殊的历史编辑,您需要交互式 rebase :
git rebase -i master~4 master
master~4
代表master提示前四次commit。您可以在这里使用任何您想要的形式 - 也许它是另一个分支,也许是一个提交散列 - 任何有效的。
这将在编辑器中打开您正在处理的提交列表:
pick <hash-A> <message-A>
pick <hash-B> <message-B>
pick <hash-C> <message-C>
pick <hash-D> <message-D>
# Rebase <hash-A^>..<hash-D> onto <hash-A^>
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
注释掉的帮助文本非常不言自明。在这种情况下,您想在提交 B 的行上将“pick”更改为“edit”,保存并退出。 rebase 将开始,并在应用 B
后暂停,让您进行更改。你会做你需要做的,添加,使用 git commit --amend
,然后 git rebase --continue
。它将应用 C
和 D
,您就完成了。如果中间出现任何问题,请使用 git rebase --abort
返回到开始的位置。
rebase 可能有点可怕 - 例如,不要不小心删除该列表中的行!如果您还不习惯,最好大量使用 gitk
和备份分支名称。
关于GIT:附加几次提交后制作的补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545118/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!