完成功能分支后,git rebase -i我意外删除了所有提交.我不完全确定,但我怀疑不是压缩我的提交,而是用提交消息替换整个条目.
http://shafiulazam.com/gitbook/4_interactive_rebasing.html说:
交互式rebase可以做的最后一个有用的事情就是为你删除提交.如果不是为提交行选择"选择","压缩"或"编辑",只需删除该行,它将从历史记录中删除提交.
我的问题是:有没有办法恢复/撤消这个?
所以,我有一个非常简单的用例; 我想从我的'今日工作'分支中压缩所有需要重新进入master的提交.
到目前为止,我一直在使用git rebase -i它,但它不能正常工作; 最终提交的时间戳不正确.
这是一个这样做的例子:
[work1] git checkout master
Switched to branch 'master'
[work1] git rebase today
First, rewinding head to replay your work on top of it...
Fast-forwarded master to today.
[work1] git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
5ad95ff Doug Wed Nov 7 10:12:42 2012 +0800 Updated TODO again
abb891c Doug Wed Nov 7 10:12:24 2012 +0800 Added more work
c5fd35c Doug Wed Nov 7 10:11:50 2012 +0800 Added more work
a98facd Doug Wed Nov 7 10:11:22 2012 …Run Code Online (Sandbox Code Playgroud) Git不会让我从任何地方变装.
Cannot rebase: Your index contains uncommitted changes.
Please commit or stash them.
Run Code Online (Sandbox Code Playgroud)
按照以下答案的说明操作:https://stackoverflow.com/a/13694625/618450
$ git update-index -q --ignore-submodules --refresh
$ git diff-files --ignore-submodules
Run Code Online (Sandbox Code Playgroud)
两者都不产生任何输出但是那个输出:
$ git diff-index --cached --ignore-submodules HEAD --
:100644 000000 cab819f1e5ed6cc7cff374eecae273e1d6ae6a01 0000000000000000000000000000000000000000 D .idea/codeStyleSettings.xml
:100644 000000 2953f353d2c65dd62e36926accb7f645a600b7e0 0000000000000000000000000000000000000000 D .idea/dictionaries/roxy.xml
:100644 000000 0e7ecef362d8a77067edf4bae5972f33185bd986 0000000000000000000000000000000000000000 D .idea/inspectionProfiles/Project_Default.xml
:100644 000000 3b312839bf2e939fea3ebdef15630a4b33e57caf 0000000000000000000000000000000000000000 D .idea/inspectionProfiles/profiles_settings.xml
:100644 000000 e31af55b33d82e28f471a2ba51b63c2a91fa53b7 0000000000000000000000000000000000000000 D .idea/php.xml
:100644 000000 9c25e8d4f1169b5d3103b14fdb60e7d7c3975b70 0000000000000000000000000000000000000000 D db/sfront.sql
Run Code Online (Sandbox Code Playgroud)
我无法删除这些文件:
$ git rm --cached .idea/php.xml
fatal: pathspec '.idea/php.xml' …Run Code Online (Sandbox Code Playgroud) 我试图改变一位同事的工作.
首先,我得到了大量的冲突,其中<<<<<头部接缝包含新代码.
然后过了一会儿我得到以下错误:
fatal: update_ref failed for ref 'refs/heads/dev_504':
cannot lock ref 'refs/heads/dev_504': ref refs/heads/dev_504 is at
XXXXXXX
but expected XXXXXXXX
Could not move back to refs/heads/dev_504
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试继续,我得到以下错误:
fatal: cannot resume: .git/rebase-apply/final-commit does not exist.
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题,以便rebase不会出错?
简短版本:只有在执行本地提交后明确合并时,是否需要保留合并?究竟会发生什么?它是否将您提交的代码重新应用于合并的分支?
请解释什么时候git pull --rebase --preserve-merges对常规有用git pull --rebase?我git pull --rebase在这里阅读了一个问题:http:
//notes.envato.com/developers/rebasing-merge-commits-in-git/
这可能会导致代码更改重复.
我在这里读到:什么时候`git pull --rebase`让我陷入困境?
只有在你提交了一些提交后才基本上进行了修改,才会发生这种情况.
所以我不确定我什么时候需要git pull --rebase --preserve-merges,如果使用它就不好了 git pull --rebase.
当我想通过交互式压缩一些提交时rebase:
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
然后:
pick cbd03e3 Final commit (signed)
s f522f5d bla-bla-bla (signed)
s 09a7b7c bla-bla (signed)
# Rebase c2e142e..09a7b7c onto c2e142e
...
Run Code Online (Sandbox Code Playgroud)
尽管所有提交都具有相同的签名,但最终提交还没有gpg签名.交互式rebase压缩后是否可以保留提交gpg-signature?
我可以使用不包含最新提交的rebase来压缩本地功能/主题分支的一系列提交吗?这是我想在合并并推送到公共回购之前准备的提交.
我正在快速地工作并用糟糕的标题和描述进行了一些小的改动,我想要将两个或三个单独的逻辑提交压缩成一个很好的评论.我可以选择329aed9和af39283之间的一系列提交,这些提交可能在此功能分支的短历史中的任何一点吗?
git rebase -i RANGE_START_COMMIT_ID RANGE_LAST_COMMIT_ID
Run Code Online (Sandbox Code Playgroud)
谢谢!
好的,所以我真的很喜欢git rerere命令.虽然,我还没有真正使用它,除了让它自动神奇地记录我的冲突并为我解决它们.但是,我确实搞砸了我的冲突解决方案中的一个很大的rebase(使用最新版本重新定义了一个非常陈旧的功能分支).
feature -> a - b - c - d
release -> e - f - g - h
rebase/feature -> e - f - g - h - a' - b' - c' - d'
Run Code Online (Sandbox Code Playgroud)
所以,比方说b'有一个不正确的合并(感谢我!),我想重新录制它.我该怎么办?我已经看过在Rerere Your Boat中提到的git checkout --conflict选项,但是我不太清楚它是如何工作的,如果它适用于这里.也许我必须检查合并冲突状态并在我正确解决此冲突后运行git rerere?
通常情况下,我只会提交rebase分支的提示,但这是一个扔掉.我只是提前处理冲突,因此当我与该功能团队同步时,我们将所需的时间最小化.合理?
我git rebase master在我的分支上执行了一次,直到我将它推到遥控器之后才意识到它不是我想要的.只有我自己和另外一个人参与这个项目,所以我知道他们没有采取最新的变化.
在StackOverflow上阅读其他问题,它说要使用git reflog然后git reset --hard HEAD@{n}再到rebase之前.我这样做是为了转到我在rebase之前创建的一个提交,但它没有恢复到以前的状态.
我错过了一步吗?有没有办法让对方强行推回他的回购以恢复他们的状态?
谢谢
git ×10
git-rebase ×10
git-rerere ×2
rebase ×2
assembla ×1
commit ×1
git-branch ×1
github ×1
gnupg ×1