代码之家  ›  专栏  ›  技术社区  ›  vdboor

使用Git,如何将工作副本中的一些更改提交到其他分支?

  •  3
  • vdboor  · 技术社区  · 16 年前

    master 分支机构。

    在本例中,使用 git stash 这并不是真的有帮助,因为我的工作副本有很多其他的更改,这些更改还不能与母版合并。

    6 回复  |  直到 16 年前
        1
  •  5
  •   tanascius    16 年前

    你可以用 git add -i 使用交互模式。在那里,您可以指定要提交的内容和要跳过的内容。

    通过这种方式,您可以将OneLiner作为单独的提交提交。利用 git cherry-pick 您可以稍后将它们合并到您的主控。

        2
  •  3
  •   Arkaitz Jimenez    16 年前

    使用 git add -i 要选择要提交到此分支的内容,请更改为master并提交其余内容。

    具有 add -i

        3
  •  2
  •   kEND    16 年前

    git add -p 将使您直接进入补丁模式,以遵循@arkaitz jimenez正确建议的流程。

        4
  •  1
  •   John Weldon user3678248    16 年前

    我不知道这是否是您想要的,但我只想签出另一个分支(它不会丢失未提交的更改),然后有选择地签入您想要提交的更改。

        5
  •  1
  •   vdboor    16 年前

    根据前面的建议,我提出了以下解决方案:

    只需在分支本身提交单个更改:

    git add --patch <files>      # record every change to move to master
    git commit
    

    移动到master和cherry pick

    git stash
    git checkout master
    git cherry-pick <commitid>
    

    回到分支中,可以重新设置基础。

    git checkout <branch>
    git rebase master
    

    git rebase --skip
    

    重复提交将从分支中的修补程序集中筛选出来,并且历史记录是干净的。决赛 git merge 毕竟还是可以快进的。

    git add --patch <files>      # record every change to move to master
    

    git stash --keep-index       # clear the working copy only
    git checkout master -m       # merge the index.
    git commit
    

    git checkout <branchname>
    git rebase master            # move to branch start to the tip of master.
    git stash apply              # restore working copy, auto merges the changes
    

    解决方案3,克隆当前主分支

    如果您不介意拥有多个工作副本(实际上,我总是使用SVN实现这一点),那么还有第三种解决方案:

    mkdir ../newrepos
    cd ../newrepos
    git init
    git remote add origin /path/to/your/repository
    git fetch master:remotes/origin/master  # fetch remote master to local remotes/origin/master
    git checkout -t origin/master           # make new "master" branch, link to remote, checkout.
    
    git commit
    git push origin master                  # inject the change in the original repository.
    

    git clone 始终克隆当前活动的分支。


    对于更复杂的情况,总是有一个额外的安全警卫 git diff > to-master.patch git apply to-master.patch . 这让你有更多的自由来重置一切,并重新尝试,直到你把事情做好。

    在这种情况下,我们将处理一个文件中的单行修复,该文件存在于两个分支中。这不会产生任何合并冲突,并允许一些快捷方式,如 checkout -m

        6
  •  0
  •   Jakub Narębski adamtaub    16 年前

    而不是使用 git add -i / git add -p 您还可以使用的交互式添加模式 git gui