【问题标题】:Git branch from a prev commit and pull changes from masterGit 从先前的提交分支并从 master 拉取更改
【发布时间】:2015-01-20 23:06:41
【问题描述】:

假设我做了以下提交。 所有提交都在同一个分支中。在 Commit 3 中,我删除了 C,现在我需要将 C 添加回当前

Commit 1: A,
Commit 2: A, C 
Commit 3: A, 
.
.
.
Master (current) : A, B, D

现在,我想用 A、B、C 和 D 创建一个分支。 这是我尝试过的。

  1. 在提交 2 处创建本地和远程分支

    git checkout branch mybranch hashtag-of-commit2

  2. 从 origin/master(当前)拉取更改以添加 B 和 D

    git checkout mybranch

    git 获取来源

    git 合并源/master

这样做,它删除C并添加B和D。最终结果是A,B,D。我想要的是A,B,C和D。我该怎么做?

【问题讨论】:

  • 也许只是你的符号不合常规,但你是想说提交 1、2 和 3 都包含更改 A?为什么要创建一个有 4 个更改的分支完全涉及远程仓库?
  • 请注意,您不会“从 master 拉取更改”。您从远程提取更改(例如origin)。可以说你从原点获取它们,并将它们合并到主控中。清理术语真的会帮助我们帮助您。
  • 感谢您的 cmets。我想做的是创建一个带有更改 A、B、C 和 D 的分支。
  • 我很感激,但我不太确定你现在有什么。 (例如)提交 1、2 和 3 是否在同一个分支中?还是不同的分支?当您说“更改”时,您的意思是“更改集”吗?如果是这样,在提交 2 之后变更集 C 如何消失?尝试创建一个类似于 git rebase 上的文档的图表。
  • 所有提交都在同一个分支(master)中。在提交 3 时,我删除了 C。现在我需要重新添加 C,

标签: git merge branch


【解决方案1】:

整个git revert 也会恢复对Commit3 中引入的A 的更改,所以这不是您想要的。

要将文件C 还原为Commit2 中的文件,您只有一个选择:

1。简单显示C的状态

git show 显示某个版本中文件的内容。所以

git show Commit2:C > /path/to/C  

将打印文件C 的内容并将其存储在/path/to/C 中。我们仍然需要将它再次添加到索引中:

git add /path/to/C && git commit -m "restoring C"

2。部分还原提交

我们知道CCommit3 中以我们不希望的方式进行了更改。要从Commit3C 中引入的更改创建补丁(即删除),我们可以使用git diff

git diff Commit3~..Commit3 -- /original/path/to/C > c-changes.patch  

现在,c-changes.diff 保留了引入的更改。现在,我们apply this patch in reverse order 和恢复C

git apply --reverse c-changes.patch  

C已恢复,重新加入索引:

git add /path/to/C && git commit -m "restoring C"

3。删除删除

当您使用前一个选项时,Commit3 仍会删除 C,并且您有一个额外的提交来恢复 C。如果自Commit3 之后您还没有推送任何内容,我们可以编辑Commit3,使其不再删除C。首先,按照选项 2 中的说明创建补丁。然后,调用交互式 git rebase

git rebase -i Commit2

这将在您的$EDITOR 中打开一个对话框。你会看到Commit3。选择edit 提交,保存文件并关闭文件。然后,变基将开始,并在应用Commit3 后立即停止。现在拿起你的补丁并以相反的顺序应用它:

git apply --reverse c-changes.patch

补丁已经应用,现在我们修改最后一次提交并从历史记录中删除C的删除:

git add /path/to/C && git commit --amend -C HEAD && git rebase --continue  

在此之后继续进行变基,一旦完成,您将拥有一个全新的历史,C 从未消失过。

【讨论】:

    【解决方案2】:

    这就是我认为问题的意思,在更传统的布局中,将字母更改为数字,将数字更改为字母。

    日志(单分支)是这样的

    ---A---B---C---D--- .... ---- HEAD master
           +x  -x
    

    提交 B 添加 x 并且提交 C 恢复该更改。 OP 想重新添加x

    假设您处于 master 状态(即,已经有提交 D .. master 引入的更改),初步看来 git revert sha-1-of-C 应该这样做,即您正在恢复恢复原始更改的提交。

    我看不出这与远程分支有什么关系。

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 2011-02-03
      • 2016-03-01
      • 2012-07-03
      • 1970-01-01
      • 2013-06-28
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多