我有以下Git存储库拓扑:
A-B-F (master)
\ D (feature-a)
\ /
C (feature)
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
通过重新feature分支我希望改变整个子树(包括子分支):
$ git rebase feature master
A-B-F (master)
\ D (feature-a)
\ /
C (feature)
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
但是,这是实际结果:
C' (feature)
/
A-B-F (master)
\ D (feature-a)
\ /
C
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过执行以下方法手动修复它:
$ git rebase --onto feature C feature-a
$ git rebase --onto feature C feature-b
Run Code Online (Sandbox Code Playgroud)
但有没有办法自动重组分支,包括其所有子/后代?
例如,在下面的主分支中,我需要删除提交af5c7bf16e6f04321f966b4231371b21475bc4da,这是由于之前的rebase导致的第二个:
commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Tue Apr 12 23:50:15 2011 +0200
add generic config/initializers/omniauth.example.rb
commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Fri Apr 22 00:15:50 2011 +0200
show github user info if logged
commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Fri Apr 22 17:20:48 2011 +0200
add multiple .container at blueprint layout
commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Thu Apr 21 19:55:57 2011 +0200
add %h1 Fantastic Logo + .right for 'Sign …Run Code Online (Sandbox Code Playgroud) 我们都听过一个人应该重订,从未发表的作品,它的危险,等等.但是,我还没有看到张贴如何处理的情况下衍合情况的任何食谱被出版.
现在,请注意,只有存储库仅由已知(并且最好是很小)的人群克隆,这才真正可行,这样无论谁推送rebase或重置,都可以通知其他人他们下次需要注意的时候取(!).
如果你没有本地提交foo并且它被重新定位,我看到的一个明显的解决方案将起作用:
git fetch
git checkout foo
git reset --hard origin/foo
Run Code Online (Sandbox Code Playgroud)
foo根据远程存储库,这将简单地抛弃本地状态以支持其历史记录.
但是,如果一个人在该分支机构进行了大量的本地更改,那么如何处理这种情况呢?
我已经重新组织了一个分支中的提交,然后它将被公开,导致提交的时间戳处于混合顺序.我宁愿让他们今天只有几秒钟.
显然,这些时间戳也不正确,但由于这是事情上市的时候,我更喜欢在时间上混淆历史.
那么如何告诉git在重新定位时创建新的时间戳?
为了实现git nirvana,我花了一天时间学习如何在我目前合并的情况下利用rebase.
当我通过我认为是git 101流程(我在下面拼写出来)时,我必须push --force将我的更改推回原点.
我不是唯一的一个-我知道这是覆盖的地面(见图1,2,3,4,5),我理解的技术原因,为什么力是必要的.我的问题是这样的---有歌声底垫的赞美很多(多)发表的博客以及它如何改变他们的生活(见1,2,3,4,列出了几个),但他们没有提到push --force是的一部分他们的流量.然而,几乎现有的stackoverflow问题的每一个答案都说"是的,如果你要改变,你必须使用push --force".
鉴于rebase倡导者的数量和宗教信仰,我不得不相信使用'push -force'并不是rebase流的固有部分,如果经常不得不强迫他们推动,他们就会做错事.
push --force是一件坏事.
所以这是我的流程. 在没有武力的情况下,我能以何种方式获得相同的结果?
简单的例子
两个分支:
我有一些补丁提交和一些提交下一个版本.

我想将这些补丁合并到我的主人中,以便他们在下一个版本中不会丢失.启蒙前我简单地说:
git checkout master
git merge v1.0
Run Code Online (Sandbox Code Playgroud)
但现在我正在努力
git checkout master
git rebase v1.0
Run Code Online (Sandbox Code Playgroud)
所以现在我在这里:

的时间:
git push
Run Code Online (Sandbox Code Playgroud)
没有骰子.
假设origin/master已经提交A--B--C并且我local/master已经提交了A--B--D.
如果我使用会发生什么git pull --rebase?
如果我使用会发生什么git pull --ff-only?
生成的提交树有什么不同吗?
我的Git历史看起来像这样:

我想把紫色的提交压成一个.我不希望在我的提交日志中再次看到它们.
我试过做了git rebase -i 1,但即使1是在蓝色分支上(参见图片),我仍然看到我的紫色分支上的每个提交.
如何完全删除紫色分支(来自提交日志)?
我有以下情况:
clone从主存储库(X)创建了一个(Y),因为有许多人在Y上工作,我们没有做任何事情rebase,只有merges.当我们想要将(push)Y 传递给X时,我们想做一rebase件事,以便让事情变得干净整洁问题在于,当rebase我们被要求进行我们在之前merge步骤中已经完成的所有合并时.有没有解决方案,除了意味着重新进行合并的那个?
我预计它会非常简单,因为我们已经解决了冲突的合并.
扯淡!大约一个星期前,我在尝试清理我的存储库时,正在重新设置一些提交,显然我实际上没有完成它.今天,一个星期和几个提交之后,我从今天开始重新订购一些提交,它告诉我,我已经处于变革的中间.
这应该是复制我的回购以防万一的提示.但我没有...而是我git rebase --abort当时听起来正确.嗯,那不对.它从一周前中止了反转,并将主人的HEAD重置为旧的.假!
我还有其他几个相当近的分支,我已经多次推到远程,但最近的变化似乎永远消失了.我没有适当级别的git-fu知道是否有任何方法可以恢复我的更改.
我搞砸了吗?
编辑 - 哇!多谢你们!git reflog太棒了!我已经完全恢复了......经验教训.标记Tchalvak的答案被接受为第一个发布.
当我开始时git rebase -i,我可以发出像git rebase --continue或的命令git rebase --abort.这些命令仅在rebase正在进行时才有效.
我如何知道是否有正在进行的改造?
(我非常感谢关于rebase如何在内部工作的一些细节; git对一个repo做了什么,使它具有"rebase in progress"状态,?)
git ×10
git-rebase ×10
rebase ×3
git-reset ×2
branch ×1
git-merge ×1
git-pull ×1
git-revert ×1
github ×1
merge ×1