采取这种情况:
- 我决定在 github.com 上“分叉”一个代码库,然后开始我的日常工作:编辑 - 提交 - 推送;又名黑客黑客黑客。
- 在我做了一些改变之后,我看到另一个人在同一个项目上做了一些改变,我喜欢他们!
- 我决定要将它们合并到我的中。问题是,我只想要一个特定提交的“部分”,在他所做的几个提交中。
将这些选定数量的更改合并到我的“分叉”中的最有效方法是什么?
在拖着 IRC 世界的波澜之后,有人给出了一个很好的解决方案:
git cherry-pick SHA1 --no-commit
git add --patch
希望这可以帮助其他有同样问题的人!
编辑:好的,也许它不是那么简单。以下是完整的步骤:
首先,您必须在您的存储库中,执行必要的操作cd
以进入您的工作目录。
您现在需要添加远程分支,然后获取它。通过以下方式执行此操作:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
您现在可以运行命令,例如git log someUser/master
查找要“部分”合并的提交 SHA1。
获得 SHA 后,您现在可以运行:
git cherry-pick -n SHA1
提交 SHA在哪里SHA1
,呃!
很可能会有冲突,这取决于提交的时间以及项目特定区域更改的频率。抱歉,您必须使用可信赖的编辑器手动解决这些问题。因此,拔出 VIM 或您使用的任何其他东西,并消除冲突,直到您到达您喜欢更改的阶段。
您现在必须将索引重置为 HEAD 修订版,然后您可以使用可靠的 GITadd --patch
命令来挑选您想要的更改:
git reset HEAD
git add --patch
或者git add -p
耶!提交时间:
git commit -m "I merged a select amount of changes"
要清理混乱(您在 中拒绝的东西git add --patch
)并仅将选定的更改保留在您的工作存储库中,请运行:
git reset --hard HEAD
显然git checkout -f
也是另一种选择。
我真的很喜欢 Tim 的解决方案,但有时我喜欢修改 vimdiff。我对这个问题的解决方案很粗糙,但它对我有用,因为我喜欢 vim。
我将 vimdiff 设置为我的 difftool,然后选择性地合并我 diff 分支:
git difftool <branch> <file>
然后我转到带有当前分支版本的窗格并在 vim 中编辑原始版本(有时这不是必需的,但有时 vimdiff 会在 /tmp 中打开一个版本)并禁用只读模式:
:e <file>
:set readonly!
现在我可以使用 vim 的补丁工具,例如do
和dp
来应用我想要的东西,并在我进行时进行其他小的编辑。完成后,我保存文件,退出 vim,然后像常规编辑一样在 git 中暂存并提交文件。
正如我所说,这并不是特别复杂,但它非常强大,并且仍然纯粹在命令行中。请务必添加明确的提交消息,因为 git 不会自动为您包含合并消息。
我不清楚你想要什么。如果您只想从其他分支引入某些提交,您可以使用git cherry-pick SHA
. 关于gitready的完整解释。
如果你只想要一个提交的端口,你可能最好选择你想要的提交并重置你不想碰的文件。
git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN
当然,如果您在一个文件中有几个修改过的部分,并且只想保留其中一些,您别无选择,只能手动编辑文件,删除它们的更改。