git:如何将某位作者提交的所有提交合并到一个单独的分支中?

10
我正在使用一些没有使用源代码管理工具的代码,并以所有项目文件的形式接收偶尔的更新,尽管其中只有一些文件被稍微更改。到目前为止,我将自己的更改放在Git存储库中,并使用手动的git add -p会话解决这些“更新”,但由于我的更改数量越来越多(那些尚未确定发布的更改),这种方法变得越来越烦人。幸运的是,针对上述“补丁”,我已经使用了git commit --author "the others"命令。我想知道:

如何将一个作者提交的所有提交分离成一个新的分支?

(在这种情况下,我不介意重写历史记录,该存储库仅由我使用)

理想的解决方案应包括在每个“补丁”后将其他人的分支合并到我的分支中,但现在最终合并可能已经足够。


+ 是的,绝地武士感受到了你的不安


以下是我下周尝试回答的一些笔记:git log --reverse --pretty=format:"%H %an" HEAD | nl - Tobias Kienzler
1
一个 git rev-list 可能更适合于脚本解决方案,同时提供排序和限制选项,这将帮助您隔离正确的提交(在这里是按作者)。http://www.kernel.org/pub/software/scm/git/docs/git-rev-list.html - VonC
谢谢@VonC,我会在假期后研究一下。 - Tobias Kienzler
2个回答

7

我最近为某人完成了这个项目:

git checkout -b other_work <sha1_of_where_to_rebase>
git log --reverse --author=others --format=%H <sha1_range> | xargs -n 1 git cherry-pick

如果在范围内有任何合并操作,您可以在日志命令中添加--no-merges选项。 - Adam Dymitruk
不要在脚本中使用 git log,而应该使用 git rev-list - knittl
感谢您的提问,对于最终合并,我会在将原始分支(副本)rebase到“other_work”上之后,从<sha1_of_here_to_rebase>开始cherry-pick所有这些rebase的提交到一个新的分支中,最后再进行合并。或许在度假后我会将此扩展为一个脚本... - Tobias Kienzler
@knittl,你能否更具体地说明如何使用git rev-list复制上述内容。 - cheshirekow
2
@cheshirekow:git rev-list --reverse --author=others <start..end> | xargs -n1 git cherry-pick 可以解决问题。 - knittl
@knittl 谢谢你迎合我的懒惰。显然,我应该从文档中得到那个答案 :D - cheshirekow

2
我不是很理解你在做什么,但是你描述的关于第三方代码库的问题被称为“供应商分支”。以下是我处理它的方法:
针对第三方版本创建一个名为“vendor”的分支。我假设你的分支名称为“master”。当他们发布新版本时,您可以执行以下操作:
git stash # If you have any uncommitted files
git checkout vendor
tar -xzvf [new files]  # This might be unzip or whatever, rather than tar
git commit -am "Version xxx from upstream"  # Adjust commit message to suit
git checkout master
git merge vendor   # Bring changes into your branch (you could use rebase here if you prefer to keep all your changes on top of all their changes)
git stash pop # Restore your uncommitted files

提示:与其使用git add -p,我会使用git gui。一开始我对使用GUI持怀疑态度,但现在我无法离开git guigitk(或者在Mac上使用gitx)。


谢谢,这确实是现在的流程。出于某些我无法真正记得的原因,我曾经将其他人的更改提交到我的主分支中,所以我的问题是如何将那个单一分支追溯地拆分成一个看起来像我总是按照你描述的方式进行分支的历史记录。 - Tobias Kienzler
在我回答这个问题的时候,我没有意识到它是去年四月份写的,而不是上个月四月份 :-) - rjmunro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接