82

采取这种情况:

  1. 我决定在 github.com 上“分叉”一个代码库,然后开始我的日常工作:编辑 - 提交 - 推送;又名黑客黑客黑客。
  2. 在我做了一些改变之后,我看到另一个人在同一个项目上做了一些改变,我喜欢他们!
  3. 我决定要将它们合并到我的中。问题是,我只想要一个特定提交的“部分”,在他所做的几个提交中。

将这些选定数量的更改合并到我的“分叉”中的最有效方法是什么?

4

4 回答 4

119

在拖着 IRC 世界的波澜之后,有人给出了一个很好的解决方案:

git cherry-pick SHA1 --no-commit
git add --patch

希望这可以帮助其他有同样问题的人!

编辑:好的,也许它不是那么简单。以下是完整的步骤:

  1. 首先,您必须在您的存储库中,执行必要的操作cd以进入您的工作目录。

  2. 您现在需要添加远程分支,然后获取它。通过以下方式执行此操作:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. 您现在可以运行命令,例如git log someUser/master查找要“部分”合并的提交 SHA1。

  4. 获得 SHA 后,您现在可以运行:

    git cherry-pick -n SHA1

    提交 SHA在哪里SHA1,呃!

  5. 很可能会有冲突,这取决于提交的时间以及项目特定区域更改的频率。抱歉,您必须使用可信赖的编辑器手动解决这些问题。因此,拔出 VIM 或您使用的任何其他东西,并消除冲突,直到您到达您喜欢更改的阶段。

  6. 您现在必须将索引重置为 HEAD 修订版,然后您可以使用可靠的 GITadd --patch命令来挑选您想要的更改:

    git reset HEAD

    git add --patch或者git add -p

  7. 耶!提交时间:

    git commit -m "I merged a select amount of changes"

  8. 要清理混乱(您在 中拒绝的东西git add --patch)并仅将选定的更改保留在您的工作存储库中,请运行:

    git reset --hard HEAD

    显然git checkout -f也是另一种选择。

于 2009-09-10T13:05:46.133 回答
3

我真的很喜欢 Tim 的解决方案,但有时我喜欢修改 vimdiff。我对这个问题的解决方案很粗糙,但它对我有用,因为我喜欢 vim。

我将 vimdiff 设置为我的 difftool,然后选择性地合并我 diff 分支:

git difftool <branch> <file>

然后我转到带有当前分支版本的窗格并在 vim 中编辑原始版本(有时这不是必需的,但有时 vimdiff 会在 /tmp 中打开一个版本)并禁用只读模式:

:e <file>
:set readonly!

现在我可以使用 vim 的补丁工具,例如dodp来应用我想要的东西,并在我进行时进行其他小的编辑。完成后,我保存文件,退出 vim,然后像常规编辑一样在 git 中暂存并提交文件。

正如我所说,这并不是特别复杂,但它非常强大,并且仍然纯粹在命令行中。请务必添加明确的提交消息,因为 git 不会自动为您包含合并消息。

vimdiff 示例

于 2014-01-18T05:03:20.557 回答
2

我不清楚你想要什么。如果您只想从其他分支引入某些提交,您可以使用git cherry-pick SHA. 关于gitready的完整解释。

于 2009-09-10T12:40:31.123 回答
1

如果你只想要一个提交的端口,你可能最好选择你想要的提交并重置你不想碰的文件。

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

当然,如果您在一个文件中有几个修改过的部分,并且只想保留其中一些,您别无选择,只能手动编辑文件,删除它们的更改。

于 2009-09-10T12:38:25.357 回答