我执行了以下行:
git rebase -i dev --onto master
Run Code Online (Sandbox Code Playgroud)
我想这会削减我的开发分支并将其粘贴在我的主分支之上.并且-i会让我崩溃变更集.
但是当它提出编辑器时,我没有看到任何变更集.我所看到的只是"noop".所以我就退出了.然后我看看我的git历史,我所有的变化都消失了.我的开发分支就在我的主人所在的地方!
有人可以帮我恢复吗?谢谢!
每次我阅读git-rebase文档时,我都迷路了.这对我来说就像是一种低级操作(读作:黑暗魔法).
引用文档:
假设存在以下历史记录,并且当前分支是"主题":
Run Code Online (Sandbox Code Playgroud)A---B---C topic / D---E---F---G master从这一点来看,以下任一命令的结果:
Run Code Online (Sandbox Code Playgroud)git rebase master git rebase master topic将会:
A'--B'--C' topic / D---E---F---G master
问题是:为什么有人想做这样的事情?
首先,它似乎是"重写"历史,好像分支开始于另一个点; 基本上,提交历史将是"一堆谎言".
还有一点,它感觉不安全.我尝试了一次,遇到了大量的冲突,一切都崩溃了.我不记得我究竟是如何解决这个问题的,但如果我没记错的话,它就是在一个临时的测试分支或类似的东西上.
另一个问题:我是否因为不知道如何使用而错过了一些非常酷/省时的功能git-rebase?
相关问题:撤消git rebase
我知道GIT rebase会重写历史记录 - 即提交ID会改变.但是,有没有办法追踪分支何时被重新分支以及从哪个分支?
编辑:我有一个开发分支'A'和一个主题分支'B'.团队共享'A'.在某些时候,'A'已经与主流分支重新建立.由于重新基础(以及后续提交),当我更新主题分支时,我看到了不一致.我试图找出正确的人来解决问题.
这个问题与其他问题的不同之处在于,我希望在恢复一些提交时保留一些提交.
这是我的设置.
Upstream repo on github (public repo which I don't own)
Personal repo on my server(git clone --bare $upstream)
Run Code Online (Sandbox Code Playgroud)
我的工作流程是这样的:
Need to customize my personal branch
1. check out origin/master(Personal)
2. make changes
3. push to origin/master
Need to get new feature or bug fix from the original author(github)
1. git fetch upstream
2. git merge upstream/master
Run Code Online (Sandbox Code Playgroud)
现在我发现upstream/master有一个bug并且想要恢复,
如何在我最后一次获取/合并上游之前返回状态?
编辑.
假设
- 我上游合并了
- 我将团队成员推送到origin/master(个人)的内容合并
现在我要撤消第1步.
git reset --hard commit_sha_of_one_prior_the_merge_1
(虽然找到啥是不容易的.git的日志显示了很多承诺的上游沙的,所以这是不容易找到犯-SHA-of_one_prior_the_merge_1这是不是
upstream而是origin/master)
如何保持第2步合并?
假设一个稍微复杂的场景
- 我上游合并了
- 我合并了另一个团队成员推送到Personal的内容
- 我也将我的工作推向了个人
现在我想撤消上游合并.我该怎么做?
我在存储库中有相当多的文件.因此,在变基改变期间,由于内存不足异常,git有时会崩溃.
例如
git checkout feature
git rebase master
(nasty out of memory exception)
.....
Run Code Online (Sandbox Code Playgroud)
所以一旦我得到了那个例外,我再次尝试变基
git rebase master
Run Code Online (Sandbox Code Playgroud)
它告诉我,分支feature是最新的.这看起来很奇怪,因为rebase以异常结束.
有没有办法避免异常?可能会以某种方式告诉git使用较少的内存量.此异常可能是存储库损坏的原因吗?如果它导致损坏,有没有什么方法可以安全地将在rebase期间所做的更改回滚到之前git rebase master调用的状态?
我有一个本地分支工作,在那里我创建了两个新文件a.py,b.py并提交了它们.
然后,我没有做"git rebase origin/master",而是意外地输入了"git rebase origin master",现在我做的提交已经消失了,文件也没了.有谁知道如何恢复我的文件?
我知道这个问题,但不知道如何将其映射到我目前的情况.(Rebase是可怕的,撤消rebase是双重可怕!)
我从我的主人的几个不同的功能分支开始:
master x-x-x-x-x-x-x-x-x-x
\ \ \
FeatureA 1-2-3 \ \
FeatureB A-B \
FeatureC X-Y-Z
Run Code Online (Sandbox Code Playgroud)
我想将它们合并在一起并检查它们是否在合并回到主机顶部之前工作,所以我做了一个:
git checkout FeatureB
git rebase FeatureA
git mergetool //etc
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
然后
git checkout FeatureC
git rebase FeatureB
git mergetool //hack hack
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
这让我失望了
master x-x-x-x-x-x-x-x-x-x
\
FeatureA 1-2-3
\
FeatureB A'-B'
\
FeatureC X'-Y'-Z'
Run Code Online (Sandbox Code Playgroud)
然后我纠正了一些没有正确编译的位,并将整个功能设置为可接受的状态:
master x-x-x-x-x-x-x-x-x-x
\
FeatureA 1-2-3
\
FeatureB A'-B'
\
FeatureC X'-Y'-Z'-W
Run Code Online (Sandbox Code Playgroud)
我的问题是,我的同事告诉我,我们还没有为FeatureA做好准备.
我有什么方法可以保留我的所有工作,但也可以恢复到我可以将FeatureC重新设置为功能B的情况吗?
我有一个my-feature分支,被推到原点进行代码审查.它不是共享的.最终它将合并到我的团队中共享的develop分支中.我想将我的分支重新设置为保持历史清洁,然后将我的功能分支合并到develop中.这就是我一直在做的事情:developmy-feature
$ git checkout my-feature
// do some work. make commits.
$ git rebase develop
// fix some conflicts
$ git add .
$ git rebase --continue
Run Code Online (Sandbox Code Playgroud)
成功重新定位后,我检查状态:
$ git status
On branch my-feature
Your branch and 'origin/my-feature' have diverged,
and have 155 and 1 different commit each, respectively.
(use "git pull" to merge the remote branch into yours)
$ git what do I do here?
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做.如果我git pull,那么我注意到我会得到一些没有意义的冲突.有人说强行推,但我很担心.强制将我的主题分支推送到原点是否正常? …
我重新设置了分支的基础,该分支的效果是在我自己的基础上添加了一些提交。然后意识到我忘记了压缩一些提交,所以很难重新设置并压缩。现在,我需要把那些提交带回来。但是重新调配告诉我当前分支是最新的,即使不是。有没有办法解决这个问题?
编辑:
有两个分支:a和b。两者都是从master分支出来的。两者都是最新的大师。分支a有一些更改。我也希望分支b也有这些更改。我将分支a重新定位到b。最新的提交来自分支a。我的意图是在提交之前压扁这三个提交。我在最近一次提交之前硬重置为。然后我挤了。现在,我想以一种在将分支b合并到master时不会引起头痛的方式找回最新提交。
我已经尝试过reflog,git reset --hard HEAD@{n}但存在相同的问题:当前分支是最新的。