采取这种情况:
- 我决定在github.com上“分叉”代码库,并开始执行我的例程:编辑-提交-推送;aka hack hack hack。
- 进行一些更改之后,我看到另一个人对同一项目进行了更改,我喜欢它们!
- 我决定将它们合并到我的。问题是,我只想要一个特定提交中的“一部分”,他已经做出了几次提交。
将这些选定数量的更改合并到我的“叉子”中,最有效的方法是什么?
Answers:
经过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在哪里,du!
根据提交的年龄以及项目的特定区域更改的频率,很可能会发生冲突。抱歉,但是您必须使用可信赖的编辑器手动解决这些问题。因此,请拔出VIM或您使用的任何其他工具,然后摆脱冲突,直到达到您喜欢更改的阶段。
现在,您必须将索引重置为HEAD版本,然后可以使用trusty 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
也是另一种选择。
git add -p
; 它非常强大。如果您已经有问题的提交(例如,没有--no-commit
在Cherry-pick上使用过,或者这是您的提交之一),则可以使用git reset HEAD^
将索引回退到一个提交中,然后使用再次添加更改git add -p
,并逐步执行。如果提交不在分支提示中,则可以使用git rebase -i
并选择编辑有问题的提交。
-n
在步骤4中发出。像这样:git cherry-pick SHA1
git remote add <user> <fork-url>
-那么您可以git cherry-pick
照常进行。
我不清楚你想要什么。如果您只想从其他分支引入某些提交,则可以使用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不会自动为您添加合并消息。