如何根据另一个分支创建一个分支?

时间:2015-05-13 09:19:54

标签: git git-branch git-rebase

我在我的仓库上执行了某些操作。 (这实际上是尝试将svn分支与git同步,但是为了这个问题,我们假装它们是未知的 - 只是尽量保持最小化,正如SO指导所建议的那样)。在那之后,我最终得到了一个不基于任何东西的分支broken_branch。只有一次没有任何父母的提交。

$ git lg
* 5757abc - (HEAD, origin/branches/broken_branch, broken_branch) ~ Some broken branch commit message (58 minutes ago) <AuthorName>

但是,我知道这个提交应该基于其他带有哈希的提交,比如来自abc1234分支的master。所以,我尝试做一个合乎逻辑的事情,改变:

$ git rebase abc1234
First, rewinding head to replay your work on top of it...
Applying: ~ Some broken branch commit message
Using index info to reconstruct a base tree...
<stdin>:829: trailing whitespace.
  userData:
<stdin>:839: trailing whitespace.
  userData:
<stdin>:849: trailing whitespace.
  userData:
<stdin>:859: trailing whitespace.
  userData:
<stdin>:869: trailing whitespace.
  userData:
warning: squelched 204361 whitespace errors
warning: 204366 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging Path/To/File/Class.cs
CONFLICT (add/add): Merge conflict in Path/To/File/Class.cs
Failed to merge in the changes.
Patch failed at 0001 ~ Some broken branch commit message
The copy of the patch that failed is found in:
   /Path/To/Project/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

其中Path/To/File/Class.cs是在broken_branch的单个提交中修改的文件。实际上,有20个文件被修改过,对于每一个文件我都得到了相同的信息。

(我已经替换了这个问题中的所有字符串,以免意外泄漏任何东西,但我努力使一切都保持一致)。

所以,我有这些问题:

  1. 我决定使用git rebase来解决这个问题吗?或者我应该使用别的东西吗?
  2. 为什么会出现这些错误?我很肯定broken_branch最初是在这个特定的提交中创建的(在svn中,但是让svn保持在问题的范围之外)。
  3. 我如何解决这个rebase给我想要的结果?

1 个答案:

答案 0 :(得分:0)

据我所知,你希望你的git repo看起来像这样:

    abc1234
    |
    5757abc'

其中5757abc&#39;的内容完全匹配5757abc并且是abc1234的孩子?如果是这样,那么你可以这样做:

# Create test_branch pointing to commit 5757abc
git checkout -b test_branch 5757abc

# Reset test_branch to point to abc1234, but do not change the index 
# or working copy (these still contain everything in 5757abc)
git reset --soft abc1234

# Commit your changes
git commit -m "My New Commit"

参考:https://git-scm.com/blog/2011/07/11/reset.html

这将根据需要修改git历史记录。

您还可以修改<repo>/.git/refs/remotes/origin/branches/broken_branch,以便origin/branches/broken_branch指向此新提交。

但是,我不知道git-svn在此之后是否能正常工作。在尝试此操作之前一定要备份!