使用GIT,如何有选择地合并一次提交到另一“分支”上的更改?


81

采取这种情况:

  1. 我决定在github.com上“分叉”代码库,并开始执行我的例程:编辑-提交-推送;aka hack hack hack。
  2. 进行一些更改之后,我看到另一个人对同一项目进行了更改,我喜欢它们!
  3. 我决定将它们合并到我的。问题是,我只想要一个特定提交中的“一部分”,他已经做出了几次提交。

将这些选定数量的更改合并到我的“叉子”中,最有效的方法是什么?



可能与Git
Inigo

Answers:


119

经过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在哪里,du!

  5. 根据提交的年龄以及项目的特定区域更改的频率,很可能会发生冲突。抱歉,但是您必须使用可信赖的编辑器手动解决这些问题。因此,请拔出VIM或您使用的任何其他工具,然后摆脱冲突,直到达到您喜欢更改的阶段。

  6. 现在,您必须将索引重置为HEAD版本,然后可以使用trusty GITadd --patch命令来选择所需的更改:

    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 add -p; 它非常强大。如果您已经有问题的提交(例如,没有--no-commit在Cherry-pick上使用过,或者这是您的提交之一),则可以使用git reset HEAD^将索引回退到一个提交中,然后使用再次添加更改git add -p,并逐步执行。如果提交不在分支提示中,则可以使用git rebase -i并选择编辑有问题的提交。
卡斯卡贝尔2009年

3
不错的演练。记住,如果您只想要整个提交,则只需-n在步骤4中发出。像这样:git cherry-pick SHA1
Hulvej 2014年

这里的关键是git remote add <user> <fork-url>-那么您可以git cherry-pick照常进行。
汤姆(Tom)

2

我不清楚你想要什么。如果您只想从其他分支引入某些提交,则可以使用git cherry-pick SHA。关于gitready的完整说明。


我只是在一个特定提交的“部分” /“部分” /“几行”合并到我的存储库中之后。并非特定于文件。
蒂姆(Tim)2009年

在这种情况下,可以选择git format-patch SHA,git apply <patch>
hgmnz

2

我真的很喜欢Tim的解决方案,但是有时候我喜欢修补vimdiff。我对这个问题的解决方法很粗糙,但是对我有用,因为我喜欢vim。

我将vimdiff设置为我的difftool,然后有选择地合并我diff分支:

git difftool <branch> <file>

然后,转到具有当前分支版本的窗格,然后在vim中编辑原始版本(有时这不是必需的,但有时vimdiff在/ tmp中打开一个版本)并禁用只读模式:

:e <file>
:set readonly!

现在,我可以使用vim的补丁工具(例如do和)dp来应用所需的内容,并在需要时进行其他小的编辑。完成后,保存文件,退出vim,然后像常规编辑一样在git中暂存并提交文件。

就像我说的那样,这并不是特别复杂,但是它非常强大,并且仍然纯粹在命令行中。只需确保添加清晰的提交消息即可,因为git不会自动为您添加合并消息。

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


我认为这个答案不完全值得作为一个独立的成熟答案。有用的信息,但不是特别相关。(为什么这是答案的最高点?)
Mike Kormendy 2015年

1

如果您只想要提交的端口,则最好选择想要的提交并重置您不想触摸的文件。

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

当然,如果文件中有几个修改的部分,而只想保留其中一些,则别无选择,只能手动编辑文件,以免更改。


2
这里需要结帐吗?cherry pick命令不是将更改放入您的工作目录中吗?
凯西·沃森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.