使用GIT,我怎样才能有select地从别人的“fork”中取出/合并更改?
采取这种情况:
- 我决定在github.com上“分叉”一个代码库,并开始做我的例程:Edit – Commit – Push; 又名黑客黑客入侵。
- 在我做了一些改动之后,我看到另一个人在同一个项目上做了一些改变,我喜欢他们!
- 我决定我想把它们合并到我的。 问题是,我只想要一个特定的提交的“部分”,他提出了几个提交。
什么是最有效的方法来获得这些select的变化量,合并到我的“叉”?
在经历了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
命令来select并select所需的更改: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的解决scheme,但是有时候我喜欢在vimdiff中修改。 我对这个问题的解决scheme很粗糙,但对我来说,因为我喜欢vim。
我有vimdiff设置为我的difftool,然后有select地合并我比较分支:
git difftool <branch> <file>
然后我转到当前分支版本的窗格并在vim中编辑原始文件(有时这不是必需的,但有时vimdiff会在/ tmp中打开一个版本)并禁用只读模式:
:e <file> :set readonly!
现在,我可以使用vim的补丁工具(如do
和dp
来do
我想要的操作,并随时进行其他小小的编辑。 当我完成后,我保存文件,退出vim,然后阶段和提交文件在git像一个常规的编辑。
正如我所说,这不是特别复杂,但它是非常强大的,仍然纯粹在命令行。 只要确保添加一个清晰的提交消息,因为git不会自动为您包含合并消息。
vimdiff示例http://j.mp/1dZVllt
如果你只想提交一个提交的端口,你可能是最好的select你想要的提交和重置你不想触及的文件。
git cherry-pick SHA1 git checkout HEAD file1 file2 ... fileN
当然,如果你在一个文件中有多个修改的部分,只想保留其中的一部分,你别无select,只能手动编辑文件,删除它们的变化。