Git Patches和New Branch

时间:2013-01-22 14:44:28

标签: git

我有一堆文件,我在本地所有的一个分支中做了更改,名为“test”。我想选择特定文件,然后将它们移动到新分支并远程提交给新分支。我的老板建议我运行git commit -p然后查看我想要保留的内容并以某种方式将其添加到新分支并推送它。我正在努力弄清楚如何做到这一点。有人能帮忙吗?

谢谢你!

4 个答案:

答案 0 :(得分:3)

首先切换到新分支:

git checkout -b mynewbranch

然后删除您不想在该分支中拥有的所有文件。完成后,运行:

git add -u
git commit

最后将您的新分支推送到您的遥控器:

git push origin mynewbranch 

答案 1 :(得分:2)

如果您对新分支进行了多项更改,并且在同一文件中对旧分支(或被丢弃或其他)进行了更改,那么老板推荐的方法才有意义。< / p>

假设情况如此:

  1. 创建&amp;切换到新分支而不更改工作副本:

    git checkout -b mynewbranch
    

    但不要删除任何内容 - 在此阶段可能会有损耗

  2. 添加目前仅存在于新分支上的所有新(未跟踪)文件

    git add <filenames>
    
  3. 添加应在新分支上进行的任何更改

    git add --patch
    

    git add --interactive
    

    我总是发现 interactive 需要一些练习,说实话,它不是最友好的界面。

  4. 将索引提交到新分支 - 您可以先查看它以确认它有意义

    git status
    git diff --cached
    git commit
    

    请注意,您选择 not 添加到此分支的所有更改仍将仅存在于您的工作副本中

  5. 切换回您之前的分支机构,随身携带任何未添加的,未提交的工作副本

    git checkout master
    

答案 2 :(得分:0)

有几种方法可以实现这一目标,每种方法都有优点和缺点。

直接进场

如前所述:切换到另一个分支,删除不需要的文件,提交所需的文件。

git checkout -b mynewbranch
git add -u
git commit
git push origin mynewbranch 

快速又脏,但如果这些文件已经更改,您将丢失所有历史记录。

Ninja move

您可以stash从一个分支机构进行更改,并将其应用到另一个分支机构中。

git shash # Will put your changes into `hidden pocket`
git checkout -b mynewbranch
git stash pop # Your changes will pop out from `hidden pocket`
git commit
git push origin mynewbranch 

光滑而准确,但如果有的话,你仍然会丢失这些文件的历史记录。

捆绑方法

您可以将提交从一个分支转移到另一个分支。

git bundle file.name revision..list # Packing revisions to file
git checkout -b mynewbranch
git bundle unbundle file.name # Unpacking revision in new branch

光滑,保留您的历史记录,但仅在选定的修订版中没有触及其他文件时保存。

旧学校

使用补丁!

git format-patch revision..list # generate patch files for each revision in the list
git checkout -b mynewbranch
cat filename.patch | git am # Applying patch to the current branch

可能很复杂,无法确定需要应用哪个补丁,哪些不应该。但是你可以完全控制过程。

如果没有一个描述符合您的需求100%,您可以结合方法来实现您的需求。

答案 3 :(得分:-1)

你试过了吗?

  • 尚未提交更改
  • 签出新分支(-b创建新分支)
    git checkout -b new_branch
  • 在新分支中提交更改
    git commit -a -m "made some changes and stuff"
  • 制作补丁
    git format-patch master --stdout > made_some_changes.patch
    最后一行创建一个新的补丁文件,并记录新文件中的所有更改。

当您创建新分支并且存在未跟踪的文件和更改时,原始分支将返回到其上次提交,并且所有未跟踪的更改仅在新分支中可见,而不是旧分支。

对于suaveness:命名补丁文件../made_some_changes.patch将在您的存储库之外创建文件。所以命令就是

git format-patch master --stdout > ../made_some_changes.patch