【问题标题】:Merge only the last commit from a branch into master仅将分支中的最后一次提交合并到 master
【发布时间】:2024-01-06 11:03:02
【问题描述】:

我使用以下命令创建了一个测试存储库

mkdir test-repo
cd test-repo/
git init

我在目录中创建了一个文件并提交了更改

echo 0 > file.txt
git add file.txt
git commit -m '0'

我为开发创建了一个新分支

git checkout -b A

现在在分支 A 中更改了文件,在下一行添加了 '1'

file.txt
0
1

致力于分支A

git add file.txt
git commit -m '1'

在“A”中添加了一个空的新文件 file1.txt。然后提交

git add file1.txt
git commit -m 'new file'

现在 reflog 命令显示为

76633b7 (HEAD -> A) HEAD@{0}: commit: new file
070f015 HEAD@{1}: commit: 1
dfab60f (master) HEAD@{2}: checkout: moving from master to A
dfab60f (master) HEAD@{3}: commit (initial): 0

现在我想将分支 A 合并到 master,只提交带有 '76633b7'(最后一个)的提交。我不想要主人的'commit:1'(070f015)。我怎样才能做到这一点?。 git merge A 会将所有更改提交给 master。

【问题讨论】:

  • 除了 76633b7 之外,您想要 master 中的所有内容吗?或者您只需要 76633b7 在 master 中。在第二种情况下,来自 master 的“git cherry-pick 76633b7”将起作用。
  • 是的,有效...我试过了..
  • 我也添加了第二种情况的答案。你可能想看看:)

标签: git github git-branch git-merge


【解决方案1】:

对此没有直接的解决方案。您的提交 76633b7 依赖于提交 070f015,理论上可能取决于您在那里所做的事情。

你可以做什么:

git checkout -b B master # create a new branch B from master
git cherry-pick 76633b7 # apply the commit 76633b7 and resolve conflicts if any

现在 B 分支只包含您要合并到 master 中的提交。

【讨论】:

  • @JaangoJayaraj 在这种情况下,请接受此答案,以便其他人可以看到此问题已解决。
【解决方案2】:

有两种情况。

1) 您只想将最后一次提交 (76633b7) 合并到 master。 - 在这种情况下,只需执行以下操作

 i)  git checkout master
 ii) git cherry-pick 76633b7

2) 除了倒数第二次提交之外,您想要 master 中分支 A 中的所有内容。 - 这有点棘手,你必须在这种情况下进行跟踪

 i) Change the order of last and second last commit


  git rebase -i HEAD~2

  Next, change the order of the commits in the prompt.

  pick 76633b7 
  pick 070f015

  to 

  pick 070f015
  pick 76633b7 

现在您的第二次提交在顶部,而您要合并的所有其他内容都在第二次提交之下。

ii) 现在您可以简单地使用旧的第一次提交(现在是第二次)的提交 ID 进行合并

git merge 76633b7

【讨论】:

    【解决方案3】:

    您可以将修订版本的 id 提供给 cherry-pick(如前所述),但如果您要求樱桃选择 一个分支,则只会选择最后一个修订版本,因此这将也可以工作:

    git checkout master
    git cherry-pick A
    

    【讨论】:

      最近更新 更多