如何将文件删除拆分为git中的单独变更集

时间:2017-03-31 11:01:46

标签: git

我在本地分支上有一个庞大的git变更集。它包含文件添加,文件修改和文件删除。

如何将文件删除拆分为单独的后续变更集? (使添加和修改更容易查看。)

(如果重要的话,这是git-cinnabar,而不是简单的git。)

4 个答案:

答案 0 :(得分:2)

假设您的所有更改目前都已取消暂停,您可以使用功能强大的ls-files实用程序:

git ls-files --deleted | xargs git add

请注意,这假设朱砂不会屏蔽此git功能,并且您使用的是bash类似的shell。

答案 1 :(得分:0)

您需要使用部分添加

而不是简单的git add .添加-p标记,您会看到选项s将较大的更改拆分为较小的更改。

如果更改不够,您可以使用e编辑模式将其拆分更多。

enter image description here

enter image description here

答案 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"
  

<强>买者

     

如果你的文件名,上述程序将无效   已删除的文件包含换行符。