我有一堆文件,我在我的本地都在一个名为“test”的分支中进行了更改。我想选择特定文件,然后将它们移动到新分支并将它们远程提交到该新分支。
我的老板建议我运行git commit -p
,然后检查我想要保留的内容,并以某种方式将其添加到新分支并推送它。我正在努力弄清楚如何做到这一点。
我有一堆文件,我在我的本地都在一个名为“test”的分支中进行了更改。我想选择特定文件,然后将它们移动到新分支并将它们远程提交到该新分支。
我的老板建议我运行git commit -p
,然后检查我想要保留的内容,并以某种方式将其添加到新分支并推送它。我正在努力弄清楚如何做到这一点。
首先切换到新分支:
git checkout -b mynewbranch
然后删除您不想在该分支中拥有的所有文件。完成此操作后,运行:
git add -u
git commit
最后将您的新分支推送到您的远程:
git push origin mynewbranch
老板推荐的方法只有在新分支的更改和旧分支的更改(或被丢弃,或其他)混合在同一文件中时才有意义。
假设是这种情况:
在不更改工作副本的情况下创建并切换到新分支:
git checkout -b mynewbranch
但不要删除任何东西——在这个阶段这可能会造成损失
添加现在应该只存在于新分支上的任何新(未跟踪)文件
git add <filenames>
添加应该在新分支上进行的任何更改
git add --patch
或者
git add --interactive
老实说,我总是发现交互需要一些练习,它不是最友好的界面。
将索引提交到您的新分支 - 您可以先查看它以确认它是否有意义
git status
git diff --cached
git commit
请注意,您选择不添加到此分支的任何更改仍将仅存在于您的工作副本中
切换回之前的分支,随身携带任何未添加、未提交的工作副本更改
git checkout master
有几种方法可以实现这一点,每种方法都有优点和缺点。
如前所述:切换到另一个分支,删除不需要的文件,提交您需要的文件。
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% 满足您的需求,您可以结合各种方法来实现您的需求。
你有没有尝试过:
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