使用 GIT,如何有选择地将一个提交的更改合并到另一个“分叉”上?
题
以这个场景为例:
- 我决定在 github.com 上“分叉”一个代码库,并开始执行我的日常工作:编辑-提交-推送;又名黑客黑客黑客。
- 在我做了一些更改之后,我看到其他人对同一个项目做了一些更改,我喜欢它们!
- 我决定将它们合并到我的中。问题是,我只想要他所做的多次提交中的一个特定提交的“一部分”。
将这些选定数量的更改合并到我的“分叉”中的最有效方法是什么?
解决方案
在IRC世界里掀起了波澜之后,有人给出了一个很好的解决方案:
git cherry-pick SHA1 --no-commit
git add --patch
希望这可以帮助其他有同样问题的人!
编辑:好吧,也许事情没那么简单。以下是完整步骤:
首先,您必须在存储库中执行必要的操作
cd
-ing 进入您的工作目录。您现在需要添加远程分支,然后获取它。通过以下方式执行此操作:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
您现在可以运行以下命令
git log someUser/master
找到您想要“部分”合并的提交 SHA1。获得 SHA 后,您现在可以运行:
git cherry-pick -n SHA1
在哪里
SHA1
是提交 SHA,呃!很可能会出现冲突,具体取决于提交的时间以及项目特定区域更改的频率。抱歉,您必须通过值得信赖的编辑器手动解决这些问题。因此,拿出 VIM 或任何其他你使用的东西,并解决冲突,直到你到达你喜欢的改变的阶段。
您现在必须将索引重置为 HEAD 修订版,然后您就可以使用可信的 GIT
add --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
也是另一种选择。
其他提示
我不清楚你想要什么。如果您只想从其他分支中引入某些提交,可以使用 git cherry-pick SHA
。有关 gitready 的完整说明。
我真的很喜欢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 SHA1
git checkout HEAD file1 file2 ... fileN
当然,如果你在一个文件中有几个修改过的部分并且只想保留其中的一部分,你别无选择,只能手动编辑文件,切断它们的变化。