使用GIT,我怎样才能有select地从别人的“fork”中取出/合并更改?

采取这种情况:

  1. 我决定在github.com上“分叉”一个代码库,并开始做我的例程:Edit – Commit – Push; 又名黑客黑客入侵。
  2. 在我做了一些改动之后,我看到另一个人在同一个项目上做了一些改变,我喜欢他们!
  3. 我决定我想把它们合并到我的。 问题是,我只想要一个特定的提交的“部分”,他提出了几个提交。

什么是最有效的方法来获得这些select的变化量,合并到我的“叉”?

在经历了IRC世界的浪潮之后,有人给出了一个很好的解决办法:

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

希望能帮助其他人提出相同的问题!

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

  1. 首先你必须在你的仓库中,做必要的cd -ing到你的工作目录。

  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

    其中SHA1是提交SHA,杜!

  5. 很可能会有冲突,取决于承诺的年龄,以及项目特定领域的变化频率。 对不起,但你必须用你可靠的编辑器手动解决这些问题。 因此,请拔出VIM,或者使用其他任何方法,然后彻底解决冲突,直到您进入喜欢这些更改的阶段。

  6. 您现在必须将索引重置为HEAD修订版,然后可以使用可信的GIT add --patch命令来select并select所需的更改:

    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也是另外一个选项。

我不清楚你想要什么。 如果您只想从其他叉中引入某些提交,则可以使用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的补丁工具(如dodpdo我想要的操作,并随时进行其他小小的编辑。 当我完成后,我保存文件,退出vim,然后阶段和提交文件在git像一个常规的编辑。

正如我所说,这不是特别复杂,但它是非常强大的,仍然纯粹在命令行。 只要确保添加一个清晰的提交消息,因为git不会自动为您包含合并消息。

vimdiff示例http://j.mp/1dZVllt

如果你只想提交一个提交的端口,你可能是最好的select你想要的提交和重置你不想触及的文件。

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

当然,如果你在一个文件中有多个修改的部分,只想保留其中的一部分,你别无select,只能手动编辑文件,删除它们的变化。