0

我有一堆文件,我在我的本地都在一个名为“test”的分支中进行了更改。我想选择特定文件,然后将它们移动到新分支并将它们远程提交到该新分支。

我的老板建议我运行git commit -p,然后检查我想要保留的内容,并以某种方式将其添加到新分支并推送它。我正在努力弄清楚如何做到这一点。

4

4 回答 4

3

首先切换到新分支:

git checkout -b mynewbranch

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

git add -u
git commit

最后将您的新分支推送到您的远程:

git push origin mynewbranch 
于 2013-01-22T14:48:53.757 回答
2

老板推荐的方法只有在新分支的更改和旧分支的更改(或被丢弃,或其他)混合在同一文件中时才有意义。

假设是这种情况:

  1. 在不更改工作副本的情况下创建并切换到新分支:

    git checkout -b mynewbranch
    

    但不要删除任何东西——在这个阶段这可能会造成损失

  2. 添加现在应该只存在于新分支上的任何新(未跟踪)文件

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

    git add --patch
    

    或者

    git add --interactive
    

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

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

    git status
    git diff --cached
    git commit
    

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

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

    git checkout master
    
于 2013-01-22T15:00:10.887 回答
0

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

直接方法

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

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

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

忍者招式

您可以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

Slick,保留您的历史记录,但仅在选定修订期间未触及其他文件时才保存。

老套

使用补丁!

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% 满足您的需求,您可以结合各种方法来实现您的需求。

于 2013-01-22T15:18:17.737 回答
-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
    最后一行创建了一个新的补丁文件并记录了新文件中的所有更改。

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

为了优雅:命名补丁文件../made_some_changes.patch将在您的存储库之外创建文件。所以命令是

git format-patch master --stdout > ../made_some_changes.patch
于 2013-03-08T16:43:56.077 回答