I managed to create a little mess in my local git repository. I was trying to fix a broken commit by using the following instructions. Before running the "git commit --amend" (and after the git rebase --interactive) I decided that my changes were incorrect and so I executed "git reset HEAD --hard". Not a good idea, I tell you.
现在,交互式基础似乎被"卡住了".Git将当前分支显示为(| REBASE-m).我的存储库中的每个命令(cd ..,ls,git rebase ...)都会出现以下错误:
cat:.git/rebase-merge/head-name:没有这样的文件或目录
以下是git rebase --abort的样子:
$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory …Run Code Online (Sandbox Code Playgroud) 我在这里看到了一个问题的答案,有助于在git中恢复已删除的文件.
解决方案是
git checkout <deleting_commit>^ -- <deleted_file_path>
Run Code Online (Sandbox Code Playgroud)
插入符(^)的作用是什么?我在其他地方看到它在git中做了非常有用的事情.这很神奇.请有人为我破坏它并告诉我它的作用?
我刚刚读过修改git过去提交中的单个文件,但不幸的是,接受的解决方案"重新排序"了提交,这不是我想要的.所以这是我的问题:
我偶尔会在处理(无关)功能时发现我的代码中存在错误.然后快速git blame揭示该错误已经被引入了一些提交之前(我提交了很多,所以通常它不是引入该错误的最新提交).此时,我通常这样做:
git stash # temporarily put my work aside
git rebase -i <bad_commit>~1 # rebase one step before the bad commit
# mark broken commit for editing
vim <affected_sources> # fix the bug
git add <affected_sources> # stage fixes
git commit -C <bad_commit> # commit fixes using same log message as before
git rebase --continue # base all later changes onto this
Run Code Online (Sandbox Code Playgroud)
然而,这种情况经常发生,上述序列变得烦人.特别是'互动式底板'很无聊.上面的序列是否有任何快捷方式,这可以让我修改过去的任意提交和分阶段的更改?我完全清楚这会改变历史,但我经常犯错误,所以我真的很喜欢这样的事情.
vim <affected_sources> # fix bug
git add -p <affected_sources> # Mark …Run Code Online (Sandbox Code Playgroud) 来自CVS,我们有一个策略,提交消息应该用bug号标记(简单后缀"...... [9999]").CVS脚本在提交期间检查此项,如果消息不符合则拒绝提交.
git hook commit-msg在开发人员端执行此操作,但我们发现自动系统检查并提醒我们这一点很有帮助.
在git push期间,不运行commit-msg.推送期间是否有另一个钩子可以检查提交消息?
我们如何在git推送期间验证提交消息?
我想在过去的提交中修复一个文件.这可能会影响所有提升提交.
有一个简单的方法吗?你能给我一个如何做到这一点的指导方针吗?
很多次,当我提交两次时,我发现我在第一次提交时遇到错误,我希望修复错误而不必'git reset'我最后一次提交.
为了澄清.我想更改实际的提交,也就是说,我希望更改过去提交的内容.我想改变历史!
我犯了一个错误,git存储库中的项目上的一个文件包含一个密码.这不是问题,因为不是公共回购,但我想在回购中删除该密码.
存储库历史非常简单,因为我是唯一的开发人员,因此它只有12个提交,其中一个提交被标记.
这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我想要删除的密码仅在第一次提交时出现.我想删除该字符串,就好像它曾经没有在那里一样.
是否有某种命令可以执行此操作,或者我必须从一开始就使用新的起点重新生成历史记录而不使用密码并在其上应用差异?
如果您在上次提交时发现了错误,则可以简单地重新提交最后一次提交
git commit --amend
Run Code Online (Sandbox Code Playgroud)
但是,如果您已经提交了另一个提交,那么如何在该提交之前重新提交提交?
注意:我知道,您应该知道,只有--amend在您确定没有其他开发人员已在上游使用您的提交时,您才应该使用
我已提交一些文件并将其推送到远程功能分支并创建了合并请求。我用了
git commit -a -m "blah blah"
git push
Run Code Online (Sandbox Code Playgroud)
所以它推送了所有修改的文件。其中一个文件(主文件中的现有文件)不应被推送(例如可执行文件)。如何从合并请求中删除此文件,以便当 MR 合并到 master 时,不需要的文件不会被合并(就好像它从未存在于 MR 中一样)。我发现此页面提到了以下命令
git rm {filename} --cached
git commit -m "[...]"
git push
Run Code Online (Sandbox Code Playgroud)
我尝试了这些命令,但没有看到 Gitlab 的合并请求中删除的文件。这是正确的做法吗?
更新1:
deleted通过上述命令,我可以看到上面提交中提到的文件。但是当我将更新的 MR 合并到 master 中时,该文件也会从 master 中删除。
更新2:
删除了导致混乱的句子并更新了标题
假设我有3次未提交的提交.现在我想更改第一次或第二次提交的提交消息(为第三次提交更改它们很简单git commit --amend).怎么做?
我从SVN迁移到git,我在每个git提交中都有一个注释,引用了SVN版本号.在repo import之后我使用BFG repo清理器从二进制文件和其他垃圾中清除git历史记录.不幸的是现在我输入时没有注意到git log.我想BFG忘记更新笔记提交的引用.BFG以下列格式留下*.txt报告,将旧对象id映射到新对象id:
0001b24011381e8885683cd1119ba4cb077fa64b c81149b1b52b9e1e1767d6141f292891d715edb5
00024eecdc31f2f6e67018f7d6f00e7c1ad03f1f 326ee3b508e3dd2934ec1f50069195f86ea1a1c7
00028e04dcc2d59bd835b447bd3a207ae481696c 3d18e9b9d3336e59d62093200b81603ffefcc747
Run Code Online (Sandbox Code Playgroud)
在给出上述映射的情况下,您能否建议一些脚本快速修复注释?
PS:我几乎可以肯定问题是由于没有更新refs引起的,因为当我输入git notes第二名时,我可以看到在BFG报告中被认为是旧的引用object-id-map.old-new.txt