2016-03-29 28 views
0

我最近就遇到了这个Web项目:git可以提示我为rebase上的每个文件吗?

git branch new-feature 
git checkout new-feature 

砍砍砍......

“博斯曼:哎,有一个在主人需要修复bug,弹指一挥间”

git commit -a -m "Partially completed migration changes" 
git checkout master 
git branch bugfix 
git checkout bugfix 

砍砍砍...... 测试测试测试...

“OK,固定的!”

git checkout master 
git merge bugfix 

走上完成的功能,但我们不要再介绍的bug ......

git checkout new-feature 
git rebase master 

First, rewinding head to replay your work on top of it... 
Applying: some commit info 
Using index info to reconstruct a base tree... 
... 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file2 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file3 
... 

如果我碰巧知道特定文件是无关的新功能,我该怎么办交互强制文件从rebase源复制?

有没有办法告诉git提示我的东西,如:

copy /some/buggy/file master? y/n 
copy /some/buggy/file2 master? y/n 
... 

回答

1

再次基于由重复git cherry-pick操作(或一个单一的EN-集体挑在某些情况下,但是这相当于同样的事情):它将基于您的重设规范(基本上为<upstream>..HEAD)所选的所有提交并将这些提交复制到新提交,其中--onto参数(缺省为<upstream>参数的提示)上生成的新链。

做的樱桃采摘需要的角度小的变化:通过提交-ID的它保存从<upstream>..HEAD离开较早之前就变基通过检查在--onto点匿名(分离的HEAD)的分支开始,然后遍历脱离HEAD。这是挑选合并冲突的挑选步骤(这就是为什么您经常需要反复解决合并冲突的原因,每次提交都会被挑选出来)。

这意味着要回答您的问题,除git rebase文档外,我们可能还想查看the git cherry-pick documentation。在那里,我们发现:

当不明显如何应用的改变,会发生以下情况:

  1. 在最后的当前分支和HEAD指针停留提交成功进行。

  2. CHERRY_PICK_HEAD ref被设置为指向引入难以应用的更改的提交。

这意味着,在这种状态下,我们可以使用git checkout HEAD -- path/to/file(该--实际上并不在这里必需的,但a good habit)或git checkout CHERRY_PICK_HEAD -- path/to/file

因为我们现在挑肥拣瘦,不重订(仍在继续的底垫,我们只是在这一点上,摘樱桃阶段),HEAD指最近成功提交。如果冲突发生在第一次提交时,HEAD引用与您的具体示例中的master相同的提交,而CHERRY_PICK_HEAD引用从原始new-feature分支复制的提交。如果冲突进一步发展,HEAD指的是在未来的匿名分支上增加的一个新提交(再次使用您的示例)master。在这两种情况下,这是你真正想要的。

(附注:如果你知道你没有触及该文件,这将是相同的,在这种情况下,无论是CHERRY_PICK_HEAD提交master提交,这样你就可以使用git checkout master -- path/to/file相反,但是,这是假设您正在使用master的顶端,而使用名称CHERRY_PICK_HEAD可以使其与目标提交无关。)

一旦樱桃采摘阶段完成,git rebase需要然后通过更改重新设计的分支名称来完成重新分配,在这种情况下,指向新匿名分支上的最小部分提交(此例中为new-feature)。在所有这些樱桃采摘之前,旧的(预先转发)分支小费仍然在new-feature(如[email protected]{1}或其他任何命名方式)的推荐日志中。它也可在ORIG_HEAD这一点,直到你运行的东西,覆盖ORIG_HEAD(各种git命令,包括git am,git mergegit reset,也写ORIG_HEAD)。如果你不小心加入了rebase,这个特别方便。

相关问题