git:如何使用另一个分支的内容重置分支?

Dav*_*ull 5 git

我无法弄清楚如何将一个分支更新为与另一个分支相同。下面是一个例子:

git init test; cd test
echo apple >a; echo banana >b; git add a b; git commit -m 'A1/a:apple;b:banana'
echo carrot >c; git add c; git commit -m 'A2/c:carrot'
git checkout -b second HEAD^1
echo beets >b; echo dandelion >d; git add b d; git commit -m 'B1/b:beets;d:dandelion'
Run Code Online (Sandbox Code Playgroud)

在这一点上,我的历史看起来像这样:

A1-----A2     (master, contains a:apple, b:banana, c:carrot)
 \
  \----B1     (second, contains a:apple, b:beets, d:dandelion)
Run Code Online (Sandbox Code Playgroud)

现在我想向“第二个”分支添加一个提交,使其内容与“主”分支匹配,即:

A1-----A2
 \
  \----B1--?--B2     (desired contents a:apple, b:banana, c:carrot)
Run Code Online (Sandbox Code Playgroud)

我的问题是,我运行哪些 git 命令来执行此操作?我想出的最接近的是:

git checkout master .
git commit -m B2
Run Code Online (Sandbox Code Playgroud)

然而,虽然这将 b 重置为香蕉并恢复 c,但它不会删除文件 d。我也无法想出任何git reset我想要的变体。我不认为我想做一个版本git revert,因为在我的实际存储库中,分支上的历史记录比这个示例更复杂,并且分支可能包含合并。

任何帮助将不胜感激!

kan*_*kan 2

我假设当前分支是second. 如果您不满意git reset --HARD master(因为如果在任何地方发布,则需要强制推送second),您可以通过git revert B1(或者只是git revert master..second如果您不想列出所有提交,例如 B1)然后撤销 B1 git merge master

使用@StevenPenny 的想法和ours策略,我想出了这个解决方案:

git checkout master
git checkout -b transfer_second_to_master
git merge -s ours second
git checkout second
git merge transfer_second_to_master
git branch -d transfer_second_to_master
Run Code Online (Sandbox Code Playgroud)

这是一种theirs策略的模拟,是策略的反转ours。现在git diff master second什么也没有给出,这意味着分支是相同的。