我在本地分支上有一个庞大的git变更集。它包含文件添加,文件修改和文件删除。
如何将文件删除拆分为单独的后续变更集? (使添加和修改更容易查看。)
(如果重要的话,这是git-cinnabar,而不是简单的git。)
答案 0 :(得分:2)
假设您的所有更改目前都已取消暂停,您可以使用功能强大的ls-files
实用程序:
git ls-files --deleted | xargs git add
请注意,这假设朱砂不会屏蔽此git
功能,并且您使用的是bash
类似的shell。
答案 1 :(得分:0)
答案 2 :(得分:0)
所有这些都假定更改未提交,未分阶段,并且只是在工作树中。如果那不是具有当前状态的情况评论,我可以使用修订过程进行更新(如果需要,可以归结为回到之前的提交,取消暂停任何更改,......)。
当你说"文件删除"时,我认为这意味着你完全删除了一些文件,并希望将其与你更新的文件分开(而不是想要将删除的行与已添加/更新的行分开)单个文件)。
如果是这种情况,您可以选择add
哪些文件而不必使用git add -p
。 (-p
将您置于"补丁"交互模式"的子菜单中,您可以选择单独的行更改进行分阶段或取消分级;这可能是过度杀伤此处。)
因此,当您执行git add
时,您真正需要的是提供已删除文件的文件名。
git clone someRepo
rm file1
touch file2
vi file3
rm someDir/file4
git add file1
git add someDir/file4
git commit -mDeletions
git add .
git commit -m"Changes And Additions"
如果someDirectory
中有大量删除,并且someDirectory
中没有添加或修改,那么您可以git add someDirectory
暂存所有删除。如果这样可以捕获一两个添加内容,则可以暂存目录,然后使用git reset HEAD -- someDirectory/addedFile
取消暂停您不想要的文件。
如果文件分散在整个工作树中,并且您不想进行更改,请使用基于git status |grep deleted
的内容获取第一次提交的文件名,并将它们提供给脚本以进行分级
或者交互式添加当然可以完成这项工作
git add -i
但只要您选择文件而不是文件中的个别更改,您就不需要修补程序模式。
答案 3 :(得分:0)
您可以按如下方式撤消在分支中执行的文件删除(文件将恢复到与启动分支的提交相对应的状态):
# Set these bash variables to the correct values
upstream=master
branch=dev
git checkout "$branch"
deleted_files="$(git diff --name-only --diff-filter=D "${upstream}...$branch")"
# Split the list of deleted files into individual filenames
# It is assumed that the filenames don't contain newline characters!!!
IFS=$'\n' read -r -d '' -a deleted_files_array <<<"$deleted_files"
git reset $(git merge-base "$upstream" "$branch") -- "${deleted_files_array[@]}"
git commit -m "restored deleted files"
<强>买者强>:
如果你的文件名,上述程序将无效 已删除的文件包含换行符。